| 4 | 1/1 | 返回列表 |
| 查看: 1761 | 回復(fù): 3 | ||||
新手已上路木蟲 (職業(yè)作家)
|
[交流]
25行Python代碼完成人臉識別 已有3人參與
|
|
以下是Shantnu Tiwari的客座文章,作者有著在底層編程和嵌入式領(lǐng)域十年的工作經(jīng)驗。在發(fā)現(xiàn)Python語言之前的幾年時間里,Shantnu Tiwari一直忍受著C/C++語言編程的不便,但Python使作者感到耳目一新,F(xiàn)在作者開始展現(xiàn)其對Python語言編程的熱愛。 在本文中我們將向您介紹一個異常簡單的使用Python語言和開源庫OpenCV的人臉識別方法,供此開啟人臉識別之旅。 在回復(fù)區(qū)提出任何問題之前: 1. 不要略過文章而直接去嘗試運行程序代碼。你不僅需要調(diào)通代碼,還需要在理解代碼功能的基礎(chǔ)上對代碼進行故障排解。 2. 確保你使用的是OpenCV V2版本。 3. 為了保證腳本進行正常,你需要配備一個功能正常的網(wǎng)絡(luò)攝像頭。 4. 首先瀏覽一下其他人的點評和問題,因為有可能你的問題別人已經(jīng)提出過。 多謝。 OpenCV OpenCV介紹 OpenCV是計算機視覺領(lǐng)域最受歡迎的庫。OpenCV最早是使用C/C++語言進行編寫的,現(xiàn)已支持Python語言捆綁使用。 OpenCV使用機械學(xué)習(xí)算法對圖像中的人臉進行搜索。由于有著與人臉一樣復(fù)雜的原因,不存在一項簡便的測試可以告知人們是否能夠識別出人臉。相反,算法需要對成千上萬細小的模式和特征進行匹配。面部識別算法被分解成成千上萬很小的、易理解的任務(wù),每一個任務(wù)較易實現(xiàn)。這些任務(wù)被稱為分類器。 像人臉一樣,你可能有6,000個基于更多的分類器在進行人臉檢測過程中,每一個分類器都需要進行匹配(當然要在一定的誤差范圍內(nèi))。但這其中就有問題了。在人臉識別過程中,算法從圖片的左上角開始向右下角按小塊逐步進行匹配,對每一個小塊的識別過程中,算法都會持續(xù)的問:“這是人臉么?這是人臉么?這是人臉么?”由于在每個小塊有著6000甚至更多的匹配項需要進行匹配,你可能會有無數(shù)的計算要執(zhí)行,這些計算將引發(fā)你的電腦發(fā)生死機。 為解決這個問題,OpenCV使用了級聯(lián)技術(shù)。那什么是級聯(lián)?最適當?shù)拇鸢妇驮谧值渲。級?lián)就是一個瀑布或者一系列的瀑布。 像一系列的瀑布過程一樣,OpenCV級聯(lián)將人臉檢測過程拆分成了多個過程。在每一個圖像小塊中只進行一次粗略的測試。如果測試通過,接下來進行更詳細的細節(jié)測試,依次重復(fù)。檢測算法中有30至50個這種過程或者級聯(lián),只有在所有過程成功后才會最終識別到人臉。這樣做的好處是在最初的幾個過程中大多數(shù)的圖片將會因不滿足測試而被過略掉,算法可以無需浪費時間對每一張圖像的6,000個屬性進行檢驗。人臉識別算法運行耗時由數(shù)小時級降至實時級。 級聯(lián)實現(xiàn) 理論聽起來非常復(fù)雜,但實現(xiàn)起來去非常簡單。級聯(lián)其實就是一組包含了OpenCV用于進行目標識別的數(shù)據(jù)組成的XML文件。只需使用你想用的級聯(lián)對你的代碼進行初始化操作,其余過程由級聯(lián)替你完成。 鑒于人臉識別是如此的普適,OpenCV包含了大量的用于人臉識別、眼部識別、手部及腿部識別的內(nèi)置級聯(lián)。甚至還包含了對非人物對象識別使用的級聯(lián)工具。例如,你是一個香蕉店的老板,OpenCV就有一個對消費者偷香蕉的行為追蹤的級聯(lián)。 OpenCV安裝 首先需要找到適合你電腦的安裝文件。 我發(fā)現(xiàn)安裝OpenCV才是整個過程中最難的部分。如果你最到了奇怪的無法解釋的報錯,有可能是因為庫沖突,32位和64位差異等。我總結(jié)的最簡單方法是安裝一臺Linux虛擬機然后從頭開始安裝。 一旦安裝完成,開啟一個Python會話,然后輸入以下代碼對安裝是否正常進行確認: $ python 如果沒有任何報錯,可以繼續(xù)以下步驟。 理解代碼 讓我們開始分解真實的代碼,可以從repo網(wǎng)站下載。需下載腳本face_detect.py,圖片abba.png和XML文件haar_cascade_frontalface_default.xml三個文件。 # Get user supplied values imagePath = sys.argv[1] cascPath = sys.argv[2] 首先將相片和級聯(lián)名稱傳遞給命令行的參數(shù)。我們將會使用Abba相片和由OpenCV提供的進行人臉檢測的默認級聯(lián)。 # Create the haar 級聯(lián) facecascade = cv2.cascadeClassifier(cascPath) 現(xiàn)在我們創(chuàng)建了級聯(lián),并用我們的人臉級聯(lián)初始化了它。這樣就把該級聯(lián)載入內(nèi)存并且可以使用了。記住,級聯(lián)就是一個包含了用于人臉檢測的數(shù)據(jù)的XML文件。 # Read the image image = cv2.imread(imagePath) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 下面是讀取圖片并進行灰度轉(zhuǎn)換。在進行灰度轉(zhuǎn)換過程中已經(jīng)完成了OpenCV的多個操作步驟。 # Detect faces in the image faces = facecascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags = cv2.cv.CV_HAAR_SCALE_IMAGE ) 這個函數(shù)檢測實際的人臉,因此是關(guān)鍵代碼,所以我們仔細檢查一下選項。 1. detectMultiScale function是一個檢測對象的通用函數(shù)。由于我們調(diào)用它檢測人臉,所以它就將檢測人臉。第一個選項是圖片灰度轉(zhuǎn)換的相片。 2. 第二個選項是scaleFactor。由于可能存在部分人臉距離相機相對較近,從而與較遠處的人臉相比,尺寸較大。比例因子可以進行抵消補償。 3. 檢測算法使用了一個活動窗口進行目標檢測。minNeighbors選項定義了在其聲明人臉被找到前,當前對象附件的目標數(shù)量。同時,minSize選項給出了每個窗口的大小。 在這些方面我采用了常用值。在實際中你可以對窗口尺寸、補償系數(shù)等進行調(diào)試直到找到最適合的值。 函數(shù)的返回值是一組四邊型,四邊型內(nèi)是算法檢測到的人臉。下一步,我們將對函數(shù)的這些返回值進行循環(huán)。 print "Found {0} faces!".format(len(faces)) # Draw a rectangle around the faces for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2) 這個函數(shù)返回4個值:四邊型的X軸、Y軸位置,四邊型的寬度W和高度H。 使用以上4個值調(diào)用內(nèi)置函數(shù)rectangle畫出一個四邊型。 cv2.imshow("Faces found" ,image) cv2.waitKey(0) 最后,展示這個圖片給用戶,并等待用戶的一個鍵盤輸入。 結(jié)果檢查 讓我們再對Abba圖片進行一次測試。 $ python face_detect.py abba.png haar級聯(lián)_frontalface_default.xml 25行Python代碼完成人臉識別 這個工作正常,其他圖片檢測結(jié)果如何? 25行Python代碼完成人臉識別 那個…不是人臉。讓我們再試一次。我修改了參數(shù)設(shè)置,發(fā)現(xiàn)將scaleFactor設(shè)置成1.2可以將識別錯識的人臉過濾掉。 25行Python代碼完成人臉識別 發(fā)生了什么?好吧,第一張相片使用了一個高相素相機在較近的距離進行拍攝。第二張相片貌似是使用的手機在較遠距離進行的拍攝。這就是參數(shù)scaleFactor需要修改的原因。就像我說過的,你需要根據(jù)不同測試案例對算法進行不同的參數(shù)設(shè)置從而避免誤識別的發(fā)生。 需要注意的是,由于采用了基于機械學(xué)習(xí)的算法,檢測結(jié)果永遠無法達到100%精確。大多數(shù)案例中你都能得到較好的結(jié)果,但偶爾算法也會檢測到錯誤的對象,就像檢測到錯誤的人臉一樣。 代碼在這里。 使用網(wǎng)絡(luò)攝像頭 如果你想便用攝像頭怎么辦?OpenCV從攝像頭按幀抓取圖片后你就可以按幀進行人臉檢測了。你需要一臺高性能計算機,雖然我已用了五年的筆記本可以應(yīng)付這項工作,但我也只是偶爾才測試一次。 |
人工智能資源專享 |

金蟲 (正式寫手)

| 4 | 1/1 | 返回列表 |
| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 考研求調(diào)劑 +3 | 橘頌. 2026-03-17 | 4/200 |
|
|---|---|---|---|---|
|
[考研] 344求調(diào)劑 +4 | knight344 2026-03-16 | 4/200 |
|
|
[考研] 085601求調(diào)劑 +4 | Du.11 2026-03-16 | 4/200 |
|
|
[考研] 梁成偉老師課題組歡迎你的加入 +8 | 一鴨鴨喲 2026-03-14 | 10/500 |
|
|
[考研] 08工科 320總分 求調(diào)劑 +4 | 梨花珞晚風(fēng) 2026-03-17 | 4/200 |
|
|
[考研] 285化工學(xué)碩求調(diào)劑(081700) +9 | 柴郡貓_ 2026-03-12 | 9/450 |
|
|
[考研] 283求調(diào)劑 +3 | 聽風(fēng)就是雨; 2026-03-16 | 3/150 |
|
|
[基金申請] 國自科面上基金字體 +6 | iwuli 2026-03-12 | 7/350 |
|
|
[考研] 環(huán)境工程調(diào)劑 +6 | 大可digkids 2026-03-16 | 6/300 |
|
|
[考研] 070300化學(xué)學(xué)碩求調(diào)劑 +6 | 太想進步了0608 2026-03-16 | 6/300 |
|
|
[考研] 294求調(diào)劑 +3 | Zys010410@ 2026-03-13 | 4/200 |
|
|
[考研] 材料工程327求調(diào)劑 +3 | xiaohe12w 2026-03-11 | 3/150 |
|
|
[考研] 一志愿哈工大材料324分求調(diào)劑 +5 | 閆旭東 2026-03-14 | 5/250 |
|
|
[考研] 材料工程調(diào)劑 +9 | 咪咪空空 2026-03-12 | 9/450 |
|
|
[考研] [0860]321分求調(diào)劑,ab區(qū)皆可 +4 | 寶貴熱 2026-03-13 | 4/200 |
|
|
[考研] 材料與化工085600調(diào)劑求老師收留 +9 | jiaanl 2026-03-11 | 9/450 |
|
|
[考研] 工科材料085601 279求調(diào)劑 +8 | 困于星晨 2026-03-12 | 10/500 |
|
|
[考研] 314求調(diào)劑 +7 | 無懈可擊的巨人 2026-03-12 | 7/350 |
|
|
[考研] 274求調(diào)劑 +3 | S.H1 2026-03-12 | 3/150 |
|
|
[考研] 081200-11408-276學(xué)碩求調(diào)劑 +3 | 崔wj 2026-03-12 | 4/200 |
|