search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

25 行 Python 代碼就能實現人臉識別?這篇文章告訴你詳情

AI 研習社按:這是篇是利用 OpenCV 進行人臉識別的技術講解。文中所涉源代碼詳見文末「閱讀原文」。

首先,在閱讀本文之前,需要注意以下幾點:

  • 建議先讀一遍本文再跑代碼——你需要理解這些代碼是幹什麼的。成功跑一遍不是目的,能夠舉一反三、在新任務上找出 bug 才是。

  • 請確保用的是 OpenCV v2

  • 你需要一個網路攝像頭

OpenCV

OpenCV 是最流行的計算機視覺庫,原本用 C 和 C++ 開發,現在也支持 Python。

它使用機器學習演算法在圖像中搜索人的面部。對於人臉這麼複雜的東西,並沒有一個簡單的檢測能對是否存在人臉下結論,而需要成千上萬的特徵匹配。演算法把人臉識別任務分解成數千個小任務,每個都不難處理。這些任務也被稱為分類器。

對於類似於人臉的對象,你或許需要不少於 6000 個分類器,每一個都需要成功匹配(當然,有容錯率),才能檢測出人臉。但這有一個問題:對於人臉識別,演算法從左上角開始計算一個個數據塊,不停問「這是張臉嗎」。每個數據塊有超過 6000 個檢測,加起來的計算量會達到數百萬級別,計算機很可能會讓你等得花兒都謝了。

OpenCV 使用 cascades 來避免這種情況。Cascade 是什麼?最佳答案已經在字典里了:一條瀑布或者連續瀑布。

好比連續瀑布,OpenCV cascade 把人臉檢測問題分解為好幾步。對於每個數據塊,它都進行一個粗略、快速的檢測。若通過,會再進行一個更仔細的檢測,以此不斷類推。該演算法有 30 到 50 個這樣的階段,或者說 cascade。只有通過全部階段,演算法才會判斷檢測到人臉。這樣做的好處是:大多數圖形都會在頭幾步就產生否定反饋,演算法因而不需要在它上面測試所有 6000 個特徵,大大節省了時間。相對於「正常流程」耗費數個小時,這可以實時實現人臉檢測。

實踐中的 Cascade

它的理論也許聽起來很複雜,實際操作起來其實是很簡單的。這些 cascades 只是一系列包含 OpenCV 數據的 XML 文件。你用想要的 cascade 初始化代碼,它自會替你做你想要的事。

由於人臉識別的普遍性,OpenCV 有一系列能檢測各種東西的內置 cascade,從眼睛到手到腿都可以檢測。甚至還有針對非人體物體的 cascade。比如說,如果你經營一家賣香蕉的水果店,想要監測偷香蕉的人,就有一個傢伙開發了一個針對這一場景的演算法

我發現,安裝 OpenCV 是最難的一個環節。如果你遇到奇怪的、無法解釋的錯誤,有可能是庫崩潰了、32 與 64 比特的兼容問題等等。個人經驗是,只用 Linux 虛擬機,從頭安裝 OpenCV 最簡單。

安裝好之後,你可以開啟一個 Python 會話,敲出下面的代碼,來測試它是否能工作:

$ python

>>> import cv2

如果沒彈出任何錯誤,你就可以到下個環節了。

理解代碼

源代碼可在資源庫下載。記得拿好 face_detect.py 文本、abba.png 圖片以及 haarcascade_frontalface_default.xml。下面,我把代碼分解開來。

# Get user supplied values

imagePath = sys.argv[1]

cascPath = sys.argv[2]

將圖片和 cascade 名字作為命令行參數傳入。我們會用 Abba 圖片和 OpenCV 提供的默認 cascade 來人臉檢測。

# Create the haar cascade

faceCascade = cv2.CascadeClassifier(cascPath)

現在,我們創建一個 cascade,並用人臉 cascade 初始化。這把人臉 cascade 導入內存,所以它隨時可以使用。記住,該 cascade 只是一個包含人臉檢測數據的 XML 文件。

# Read the image

image = cv2.imread(imagePath)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

讀取圖片把它轉化到灰度格式。

# Detect faces in the image

faces = faceCascade.detectMultiScale(

gray,

scaleFactor=1.1,

minNeighbors=5,

minSize=(30, 30),

flags = cv2.cv.CV_HAAR_SCALE_IMAGE

)

該函數做的就是檢測人臉,是代碼核心部分。所以,我們來過一遍選項。

DetectMultiScale 函數是一個檢測物體的通用函數。我們在人臉 cascade 上調用它,它檢測的就是人臉。第一個選項是灰度圖片。

第二個是 scaleFactor。有的人臉離鏡頭近,會比其他人臉更大。ScaleFactor 對此進行補償。

檢測演算法使用移動窗口來檢測物體。在系統宣布檢測到人臉之前,minNeighbors 會對當前其周圍有多少物體進行定義。MinSize 給出每個窗口的大小。

我用的是這些領域的常用值。現實中,你會拿不同的值試驗窗口尺寸、擴展因素等參數,直到找出最比較合適的那一個。

當該函數認為它找到一張人臉時,會返回一個矩形列表。下一步,我們會進行循環,直到它認為檢測出了什麼。

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)

該函數返回四個值:矩形的 x 和 y 坐標,以及它的高和寬。我們用這些值和內置的 rectangle 函數,畫出矩陣。

cv2.imshow("Faces found" ,image)

cv2.waitKey(0)

最後,我們顯示該模型,等用戶摁下按鍵。

檢驗結果

用 Abba 來檢驗。

$ python face_detect.py abba.png haarcascade_frontalface_default.xml

沒有問題,試試另一張照片。

那兩個東西不是臉,我們再試一次。我調整了參數,發現把 scaleFactor 調成 1.2 能去除錯誤檢測。

發生了什麼?第一張圖片由高清攝像機近距離拍攝,第二章拍攝距離相對更遠,而且可能是用手機拍的。這就是需要調整 scaleFactor 的原因。正如我說的,你需要按照實際場景設置演算法,避免假正例。

這裡提醒大家,由於這基於機器學習,結果永遠不會 100% 精確。大多數情況下,你會得到不錯的結果。但演算法偶爾會失誤。

最終代碼在這裡。(詳見文末「閱讀原文」)

用網路攝像頭

如果你想要用網路攝像頭呢?OpenCV 從攝像頭讀取每一幀,你可以通過處理每一幀進行人臉檢測。你需要一個性能強大的 PC,不過我的五歲大的筆記本用著還行。

關注 AI 研習社后,回復【1】獲取

【千G神經網路/AI/大數據、教程、論文!】

百度雲盤地址!

12小時零基礎入門深度學習

想要挑戰AlphaGo卻不懂深度學習?

AI慕課學院專門打造了《12小時零基礎入門深度學習》,來自fastai中文社區最活躍的四位貢獻者為你打開深度學習入門的那扇門。

採用活力十足的矽谷模式,帶你實操9個深度學習項目。

即使零編程基礎,也能在這裡找到適合你的學習路徑。

僅限50名!掃碼了解詳情!



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦