標籤:adaboost haar 積分圖 級聯
基於Haar特徵的Adaboost級聯臉部偵測分類器
基於Haar特徵的Adaboost級聯臉部偵測分類器,簡稱haar分類器。通過這個演算法的名字,我們可以看到這個演算法其實包含了幾個關鍵點:Haar特徵、Adaboost、級聯。理解了這三個詞對該演算法基本就掌握了。
1 演算法要點
Haar分類器 = Haar-like特徵 + 積分圖方法 + AdaBoost +級聯;
Haar分類器演算法的要點如下:
a) 使用Haar-like特徵做檢測。
b) 使用積分圖(IntegralImage)對Haar-like特徵求值進行加速。
c) 使用AdaBoost演算法訓練區分人臉和非人臉的強分類器。
d) 使用篩選式級聯把分類器級聯到一起,提高準確率。
2 曆史
在2001年,Viola和Jones兩位大牛發表了經典的《Rapid Object Detectionusing a Boosted Cascade of Simple Features》和《Robust Real-Time Face Detection》,在AdaBoost演算法的基礎上,使用Haar-like小傳輸速率征和積分圖方法進行臉部偵測,他倆不是最早使用提出小傳輸速率征的,但是他們設計了針對臉部偵測更有效特徵,並對AdaBoost訓練出的強分類器進行級聯。這可以說是臉部偵測史上裡程碑式的一筆了,也因此當時提出的這個演算法被稱為Viola-Jones檢測器。又過了一段時間,RainerLienhart和Jochen Maydt兩位大牛將這個檢測器進行了擴充,最終形成了OpenCV現在的Haar分類器。
AdaBoost是Freund和Schapire在1995年提出的演算法,是對傳統Boosting演算法的一大提升。Boosting演算法的核心思想,是將弱學習方法提升成強學習演算法,也就是“三個臭皮匠頂一個諸葛亮”
3 Haar特徵
什麼是特徵,特徵就是分類器的輸入。把它放在下面的情景中來描述,假設在臉部偵測時我們需要有這麼一個子視窗在待檢測的圖片視窗中不斷的移位滑動,子視窗每到一個位置,就會計算出該地區的特徵,然後用我們訓練好的級聯分類器對該特徵進行篩選,一旦該特徵通過了所有強分類器的篩選,則判定該地區為人臉。
那麼這個特徵如何表示呢?好了,這就是大牛們乾的好事了。後人稱這他們搞出來的這些東西叫Haar-Like特徵。
Viola大牛在[1]中提出的haar特徵如下:
Rainer大牛改進了這些特徵,提出了更多的haar特徵。如所示:
這些所謂的特徵不就是一堆堆帶條紋的矩形麼,到底是幹什麼用的?我這樣給出解釋,將上面的任意一個矩形放到人臉地區上,然後,將白色地區的像素和減去黑色地區的像素和,得到的值我們暫且稱之為人臉特徵值,如果你把這個矩形放到一個非人臉地區,那麼計算出的特徵值應該和人臉特徵值是不一樣的,而且越不一樣越好,所以這些方塊的目的就是把人臉特徵量化,以區分人臉和非人臉。
4 Adaboost演算法
本節旨在介紹AdaBoost在Haar分類器中的應用,所以只是描述了它在Haar分類器中的特性,而實際上AdaBoost是一種具有一般性的分類器提升演算法,它使用的分類器並不局限某一特定演算法。
[1]中給出的Adaboost演算法流程如。
由adaboost在haar特徵上構建分類器的流程可知,adaboost演算法就是構建多個簡單的分類器,每個簡單的分類器都建立在之前分類器的基礎上(對之前分類器分錯了的範例提高其權重),然後將這些分類器加權,得到一個強大的分類器。
Adaboost的每一步訓練出的分類器,如所示。其中,f表示特徵的值,theta表示閾值,p則表示不等式的方向。這樣的一個分類器就是基於一個特徵的弱分類器。
更進一步,adaboost的一般演算法架構如下。可以看到,Discrete Adaboost和GentleAdaboost在分類器的計算上和權重的更新上是有差別的。還有一種是RealAdaboost,即分類器輸出的是一個機率而不只是+1與-1。[3]中就比較了這三種Adaboost的變種的效果。
5 級聯
什麼是級聯分類器?級聯分類器就是如所示的一種退化了的決策樹。為什麼說是退化了的決策樹呢?是因為一般決策樹中,判斷後的兩個分支都會有新的分支出現,而級聯分類器中,映像被拒絕後就直接被拋棄,不會再有判斷了。
級聯強分類器的策略是,將若干個強分類器由簡單到複雜排列,希望經過訓練使每個強分類器都有較高檢測率,而誤識率可以放低,比如幾乎99%的人臉可以通過,但50%的非人臉也可以通過,這樣如果有20個強分類器級聯,那麼他們的總識別率為0.99^20約等於98%,錯誤接受率也僅為0.5^20約等於0.0001%。這樣的效果就可以滿足現實的需要了。文獻[1]中給出了一種由簡單到複雜設計級聯分類器的方法,那就是添加特徵法,對於第一個分類器,只用少數幾個特徵,之後的每個分類器都在上一個的基礎上添加特徵,直到滿足該級的要求。
訓練級聯分類器的目的就是為了檢測的時候,更加準確,這涉及到Haar分類器的另一個體系,檢測體系,檢測體系是以現實中的一幅大圖片作為輸入,然後對圖片中進行多地區,多尺度的檢測,所謂多地區,是要對圖片劃分多塊,對每個塊進行檢測,由於訓練的時候用的照片一般都是20*20左右的小圖片,所以對於大的人臉,還需要進行多尺度的檢測,多尺度檢測機制一般有兩種策略,一種是不改變搜尋視窗的大小,而不斷縮放圖片,這種方法顯然需要對每個縮放後的圖片進列區域特徵值的運算,效率不高,而另一種方法,是不斷初始化搜尋視窗size為訓練時的圖片大小,不斷擴大搜尋視窗,進行搜尋,解決了第一種方法的弱勢。
6 積分圖
積分圖是用來加速計算haar特徵的方法。Haar特徵的計算所需要的基本資料就是地區內像素的和。而僅僅對於24*24的圖片來說,它的不同類型的haar特徵數目就有11W個(參考[3])。為了快速的計算出這些特徵的值,就有了積分圖表示映像的方法。
什麼是積分圖?對於與映像邊界平行的haar特徵來說,積分圖就是與映像大小一樣的一個二維數組。該數組中,(x,y)位置的值是原始映像中從(0,0)到(x,y)處的像素值的和。對於45度偏向的haar特徵來說,也類似。如所示:
對於a、c圖所示的haar特徵。計算公式如下:
其中,SAT即為積分圖中的值,RecSum即為(x,y)處的長寬為(w,h)的地區的和。有了RecSum後,就可以計算haar特徵了。
相似的,b,d圖所示的haar特徵計算公式如下:
意義類似,不一一解釋了。
積分圖的好處在於,只對圖片進行一次累計計算,就可以很方便的計算出haar特徵值了。
7 總結
基於Haar特徵的Adaboost級聯分類器,在人臉的識別效果上並沒有比其他演算法高,其亮點在於檢測速度。而速度的提升,有如下幾方面的因素。第一:使用的特徵簡單,haar特徵只需計算像素的和就可以了。第二:即便是如此簡單的特徵,還添加了積分圖進行加速。第三,級聯分類器的設定,使得大量的沒有人臉的子視窗被拋棄。
參考文獻[1]. Viola P, Jones M. Rapid object detection using a boosted cascade of simple features[C]//Computer Vision and Pattern Recognition, 2001. CVPR 2001. Proceedings of the 2001 IEEE Computer Society Conference on. IEEE, 2001, 1: I-511-I-518 vol. 1.
[2]. Lienhart R, Maydt J. An extended set of haar-like features for rapid object detection[C]//Image Processing. 2002. Proceedings. 2002 International Conference on. IEEE, 2002, 1: I-900-I-903 vol. 1.
[3]. Lienhart R, Kuranov A, Pisarevsky V. Empirical analysis of detection cascades of boosted classifiers for rapid object detection[M]//Pattern Recognition. Springer Berlin Heidelberg, 2003: 297-304.
[4]. http://blog.sina.com.cn/s/blog_74a459380101fcx7.html