<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于Adaboost算法的人臉檢測分類器!

          共 21248字,需瀏覽 43分鐘

           ·

          2023-09-06 22:59

          點擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

                           
                           
                              
                              
          重磅干貨,第一時間送達 

          人臉檢測屬于計算機視覺的范疇,早期人們的主要研究方向是人臉識別,即根據(jù)人臉來識別人物的身份,后來在復(fù)雜背景下的人臉檢測需求越來越大,人臉檢測也逐漸作為一個單獨的研究方向發(fā)展起來。

          目前人臉檢測的方法主要有兩大類:基于知識和基于統(tǒng)計。
          • 基于知識的方法:主要利用先驗知識將人臉看作器官特征的組合,根據(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)練大步驟

          1. 準(zhǔn)備人臉、非人臉樣本集;

          2. 使用Haar特征做檢測;

          3. 使用積分圖(Integral Image)對Haar特征求值進行加速;

          4. 使用AdaBoost算法訓(xùn)練區(qū)分人臉和非人臉的強分類器;

          5. 使用篩選式級聯(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特征

          Haar特征包含三種:邊緣特征、線性特征、中心特征和對角線特征。每種分類器都從圖片中提取出對應(yīng)的特征。有點類似于卷積神經(jīng)網(wǎng)絡(luò)中的卷積核,每個卷積核提取出對應(yīng)的特征。

          我們最基礎(chǔ)的卷積核(劃掉),哦不haar特征為下圖中的Basic Haar Set:

          我們通常將Haar特征分為以下三類,我們根據(jù)名字就可以分辨出這三類的用途:

          • 第一類是邊緣特征:
          • 第二類是線性特征:

          • 第三類是中心特征:

          特征模板內(nèi)有白色和黑色兩種矩形,并定義該模板的特征值為白色矩形像素和減去黑色矩形像素和。Haar特征值反映了圖像的灰度變化情況。

          例如:臉部的一些特征能由矩形特征簡單的描述,如:眼睛要比臉頰顏色要深,鼻梁兩側(cè)比鼻梁顏色要深,嘴巴比周圍顏色要深等。但矩形特征只對一些簡單的圖形結(jié)構(gòu),如邊緣、線段較敏感,所以只能描述特定走向(水平、垂直、對角)的結(jié)構(gòu)。由于有時候人臉未必是定向的,可能是會有歪曲的,因此我們可以訓(xùn)練旋轉(zhuǎn)一定角度的矩形特征來識別人臉。

          總而言之,Haar特征就是利用一些固定的特征來模擬人臉中的相關(guān)特征。
          矩形特征可位于圖像任意位置,大小也可以任意改變,所以矩形特征值是矩形模版類別、矩形位置和矩形大小這三個因素的函數(shù)。故類別、大小和位置的變化,使得很小的檢測窗口含有非常多的矩形特征,如:在24*24像素大小的檢測窗口內(nèi)矩形特征數(shù)量可以達到16萬個。這樣就有兩個問題需要解決了:

          (1)如何快速計算那么多的特征?---積分圖大顯神通;

          (2)哪些矩形特征才是對分類器分類最有效的?---如通過AdaBoost算法來訓(xùn)練。

          2.2 積分圖構(gòu)建

          在一個圖像窗口中,可以提取出大量的Haar矩形特征區(qū)域,如果在計算Haar特征值時,每次都遍歷矩形特征區(qū)域,將會造成大量重復(fù)計算,嚴(yán)重浪費時間。積分圖是一種快速計算矩形特征的方法,主要思想是將圖像起始像素點到每一個像素點之間所形成的矩形區(qū)域的像素值的和,作為一個元素保存下來,即將原始圖像轉(zhuǎn)換為積分圖(或者求和圖),當(dāng)求某一矩形區(qū)域的像素和時,只需要索引矩形區(qū)域4個角點在積分圖中的取值,進行普通的加減運算,即可求得Haar特征值,整個過程只需遍歷一次圖像,計算特征的時間復(fù)雜度為常數(shù)(O(1)),可以大大提升計算效率。積分圖中元素的公式定義如下:
          上式含義是在 位置處,積分圖中元素為原圖像中對應(yīng)像素左上角所有像素值之和, 表示一個積分圖像。在具體實現(xiàn)時,可用下式進行迭代運算:
          其中 是行方向的累加和,初始值 ,但這個公式不是很好(為什么?),一個比較好的替代是下面這個公式:
          2.3 計算Haar特征值

          2.3.1 矩形特征

          構(gòu)建好積分圖后,圖像中任何矩形區(qū)域的像素值累加和都可以通過簡單的加減運算快速得到,如下圖所示,矩形區(qū)域D的像素和值計算公式如下:

          矩形區(qū)域求和示意圖 在下圖中,以水平向右為 軸正方向,垂直向下為 軸正方向,可定義積分圖公式Summed Area Table:

          以及迭代求解式

          對于左上角坐標(biāo)為 寬高為 的矩形區(qū)域 可利用積分圖 求取像素和值

          2.3.2 旋轉(zhuǎn)矩形特征

          對于旋轉(zhuǎn)矩形特征,相應(yīng)的有 °傾斜積分圖用于快速計算Haar特征值,如下圖所示,傾斜積分圖的定義為像素點左上角 °區(qū)域和左下角 °區(qū)域的像素和,公式表示如下:

          其遞推公式計算如下:

          其中

          也可直接通過下式遞歸計算:

          以上3個積分圖計算公式是等價的。

          如下圖所示,構(gòu)建好傾斜積分圖后,可快速計算傾斜矩形區(qū)域 的像素和值

          2.3.3 舉個例子 

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

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

          可以看到,圖中2個不同Haar特征在同一組樣本中具有不同的特征值分布,左邊特征計算出的特征值基本都大于0(對樣本的區(qū)分度大),而右邊特征的特征值基本均勻分布于0兩側(cè)(對樣本的區(qū)分度小)。所以,正是由于樣本中Haar特征值分布不均勻,導(dǎo)致了不同Haar特征分類效果不同。顯而易見,對正負(fù)樣本區(qū)分度越大的特征分類效果越好,即紅色曲線對應(yīng)圖中的的左邊Haar特征分類效果好于右邊Haar特征。

          那么看到這里,應(yīng)該理解了下面2個問題:

          1. 在檢測窗口通過平移+縮放可以產(chǎn)生一系列Haar特征,這些特征由于位置和大小不同,分類效果也不同;

          2. 通過計算Haar特征的特征值,可以有將圖像矩陣映射為1維特征值,有效實現(xiàn)了降維。

          2.4 Haar特征歸一化

          從上圖我們可以發(fā)現(xiàn),僅僅一個 維大小的Haar特征計算出的特征值變化范圍從 ,跨度非常大。這種跨度大的特性不利于量化評定特征值,所以需要進行“歸一化”,壓縮特征值范圍。假設(shè)當(dāng)前檢測窗口中的圖像像素為 ,當(dāng)前檢測窗口為 大小(例如上圖中為2020大小),OpenCV采用如下方式“歸一化”:
          • 計算檢測窗口中圖像的灰度值和灰度值平方和:

          • 計算平均值:

          • 計算歸一化因子:


          • 歸一化特征值:之后使用歸一化的特征值 與閾值對比。

          2.5 級聯(lián)

          2.5.1 白話解釋

          這里我們并不打算詳細闡述AdaBoost的完整工作機制以及一些更細節(jié)的部分,我們將從宏觀層面來看級聯(lián)的流程。
          基于Haar特征的cascade級聯(lián)分類器是Paul Viola和 Michael Jone在2001年的論文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一種有效的物體檢測方法。
          Cascade級聯(lián)分類器的訓(xùn)練方法:Adaboost
          級聯(lián)分類器的函數(shù)是通過大量帶人臉和不帶人臉的圖片通過機器學(xué)習(xí)得到的。對于人臉識別來說,需要幾萬個特征,通過機器學(xué)習(xí)找出人臉分類效果最好、錯誤率最小的特征。訓(xùn)練開始時,所有訓(xùn)練集中的圖片具有相同的權(quán)重,對于被分類錯誤的圖片,提升權(quán)重,重新計算出新的錯誤率和新的權(quán)重。直到錯誤率或迭代次數(shù)達到要求。這種方法叫做Adaboost,在Opencv中可以直接調(diào)用級聯(lián)分類器函數(shù)。
          將弱分類器聚合成強分類器
          最終的分類器是這些弱分類器的加權(quán)和。之所以稱之為弱分類器是因為每個分類器不能單獨分類圖片,但是將他們聚集起來就形成了強分類器。論文表明,只需要200個特征的分類器在檢測中的精確度達到了95%。最終的分類器大約有6000個特征。(將超過160000個特征減小到6000個,這是非常大的進步了)。
          級聯(lián)的含義:需過五關(guān)斬六將才能被提取出來
          事實上,一張圖片絕大部分的區(qū)域都不是人臉。如果對一張圖片的每個角落都提取6000個特征,將會浪費巨量的計算資源。
          如果能找到一個簡單的方法能夠檢測某個窗口是不是人臉區(qū)域,如果該窗口不是人臉區(qū)域,那么就只看一眼便直接跳過,也就不用進行后續(xù)處理了,這樣就能集中精力判別那些可能是人臉的區(qū)域。為此,有人引入了Cascade 分類器。它不是將6000個特征都用在一個窗口,而是將特征分為不同的階段,然后一個階段一個階段的應(yīng)用這些特征(通常情況下,前幾個階段只有很少量的特征)。如果窗口在第一個階段就檢測失敗了,那么就直接舍棄它,無需考慮剩下的特征。如果檢測通過,則考慮第二階段的特征并繼續(xù)處理。如果所有階段的都通過了,那么這個窗口就是人臉區(qū)域。作者的檢測器將6000+的特征分為了38個階段,前五個階段分別有1,10,25,25,50個特征(前文圖中提到的識別眼睛和鼻梁的兩個特征實際上是Adaboost中得到的最好的兩個特征)。根據(jù)作者所述,平均每個子窗口只需要使用6000+個特征中的10個左右。
          簡單地說,在進行人臉檢測的過程中,需要使用一個強分類器,且其由多個弱分類器組成。那么其中的每個弱分類器都只包含一個Haar特征。每個分類器都將確定一個閾值,如果某區(qū)域的處理差值小于該閾值,則被歸為負(fù)類,反之則進行下一級的弱分類,最終經(jīng)過多個弱分類器后,可完成檢測。其分類過程如下圖所示:

          2.5.2 舉個例子


          1. 首先,對于一幅圖像,它可能存在K個面部特征,假設(shè)這些面部特征可以用來區(qū)分眼睛、眉毛、鼻子、嘴等特征。
          2. 確定一些超參數(shù),如滑動窗口的大小,及窗口的移動步長。窗口從上往下,從左向右地滑動。在滑動的過程中,每次都可以計算出一個數(shù)值$K$。
          3. 滑動結(jié)束時,將得到的特征值進行排序,并選取一個最佳特征值(最優(yōu)閾值),使得在該特征值下,對于該特征而言,樣本的加權(quán)錯誤率最低。這樣就訓(xùn)練出了一個弱分類器。
          4. 因為面部特征的不同,我們將采用不同的滑動窗口進行特征提取。所以根據(jù)不同的窗口識別不同的特征,進而訓(xùn)練出了不同的弱分類器。
          5. 對于每個弱分類器都將計算它的錯誤率,選擇錯誤率最低的K個弱分類器,組合成強分類器。

          6. 一組樣本投入強分類器后,在每個漸進的階段,分類器逐漸在較少的圖像窗口上使用更多的特征(負(fù)類被丟棄)。如果某個矩形區(qū)域在所有弱分類器中都被歸結(jié)為正類,那么可以認(rèn)為該區(qū)域是存在人臉的。

          其中,弱分類器訓(xùn)練的具體步驟如下:

          1. 對于每個特征 ,計算所有訓(xùn)練樣本的特征值,并將其排序:

          2. 掃描一遍排好序的特征值,對排好序的表中的每個元素,計算下面四個值:

          • 計算全部正例的權(quán)重和

          • 計算全部負(fù)例的權(quán)重和

          • 計算該元素前之前的正例的權(quán)重和

          • 計算該元素前之前的負(fù)例的權(quán)重和

          3. 選取當(dāng)前元素的特征值 和它前面的一個特征值 之間的數(shù)作為閾值,所得到的弱分類器就在當(dāng)前元素處把樣本分開 —— 也就是說這個閾值對應(yīng)的弱分類器將當(dāng)前元素前的所有元素分為人臉(或非人臉),而把當(dāng)前元素后(含)的所有元素分為非人臉(或人臉)。該閾值的分類誤差為:
          于是,通過把這個排序表從頭到尾掃描一遍就可以為弱分類器選擇使分類誤差最小的閾值(最優(yōu)閾值),也就是選取了一個最佳弱分類器。

          三、人臉檢測例子

          3.1 人臉檢測

          在開始介紹Haar特征描述算子之前,為了便于理解,我們直接看具體怎么通過opencv調(diào)用訓(xùn)練好的haar模型,從而實現(xiàn)人臉識別。首先Mark一下一些已經(jīng)訓(xùn)練好的haar的模型,可以直接下載,里面包含了多種人類特征檢測的訓(xùn)練模型,包括臉、身體、眼睛、笑臉等,鏈接戳我。
          我們打開的github鏈接長這樣:

          我們下載其中一個作為示例(點Raw后下載網(wǎng)頁)。然后我們導(dǎo)入待識別圖:

          執(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()
          檢測結(jié)果不負(fù)眾望:

          我們留意到以上代碼的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色彩體系),畫筆寬度為2 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: #畫出人眼框,綠色,畫筆寬度為1 cv2.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 cv2
          face_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 = frame for (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: #畫出人眼框,綠色,畫筆寬度為1 cv2.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ā)送廣告,否則會請出群,謝謝理解~



          瀏覽 221
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费观看日皮视频 | 黄色美女操逼 | 欧美日韩一级免费看 | 操逼视频网 | 久久亚洲国产 |