AdaBoost人臉檢測演算法1(轉…
目前因為做人臉識別的一個小專案,用到了AdaBoost的人臉識別演算法,因為在網上找到的所有的AdaBoost的簡介都不是很清楚,讓我看看頭腦發昏,所以在這裡打算花費比較長的時間做一個關於AdaBoost演算法的詳細總結。希望能對以後用AdaBoost的同學有所幫助。而且給出了關於AdaBoost實現的一些程式碼。因為會導致篇幅太長,所以這裡把文章分開了,還請見諒。
辛苦打字截圖不容易,轉載請標明出處。
提到AdaBoost的人臉識別,不得不提的幾篇大牛的文章可以看看,但是大牛的文章一般都是隻有主要的演算法框架,沒有詳細的說明。
大牛論文推薦:
1. Robust Real-time Object Detection, Paul Viola, Michael Jones
2. Rapid Object Detection using a Boosted Cascade of Simple Features, 作者同上。
還有一篇北大的本科生的畢業論文也不錯:基於 AdaBoost 演算法的人臉檢測,趙楠。
另外,關於我寫的AdaBoost的人臉識別程式的下載地址:
1. C++版本:http://download.csdn.net/detail/weixingstudio/4350983
說明:需要自己配置opencv2.3.1, 自己配置分類器。在程式執行前會捕捉10幀使用者影象,計算人臉平均面積,這個過程不會有顯示,但是程式沒有出問題,稍等一會就會出現攝像頭資訊。
2. C#版本:http://download.csdn.net/detail/weixingstudio/4351007
說明:使用了emgucv2.3.0的庫,需要自己重新新增引用動態連結庫檔案。
兩個版本的程式都能正確執行,沒有任何問題。
1. Adaboost方法的引入
1.1 Boosting方法的提出和發展
在瞭解Adaboost
回答一個是與否的問題,隨機猜測可以獲得50%的正確率。如果一種方法能獲得比隨機猜測稍微高一點的正確率,則就可以稱該得到這個方法的過程為弱學習;如果一個方法可以顯著提高猜測的正確率,則稱獲取該方法的過程為強學習。1994年,Kearns和Valiant證明,在Valiant的PAC(Probably ApproximatelyCorrect)模型中,只要資料足夠多,就可以將弱學習演算法通過整合的方式提高到任意精度。實際上,1990年,SChapire就首先構造出一種多項式級的演算法,將弱學習演算法提升為強學習演算法,就是最初的Boosting演算法。Boosting意思為提升、加強,現在一般指將弱學習提升為強學習的一類演算法。1993年,Drucker和Schapire首次以神經網路作為弱學習器,利用Boosting演算法解決實際問題。前面指出,將弱學習演算法通過整合的方式提高到任意精度,是Kearns和Valiant在1994年才證明的,雖然Boosting方法在1990年已經提出,但它的真正成熟,也是在1994年之後才開始的。1995年,Freund提出了一種效率更高的Boosting演算法。
1.2 AdaBoost演算法的提出
1995年,Freund和Schapire提出了Adaboost演算法,是對Boosting演算法的一大提升。Adaboost是Boosting家族的代表演算法之一,全稱為Adaptive Boosting。Adaptively,即適應地,該方法根據弱學習的結果反饋適應地調整假設的錯誤率,所以Adaboost不需要預先知道假設的錯誤率下限。也正因為如此,它不需要任何關於弱學習器效能的先驗知識,而且和Boosting演算法具有同樣的效率,所以在提出之後得到了廣泛的應用。
首先,Adaboost是一種基於級聯分類模型的分類器。級聯分類模型可以用下圖表示:
級聯分類器介紹:級聯分類器就是將多個強分類器連線在一起進行操作。每一個強分類器都由若干個弱分類器加權組成,例如,有些強分類器可能包含10個弱分類器,有些則包含20個弱分類器,一般情況下一個級聯用的強分類器包含20個左右的弱分類器,然後在將10個強分類器級聯起來,就構成了一個級聯強分類器,這個級聯強分類器中總共包括200若分類器。因為每一個強分類器對負樣本的判別準確度非常高,所以一旦發現檢測到的目標位負樣本,就不在繼續呼叫下面的強分類器,減少了很多的檢測時間。因為一幅影象中待檢測的區域很多都是負樣本,這樣由級聯分類器在分類器的初期就拋棄了很多負樣本的複雜檢測,所以級聯分類器的速度是非常快的;只有正樣本才會送到下一個強分類器進行再次檢驗,這樣就保證了最後輸出的正樣本的偽正(false positive)的可能性非常低。
也有一些情況下不適用級聯分類器,就簡單的使用一個強分類器的情況,這種情況下一般強分類器都包含200個左右的弱分類器可以達到最佳效果。不過級聯分類器的效果和單獨的一個強分類器差不多,但是速度上卻有很大的提升。
級聯結構分類器由多個弱分類器組成,每一級都比前一級複雜。每個分類器可以讓幾乎所有的正例通過,同時濾除大部分負例。這樣每一級的待檢測正例就比前一級少,排除了大量的非檢測目標,可大大提高檢測速度。
其次,Adaboost是一種迭代演算法。初始時,所有訓練樣本的權重都被設為相等,在此樣本分佈下訓練出一個弱分類器。在第( =1,2,3, …T,T為迭代次數)次迭代中,樣本的權重由第 -1次迭代的結果而定。在每次迭代的最後,都有一個調整權重的過程,被分類錯誤的樣本將得到更高的權重。這樣分錯的樣本就被突出出來,得到一個新的樣本分佈。在新的樣本分佈下,再次對弱分類器進行訓練,得到新的弱分類器。經過T次迴圈,得到T個弱分類器,把這T個弱分類器按照一定的權重疊加起來,就得到最終的強分類器。
2. 矩形特徵
2.1 Haar特徵矩形特徵
AdaBoost演算法的實現,採用的是輸入影象的矩形特徵,也叫Haar特徵。下面簡要介紹矩形特徵的特點。
影響Adaboost檢測訓練演算法速度很重要的兩方面是特徵的選取和特徵值的計算。臉部的一些特徵可以由矩形特徵簡單地描繪。用圖2示範:
上圖中兩個矩形特徵,表示出人臉的某些特徵。比如中間一幅表示眼睛區域的顏色比臉頰區域的顏色深,右邊一幅表示鼻樑兩側比鼻樑的顏色要深。同樣,其他目標,如眼睛等,也可以用一些矩形特徵來表示。使用特徵比單純地使用畫素點具有很大的優越性,並且速度更快。
在給定有限的資料情況下,基於特徵的檢測能夠編碼特定區域的狀態,而且基於特徵的系統比基於象素的系統要快得多。
矩形特徵對一些簡單的圖形結構,比如邊緣、線段,比較敏感,但是其只能描述特定走向(水平、垂直、對角)的結構,因此比較粗略。如上圖,臉部一些特徵能夠由矩形特徵簡單地描繪,例如,通常,眼睛要比臉頰顏色更深;鼻樑兩側要比鼻樑顏色要深;嘴巴要比周圍顏色更深。
對於一個 24×24 檢測器,其內的矩形特徵數量超過160,000 個,必須通過特定演算法甄選合適的矩形特徵,並將其組合成強分類器才能檢測人臉。
常用的矩形特徵有三種:兩矩形特徵、三矩形特徵、四矩形特徵,如圖:
由圖表可以看出,兩矩形特徵反映的是邊緣特徵,三矩形特徵反映的是線性特徵、四矩形特徵反映的是特定方向特徵。
特徵模板的特徵值定義為:白色矩形畫素和減去黑色矩形畫素和。接下來,要解決兩個問題,1:求出每個待檢測子視窗中的特徵個數。2:求出每個特徵的特徵值。
子視窗中的特徵個數即為特徵矩形的個數。訓練時,將每一個特徵在訓練影象子視窗中進行滑動計算,獲取各個位置的各類矩形特徵。在子視窗中位於不同位置的同一型別矩形特徵,屬於不同的特徵。可以證明,在確定了特徵的形式之後,矩形特徵的數量只與子視窗的大小有關[11]。在24×24的檢測視窗中,矩形特徵的數量約為160,000個。
特徵模板可以在子視窗內以“任意”尺寸“任意”放置,每一種形態稱為一個特徵。找出子視窗所有特徵,是進行弱分類訓練的基礎。
2.2子視窗內的條件矩形,矩形特徵個數的計算
如圖所示的一個m*m大小的子視窗,可以計算在這麼大的子視窗記憶體在多少個矩形特徵。
以 m×m 畫素解析度的檢測器為例,其內部存在的滿足特定條件的所有矩形的總數可以這樣計算:
對於 m×m 子視窗,我們只需要確定了矩形左上頂點A(x1,y1)和右下頂點B(x2,63) ,即可以確定一個矩形;如果這個矩形還必須滿足下面兩個條件(稱為(s, t)條件,滿足(s, t)條件的矩形稱為條件矩形):
1) x 方向邊長必須能被自然數s 整除(能均等分成s 段);
2) y 方向邊長必須能被自然數t 整除(能均等分成t 段);
則 , 這個矩形的最小尺寸為s×t 或t×s, 最大尺寸為[m/s]·s×[m/t]·t 或[m/t]·t×[m/s]·s;其中[ ]為取整運算子。
2.3條件矩形的數量
我們通過下面兩步就可以定位一個滿足條件的矩形:
由上分析可知,在m×m 子視窗中,滿足(s, t)條件的所有矩形的數量為:
實際上,(s, t)條件描述了矩形特徵的特徵,下面列出了不同矩形特徵對應的(s, t)條件:
下面以 24×24 子視窗為例,具體計算其特徵總數量:
下面列出了,在不同子視窗大小內,特徵的總數量:
3. 積分圖
3.1 積分圖的概念
在獲取了矩形特徵後,要計算矩形特徵的值。Viola等人提出了利用積分圖求特徵值的方法。積分圖的概念可用圖3表示:
座標A(x,y)的積分圖是其左上角的所有畫素之和(圖中的陰影部分)。定義為:
其中ii(x,y)表示積分圖,i(x,y)表示原始影象,對於彩色影象,是此點的顏色值;對於灰度影象,是其灰度值,範圍為0~255。
在上圖中,A(x,y)表示點(x,y)的積分圖;s(x,y)表示點(x,y)的y方向的所有原始影象之和。積分圖也可以用公式(2)和公式(3)得出:
3.2 利用積分圖計算特徵值
3.3 計算特徵值
由上一節已經知道,一個區域的畫素值,可以由該區域的端點的積分圖來計算。由前面特徵模板的特徵值的定義可以推出,矩形特徵的特徵值可以由特徵端點的積分圖計算出來。以“兩矩形特徵”中的第二個特徵為例,如下圖,使用積分圖計算其特徵值: