(轉)基於Haar特徵的Adaboost人臉檢測分類器

原文地址:http://blog.csdn.net/stdcoutzyx/article/details/34842233

雖然主要做blockchain,,但是robocup要學這個,那就學習一個,區塊鏈和人工智能不分家嘛…

基於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

[5]. http://www.codeproject.com/Articles/441226/Haar-feature-Object-Detection-in-Csharp


發佈了50 篇原創文章 · 獲贊 11 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章