基於Boost方法的臉部偵測(1):整體思路

來源:互聯網
上載者:User

標籤:



先推薦大家看著兩篇:

[2] Viola P, Jones M J. Robust Real-Time Face Detection[J]. International Journal of Computer Vision, 2004, 57(2):137-154.
[3] http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html
[4] http://blog.csdn.net/xiaowei_cqu/article/details/7670703


二、Haar分類器的淺入淺出

之所以是淺入淺出是因為,我暫時深入不能,只是根據其他人的總結,我加以梳理歸納,用自己的理解闡述出來,難免會有錯誤,歡迎指正。

Haar分類器演算法的要點如下:

① 使用Haar-like特徵做檢測。

② 使用積分圖(Integral Image)對Haar-like特徵求值進行加速。

③ 使用AdaBoost演算法訓練區分人臉和非人臉的強分類器。

④ 使用篩選式級聯把強分類器級聯到一起,提高準確率。

2.1 Haar-like特徵你是何方神聖?

一看到Haar-like特徵這玩意兒就頭大的人舉手。好,很多人。那麼我先說下什麼是特徵,我把它放在下面的情景中來描述,假設在臉部偵測時我們需要有這麼一個子視窗在待檢測的圖片視窗中不斷的移位滑動,子視窗每到一個位置,就會計算出該地區的特徵,然後用我們訓練好的級聯分類器對該特徵進行篩選,一旦該特徵通過了所有強分類器的篩選,則判定該地區為人臉。

那麼這個特徵如何表示呢?好了,這就是大牛們乾的好事了。後人稱這他們搞出來的這些東西叫Haar-Like特徵。

下面是Viola牛們提出的Haar-like特徵。

 

下面是Lienhart等牛們提出的Haar-like特徵。

 

 

 

這些所謂的特徵不就是一堆堆帶條紋的矩形麼,到底是幹什麼用的?我這樣給出解釋,將上面的任意一個矩形放到人臉地區上,然後,將白色地區的像素和減去黑色地區的像素和,得到的值我們暫且稱之為人臉特徵值,如果你把這個矩形放到一個非人臉地區,那麼計算出的特徵值應該和人臉特徵值是不一樣的,而且越不一樣越好,所以這些方塊的目的就是把人臉特徵量化,以區分人臉和非人臉。

為了增加區分度,可以對多個矩形特徵計算得到一個區分度更大的特徵值,那麼什麼樣的矩形特徵怎麼樣的組合到一塊可以更好的區分出人臉和非人臉呢,這就是AdaBoost演算法要做的事了。這裡我們先放下積分圖這個概念不管,為了讓我們的思路連貫,我直接開始介紹AdaBoost演算法。








【影像處理】利用積分映像法快速計算Haar特徵

由於Haar特徵是矩形中黑色地區所有像素值的和減去白色地區所有像素值的和。在之前(《計算Haar特徵個數》)我們看到,24*24的圖片中,有115984個特徵,遠遠大於其像素個數。如果計算每個特徵的像素和,計算量會非常大,而且很多次運算是重複的。

Paul Viola提出一種利用積分映像法快速計算Haar特徵的方法(《Rapid object detection using a boosted cascade of simple features》)。簡單說來,就是先構造一張“積分圖”(Integral image),也叫Summed Area Table,之後任何一個Haar矩形特徵都可以通過查表的方法(Look Up Table)和有限次簡單運算得到,大大減少了運算次數。

將矩形表示為:

其中,x,y表示起點座標,w,h表示寬,高,a表示角度。

矩形內像素值之和表示為:

0°矩形特徵
構造積分映像Summed Area Table
積分映像中,每個點儲存是其左上方所有像素之和:

其中I(x,y)表示映像(x,y)位置的像素值。積分映像可以採用增量的方式計算:

初始邊界:SAT(-1,y)=SAT(x,-1)=SAT(-1,-1)=0
所以,只需要對整張映像遍曆一次就可以求得這張圖的積分映像。

計算Haar矩形特徵

:


利用積分圖計算可計算矩形地區內像素和:



所以,無論矩形r的尺寸大小,只需尋找積分映像4次就可以求得任意矩形內像素值的和。


45°Rotated矩形特徵


構造旋轉積分映像Rotated SummedArea Table

 

旋轉積分圖中,每個點儲存是其左上方延伸出的45°地區範圍內所有像素之和:


RSAT(x,y)也採用增量方計算得到:


初始邊界:RSAT(-1,y)=RSAT(x,-1)=RSAT(x,-2)=0
          RSAT(-1,-1)=RSAT(-1,-2)=0

公式具體示意如:



計算Haar矩形特徵

同樣的方式,可推出每個矩形內像素和的計算公式:

*圖太難畫了,不清楚的自己在草稿紙上試試吧~

同樣的,無論旋轉矩形r的尺寸大小,只需要尋找積分映像4次就可以求得任意矩形內像素值得和。



(轉載請註明作者和出處:http://blog.csdn.net/xiaowei_cqu 未經允許請勿用於商業用途)












基於Boost方法的臉部偵測報告
摘要 1
一、資料及工具說明 1
二、實驗方法 2
2.1、提取訓練樣本 2
2.2、提取測試樣本 2
2.3、提取特徵和特徵值 2
2.4、訓練弱分類器 2
2.5、訓練強分類器 3
2.6、進行臉部偵測 3
三、結果分析 4
四、結論與討論 5
五、參考文獻 5


摘要:臉部偵測是影像處理領域最基本的任務之一。在學術界和工業界,關於臉部偵測的研究非常多,而且技術非常成熟。本次實驗採用基於Boost的方法,通過提取映像的haar特徵,對每一個特徵構建一個弱分類器,然後組成強分類器,最後通過組合多個分類器的效果,實現臉部偵測。該方法在訓練集上的準確度能夠達到80%左右,通過對FDDB資料庫中的2002年07月份的80個映像進行測試,發現多數正面的人臉都能夠識別出來,準確率大概能達到63.04%,召回率大概在72.5%。


一、資料及工具說明
資料:本次實驗採用FDDB的資料集,其中訓練集從“FDDB-fold-01-ellipseList.txt”和“FDDB-fold-02-ellipseList.txt”中切割而成,測試集通過合并2002年07月份的80個映像構成。
外部庫:本次實驗主要採用c++和python兩種語言相結合的方式實現,使用到的外部庫包括,影像處理庫opencv;資料預先處理庫pandas;科學計算庫numpy。
二、實驗方法
2.1、提取訓練樣本
主要檔案參考“exampleGeneration.cpp”,大概思路是:
1、從FDDB的資料集的“FDDB-fold-01-ellipseList.txt”和“FDDB-fold-02-ellipseList.txt”中提取正樣本,根據指示的橢圓人臉位置,換算成正方形人臉位置(方法是,橢圓長軸加橢圓短軸的和處以2,作為正方形邊長),然後resize到25*25的大小,同時轉換成灰階圖儲存(還有一些小細節這裡省略,詳細看代碼)。
2、在同樣的資料來源上提取負樣本,方法是,沿著每個圖片的邊緣隨機切25*25的圖片,這裡面會有少量的人臉部分,不過不影響。
2.2、提取測試樣本
測試集通過合并2002年07月份的80個映像構成,這裡需要注意,要把07/19/big下面的檔案移動到ImgTest_2002_07檔案夾下,只要一層檔案夾。
2.3、提取特徵和特徵值
主要檔案參考“featureGeneration.cpp”,大概思路是:
1、產生特徵:通過人為指定(x,y,w,h)值,產生所需要的特徵,具體特徵採用了haar特徵中的三層結構。這裡需要注意,之所以認為指定,是因為這樣能夠考慮到大多數位置,而隨機篩選位置可能產生重複的特徵,所以最終選擇人為指定的方式。
2、計算每個樣本的積分圖:積分圖能夠加快特徵值的計算,而不用每計算一個特徵值就掃描一次圖片。
3、計算特徵值:採用了haar特徵中的三層結構,這裡採用上面加下面減中間的方式計算特徵值。
2.4、訓練弱分類器
主要檔案參考“AdaBoost.py”,注意,這裡採用python去實現的,大概思路是:對每一個特徵,產生一個弱分類器。具體的,對於每一個特徵的每一個取值,計算以該取值為閾值正負樣本的分類正確性(這裡需要考慮兩個方向,大於該閾值和小於該閾值,從兩者中取最大的正確率最為標準),然後再將所有取值中,正確性最大的那個值作為分類的閾值標準,同時記錄方向。所以,一個弱分類器的結構大概是【threshold, errorNum, 0 or 1(flag)】。
2.5、訓練強分類器
主要參考檔案“AdaBoost.py”下面的“MyAdaBoost(data, WeakClfInfo)”函數。大概和AdaBoost完全一樣:
1、初始化每個樣本的權重為1/N。
2、對每一個弱分類器:
a)在所有樣本上計算加權分類錯誤率:delta=errorWeight/totalWeight
b)將加權分類錯誤率轉變成delta=math.sqrt((1-delta)/delta)
c)根據delta更新每個樣本的權重
i.正確樣本:dataWeight[i]/=delta
ii.錯誤樣本:dataWeight[i]*=delta
d)更新每個弱分類器的權重:WeakClfInfo[j][4]=math.log(delta)
3、返回組合後的強分類器。
2.6、進行臉部偵測
主要參考檔案“myFaceDetection.cpp”,大概思路是:
1、載入訓練好的分類器。
2、載入所要檢測的圖片。
3、對每個要檢測的圖片:
a)首先提取該圖片的積分圖
b)然後指定一個檢測起始點(x,y)、檢測視窗大小(w,h)、視窗滑動步長step
c)將圖片依次應用到訓練好的分類器上檢測當前視窗是不是人臉:
d)如果有一個分類器說不是,那就拒絕該視窗;否則人為該該視窗中的圖片是人臉,畫出相應的人臉儲存圖片即可


三、結果分析
strClfNum=2:
weakClfNum=40 ==> 0.798351648352, sum(preds)=743
weakClfNum=30 ==> 0.793406593407, sum(preds)=746
weakClfNum=20 ==> 0.800549450549, sum(preds)=811
strClfNum=1:
weakClfNum=60 ==> 0.806593406593, sum(preds)=830******
weakClfNum=50 ==> 0.80989010989, sum(preds)=844******
weakClfNum=40 ==> 0.814285714286, sum(preds)=784******
weakClfNum=30 ==> 0.817582417582, sum(preds)=832******randomStrClf-1-30
weakClfNum=30 -2 ==> 0.814835164835, sum(preds)=869******randomStrClf-1-30-2
weakClfNum=20 ==> 0.812087912088, sum(preds)=850******
weakClfNum=10 ==> 0.814285714286, sum(preds)=856******randomStrClf-1-10
weakClfNum=10 ==> 0.814835164835, sum(preds)=891******randomStrClf-1-10-2
strClfNum=1, weakClfNum=170 ==> 0.817032967033, sum(preds)=869******
strClfNum=1, weakClfNum=180 ==> 0.815934065934, sum(preds)=863******
strClfNum=1, weakClfNum=190 ==> 0.817032967033, sum(preds)=865******
strClfNum=1, weakClfNum=200 ==> 0.813736263736, sum(preds)=861******
strClfNum=1, weakClfNum=210 ==> 0.815384615385, sum(preds)=842******
strClfNum=1, weakClfNum=220 ==> 0.813186813187, sum(preds)=814******


上面是部分在訓練集上的準確度,可以看到基本上可以達到80%左右。
在測試集的結果參考“ResultImgMyFD/*”,這裡舉幾個典型的例子:
  
我們發現:多數正面的人臉都能夠識別出來;通過人工計算(對,我是一個一個數的,不過只有80個樣本),準確率大概能達到63.04%,召回率大概在72.5%(由於我的台式機壞了,只好在筆記本上跑,所以提取的樣本和特徵比較少,可能效果不是很好,哭臉)。
四、結論與討論
本次實驗採用基於Boost的方法,通過提取映像的haar特徵,對每一個特徵構建一個弱分類器,然後組成強分類器,最後通過組合多個分類器的效果,實現臉部偵測。實驗證明該方法能夠識別出多數正面人臉,準確率大概能達到63.04%,召回率大概在72.5%(可能效果不是很好)。
有以下幾個感悟:
1)積分圖是個有效方法,對於即時監測非常重要。
2)Boost方法效果確實很強大,眾人拾柴火焰高。
3)另外,由於訓練資料較少,特徵也比較少,所以效果不是很好;相信隨著資料量的增大和特徵的相應增多,效果會有所提高。
五、參考文獻
[1] 課件第六講-Tut-6-Boost.pdf
[2] Viola P, Jones M J. Robust Real-Time Face Detection[J]. International Journal of Computer Vision, 2004, 57(2):137-154.
[3] http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html
[4] http://blog.csdn.net/xiaowei_cqu/article/details/7670703












基於Boost方法的臉部偵測(1):整體思路

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.