基于Adaboost算法的人臉檢測分類器!
點擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達 ![]()
人臉檢測屬于計算機視覺的范疇,早期人們的主要研究方向是人臉識別,即根據(jù)人臉來識別人物的身份,后來在復(fù)雜背景下的人臉檢測需求越來越大,人臉檢測也逐漸作為一個單獨的研究方向發(fā)展起來。
基于知識的方法:主要利用先驗知識將人臉看作器官特征的組合,根據(jù)眼睛、眉毛、嘴巴、鼻子等器官的特征以及相互之間的幾何位置關(guān)系來檢測人臉。主要包括模板匹配、人臉特征、形狀與邊緣、紋理特性、顏色特征等方法。
基于統(tǒng)計的方法:將人臉看作一個整體的模式:二維像素矩陣,從統(tǒng)計的觀點通過大量人臉圖像樣本構(gòu)造人臉模式空間,根據(jù)相似度量來判斷人臉是否存在。主要包括主成分分析與特征臉、神經(jīng)網(wǎng)絡(luò)方法、支持向量機、隱馬爾可夫模型、Adaboost算法等。
本文主要基于統(tǒng)計的方法,通過Adaboost算法和Haar特征來構(gòu)建Haar分類器,對人臉和非人臉進行分類。
本文目錄
1. 算法要點
1.1. Haar分類器訓(xùn)練步驟
1.2. Haar的局限性
2. Haar原理解析
2.1. Haar特征
2.2. 積分圖構(gòu)建
2.3. 計算Haar特征值
2.4. Haar特征歸一化
2.5. 級聯(lián)分類器
3. 人臉檢測案例
3.1. 人臉檢測
3.2. 人臉檢測+人眼檢測
3.3. 調(diào)用攝像頭的動態(tài)人臉檢測
一、算法要點
1.1 Haar分類器訓(xùn)練步驟
Haar分類器=Haar特征+積分圖方法+Adaboost+級聯(lián)。
其訓(xùn)練的五大步驟:
準(zhǔn)備人臉、非人臉樣本集;
使用Haar特征做檢測;
使用積分圖(Integral Image)對Haar特征求值進行加速;
使用AdaBoost算法訓(xùn)練區(qū)分人臉和非人臉的強分類器;
使用篩選式級聯(lián)把強分類器級聯(lián)到一起,提高準(zhǔn)確率
具體步驟在第2節(jié)中會詳細介紹。
1.2 Haar的局限性
僅為人臉檢測,非人臉“辯識”,即只能框出人臉的位置,看不出人臉是誰。
僅能標(biāo)出靜態(tài)圖片和視頻幀上的人臉、人眼和微笑,不能進行“活體識別”,即不能看出這張臉是真人還是手機上的照片,如果用于人臉打卡簽到、人臉支付的話會帶來潛在的安全風(fēng)險。
僅為普通的機器學(xué)習(xí)方法,沒有用到深度學(xué)習(xí)和深層神經(jīng)網(wǎng)絡(luò)。
二、Haar原理解析
2.1 Haar特征
我們最基礎(chǔ)的卷積核(劃掉),哦不haar特征為下圖中的Basic Haar Set:

我們通常將Haar特征分為以下三類,我們根據(jù)名字就可以分辨出這三類的用途:
-
第一類是邊緣特征:
第二類是線性特征:

第三類是中心特征:

特征模板內(nèi)有白色和黑色兩種矩形,并定義該模板的特征值為白色矩形像素和減去黑色矩形像素和。Haar特征值反映了圖像的灰度變化情況。
例如:臉部的一些特征能由矩形特征簡單的描述,如:眼睛要比臉頰顏色要深,鼻梁兩側(cè)比鼻梁顏色要深,嘴巴比周圍顏色要深等。但矩形特征只對一些簡單的圖形結(jié)構(gòu),如邊緣、線段較敏感,所以只能描述特定走向(水平、垂直、對角)的結(jié)構(gòu)。由于有時候人臉未必是定向的,可能是會有歪曲的,因此我們可以訓(xùn)練旋轉(zhuǎn)一定角度的矩形特征來識別人臉。

(1)如何快速計算那么多的特征?---積分圖大顯神通;
(2)哪些矩形特征才是對分類器分類最有效的?---如通過AdaBoost算法來訓(xùn)練。
2.2 積分圖構(gòu)建
2.3.1 矩形特征

以及迭代求解式

2.3.2 旋轉(zhuǎn)矩形特征
對于旋轉(zhuǎn)矩形特征,相應(yīng)的有 °傾斜積分圖用于快速計算Haar特征值,如下圖所示,傾斜積分圖的定義為像素點左上角 °區(qū)域和左下角 °區(qū)域的像素和,公式表示如下:
其遞推公式計算如下:
也可直接通過下式遞歸計算:
如下圖所示,構(gòu)建好傾斜積分圖后,可快速計算傾斜矩形區(qū)域 的像素和值

2.3.3 舉個例子
了解了特征值的計算之后,我們來看看不同的特征值的含義是什么。我們選取MIT人臉庫中2706個大小為 的人臉正樣本圖像,計算如下圖所示的Haar特征:

左邊對應(yīng)的人眼區(qū)域,右邊無具體意義。

那么看到這里,應(yīng)該理解了下面2個問題:
在檢測窗口通過平移+縮放可以產(chǎn)生一系列Haar特征,這些特征由于位置和大小不同,分類效果也不同;
-
通過計算Haar特征的特征值,可以有將圖像矩陣映射為1維特征值,有效實現(xiàn)了降維。
2.4 Haar特征歸一化
計算檢測窗口中圖像的灰度值和灰度值平方和:
計算平均值:
計算歸一化因子:
-
歸一化特征值:之后使用歸一化的特征值 與閾值對比。
2.5 級聯(lián)
2.5.1 白話解釋

2.5.2 舉個例子

6. 一組樣本投入強分類器后,在每個漸進的階段,分類器逐漸在較少的圖像窗口上使用更多的特征(負(fù)類被丟棄)。如果某個矩形區(qū)域在所有弱分類器中都被歸結(jié)為正類,那么可以認(rèn)為該區(qū)域是存在人臉的。
其中,弱分類器訓(xùn)練的具體步驟如下:
1. 對于每個特征 ,計算所有訓(xùn)練樣本的特征值,并將其排序:
2. 掃描一遍排好序的特征值,對排好序的表中的每個元素,計算下面四個值:
計算全部正例的權(quán)重和 ;
計算全部負(fù)例的權(quán)重和 ;
計算該元素前之前的正例的權(quán)重和 ;
計算該元素前之前的負(fù)例的權(quán)重和
三、人臉檢測例子
3.1 人臉檢測


執(zhí)行以下代碼,即可獲得人臉檢測的結(jié)果:
img = cv2.imread("Pic/1.jpg")face_engine = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')faces = face_engine.detectMultiScale(img,scaleFactor=1.3,minNeighbors=5)for (x,y,w,h) in faces:img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)cv2.imshow('img',img)cv2.waitKey(0)cv2.destroyAllWindows()

我們留意到以上代碼的face_engine步驟,其作用是導(dǎo)入人臉級聯(lián)分類器引擎,'.xml'文件里包含訓(xùn)練出來的人臉特征。隨后用人臉級聯(lián)分類器引擎進行人臉識別,返回的faces為人臉坐標(biāo)列表,1.3是放大比例,5是重復(fù)識別次數(shù)。
3.2 人臉檢測和人眼檢測
我們也可以嘗試前面xml文件中的人眼檢測:
#導(dǎo)入opencvimport cv2# 導(dǎo)入人臉級聯(lián)分類器引擎,'.xml'文件里包含訓(xùn)練出來的人臉特征,cv2.data.haarcascades即為存放所有級聯(lián)分類器模型文件的目錄face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')# 導(dǎo)入人眼級聯(lián)分類器引擎嗎,'.xml'文件里包含訓(xùn)練出來的人眼特征eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_eye.xml')# 讀入一張圖片,引號里為圖片的路徑,需要你自己手動設(shè)置img = cv2.imread('image3.png')# 用人臉級聯(lián)分類器引擎進行人臉識別,返回的faces為人臉坐標(biāo)列表,1.3是放大比例,5是重復(fù)識別次數(shù)faces = face_cascade.detectMultiScale(img, 1.3, 5)# 對每一張臉,進行如下操作for (x,y,w,h) in faces:# 畫出人臉框,藍色(BGR色彩體系),畫筆寬度為2img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)# 框選出人臉區(qū)域,在人臉區(qū)域而不是全圖中進行人眼檢測,節(jié)省計算資源face_area = img[y:y+h, x:x+w]eyes = eye_cascade.detectMultiScale(face_area)# 用人眼級聯(lián)分類器引擎在人臉區(qū)域進行人眼識別,返回的eyes為眼睛坐標(biāo)列表for (ex,ey,ew,eh) in eyes:#畫出人眼框,綠色,畫筆寬度為1cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,255,0),1)# 在"img2"窗口中展示效果圖cv2.imshow('img2',img)# 監(jiān)聽鍵盤上任何按鍵,如有案件即退出并關(guān)閉窗口,并將圖片保存為output.jpgcv2.waitKey(0)cv2.destroyAllWindows()cv2.imwrite('output.jpg',img)
上面的代碼最值得注意的就是face_area = img[y:y+h, x:x+w],這一步會將人臉區(qū)域框出來,在其中執(zhí)行人眼檢測。同樣對上圖進行檢測,結(jié)果如下:

3.3 調(diào)用電腦攝像頭進行實時人臉識別和人眼識別
import cv2face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_eye.xml')# 調(diào)用攝像頭攝像頭cap = cv2.VideoCapture(0)while(True):# 獲取攝像頭拍攝到的畫面ret, frame = cap.read()faces = face_cascade.detectMultiScale(frame, 1.3, 5)img = framefor (x,y,w,h) in faces:# 畫出人臉框,藍色,畫筆寬度微img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)# 框選出人臉區(qū)域,在人臉區(qū)域而不是全圖中進行人眼檢測,節(jié)省計算資源face_area = img[y:y+h, x:x+w]eyes = eye_cascade.detectMultiScale(face_area)# 用人眼級聯(lián)分類器引擎在人臉區(qū)域進行人眼識別,返回的eyes為眼睛坐標(biāo)列表for (ex,ey,ew,eh) in eyes:#畫出人眼框,綠色,畫筆寬度為1cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,255,0),1)# 實時展示效果畫面cv2.imshow('frame2',img)# 每5毫秒監(jiān)聽一次鍵盤動作if cv2.waitKey(5) & 0xFF == ord('q'):break# 最后,關(guān)閉所有窗口cap.release()cv2.destroyAllWindows()
下載1:OpenCV-Contrib擴展模塊中文版教程
在「小白學(xué)視覺」公眾號后臺回復(fù):擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。
下載2:Python視覺實戰(zhàn)項目52講 在「小白學(xué)視覺」公眾號后臺回復(fù):Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。
下載3:OpenCV實戰(zhàn)項目20講 在「小白學(xué)視覺」公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進階。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~
