人臉檢測¶
概要¶
不知道從什么時候開始,學習OpenCV首先學習人臉檢測,變成了一個傳統。
在本節課,首先介紹一下人臉檢測在日常生活中的廣泛應用,然后講解人臉檢測與人臉識別的區別, 接下來會教大家通過OpenCV內置的人臉檢測模型,實時的在畫面中繪制人臉所在的位置。
關注微信公眾號1Z實驗室, 回復關鍵詞
人臉檢測
, 獲取文稿鏈接與實驗代碼。
keywords 人臉檢測 OpenCV
目錄¶
人臉檢測在生活中的應用¶
人臉識別在我們生活中的應用越來越廣泛。
你可以掃臉解鎖手機,掃臉支付,可以掃臉開門,人臉變成了一個人非常重要的生物信息。
所以在這期教程, 阿凱會帶大家用OpenCV實現人臉檢測。
其實這個也1Z, 在OpenCV里面對這個算法封裝的足夠友好,核心代碼不過兩行而已。
所以對初學者來講,學習人臉檢測會讓你信心滿滿。
人臉檢測與人臉識別¶
在開始講解人臉檢測之前,先幫大家解析經常被搞混的兩個概念人臉檢測 vs 人臉識別
注意??! 大家經常會搞混的概念:
分清楚這兩個概念的不同
簡單來講,他們的核心區別在于:
-
哪有臉?人臉檢測 (是在圖像中定位人臉區域的過程)
-
臉是誰?人臉識別 (分類檢測這個臉是誰)
一種是把人臉檢測獲得的人臉區域,在已知人臉庫進行比對
另外一種是針對人臉圖像特征,提取特征值。特征值數組 用來標識人臉信息。后者更實用。
從順序來講,先進行人臉檢測,然后再進行人臉識別。
那我們今天就先來講講如何使用OpenCV進行人臉檢測。
關于HaarCascade¶
OpenCV中人臉識別是通過Haar特征的級聯分類器實現,在本期教程里面,我們暫不涉及太多底層算法原理部分的講解。
實際上OpenCV里面有很多預先訓練好的HaarCascade模型(XML文件) , 例如正臉檢測, 眼睛檢測, 全身檢測,下半身檢測等。
在OpenCV的兩個代碼倉庫里面都有。
數據1: opencv/data/cascades
數據2: opencv_contrib/modules/face/data/cascades
級聯分類器的使用方法¶
通過FaceCascade模型, 輸入圖片, 我們可以獲取人臉所在區域的矩形位置。
模型的使用方法比較簡單, 首先要載入對應的HaarCascade文件, 文件格式為xml。 這里為了方便大家使用, 我已經將文件下載到了haar
文件夾下, 可以通過相對路徑進行引用。
├── FaceDetection-v1.py ├── FaceDetection-v2.py ├── face.mp4 ├── face.png ├── haar ?? ├── haarcascade_eye.xml ?? └── haarcascade_frontalface_default.xml
我們在CascadeClassifier
中傳入對應HaarCascade文件
# 載入人臉檢測的Cascade模型 FaceCascade = cv2.CascadeClassifier('./haar/haarcascade_frontalface_default.xml')
輸入 Input
接下來就是將圖片的灰度圖傳入到這個FaceCascade
模型中, 進行人臉檢測。
# 檢測畫面中的人臉 faces = FaceCascade.detectMultiScale(gray)
輸出 Output
返回的faces是人臉所在區域的ROI
數組, 例如:
[(x1, y1, w1, h1), (x2, y2, w2, h2)]
當然, 你可以設定不同的參數,例如設定縮放因子, 設置最小鄰居閾值。
# 檢測畫面中的人臉 faces = FaceCascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5 )
參數的具體含義與使用方法見OpenCV的官方API文檔 :
OpenCV官方文檔: cascadeclassifier-detectmultiscale
ROI 的全稱是Region Of Interest , 用于表示在畫面的子區域。整個畫面的原點(0,0)
, 在整個畫面中的左上角。 ROI 本質上是Tuple類型的數據,其中(x,y)
代表人臉所在矩形區域的左上角坐標, w
代表矩形的寬度, h
代表矩形的高度。
人臉檢測的效果演示¶
人臉檢測-V1¶
從圖片中讀入圖片,識別人臉,并在圖片中標識人臉所在的矩形區域。
人臉檢測-V2¶
這個是阿凱放的是人臉識別v2版的效果演示, 里面用到了兩個HaarCascade模型, 一個是識別人臉的模型, 另外一個是識別眼睛的模型。
程序流程講解¶
雖然我們是基礎入門教程,但是不會在視頻里面詳細講解各個API。
訪問 github.com/1zlab
查看1Z實驗室出品的OpenCV入門教程 , 這里為大家準備了自助餐式的教程, 查閱目錄,根據自己的需求自由學習OpenCV基礎。 例如如何配置OpenCV的開發環境, 如何使用HighGUI寫上位機,如何使用Draw模塊進行畫圖, 如何讀入視頻流, 這些都可以在文檔中找到。
雖然在python -opencv里面,只需要導入cv2
模塊,但是實際上cv2
是由若干個模塊構成的, python-opencv只不過是屏蔽掉了這些細節。
人臉識別v1的代碼里面核心三個主要模塊 HighGUI
上位機部分, Draw
繪圖模塊, CascadeClassifier
級聯分類器。的
程序大致的流程如下:
-
HighGUI
讀入圖片, 并轉換為灰度圖 -
CascadeClassifier
載入 人臉檢測的級聯模型(xml)文件 -
CascadeClassifier
使用模型檢測灰度圖中的人臉,返回faces -
Draw
遍歷faces,在彩圖上繪制人臉的矩形區域 -
HighGUI
創建一個窗口叫做Face
-
HighGUI
在窗口Face
中展示圖像(繪制人臉矩形區域后的) -
HighGUI
等待任意按鍵按下 -
HighGUI
退出程序,關閉所有的窗口
FaceDetection-v1.py
# -*- coding:utf-8 -*- ''' 人臉識別FaceDetection 通過HaarCascade模型,進行人臉識別與眼睛識別,在視頻流中繪制矩形,標識人臉 ''' import cv2 # 設置圖片路徑 img_path = 'face.png' # 載入帶有人臉的圖片 img = cv2.imread(img_path) if img is None: # 判斷圖片是否讀入正確 print("ERROR:請檢查圖片路徑") exit(1) # 將彩色圖片轉換為灰度圖 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 載入人臉檢測的Cascade模型 FaceCascade = cv2.CascadeClassifier('./haar/haarcascade_frontalface_default.xml') # 檢測畫面中的人臉 faces = FaceCascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5 ) # 遍歷返回的face數組 for face in faces: # 解析tuple類型的face位置數據 # (x, y): 左上角坐標值 # w: 人臉矩形區域的寬度 # h: 人臉矩形區域的高度 (x, y, w, h) = face # 在原彩圖上繪制矩形 cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 4) # 創建一個窗口 名字叫做Face cv2.namedWindow('Face',flags=cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO | cv2.WINDOW_GUI_EXPANDED) # 在窗口Face上面展示圖片img cv2.imshow('Face', img) # 等待任意按鍵按下 cv2.waitKey(0) # 關閉所有的窗口 cv2.destroyAllWindows()
思考題¶
看似簡單的人臉識別,在實際項目中,有很多的處理追蹤問題的算法可以講。 今天阿凱拋出的問題是:如何提高人臉識別的速度?
歡迎在視頻下方留言參與討論, 期待你可以動手改進算法, 留言里可以放你改進后代碼的github鏈接。
溫馨小提示(不要局限于這兩條)
縮小檢索范圍, 在上一幀人臉所在矩形周圍尋找。
縮放,在低分辨率下檢索,然后逐步精確位置。
人臉追蹤的項目預告¶
在一開始的課程導引中,我們也提到了, 結合機器人與計算機視覺是我們課程的一大特色。 既然我們學會了人臉檢測,那么為啥不用它來搞點事情: 我們要結合二自由度云臺實現人臉檢測與追蹤。
項目的大致思路是檢測畫面中的人臉,根據人臉偏移畫面中心的位置,調整舵機的角度。
我們下期視頻教程就帶大家完成這個項目。
推廣¶
關注微信公眾號1Z實驗室, 回復關鍵詞人臉檢測
, 獲取文稿鏈接與實驗代碼。