基於MATLAB的adaboost級聯形式的人臉檢測實現


很早之前就做過一些關於人臉檢測和目標檢測的課題,一直都沒有好好總結出來,趁着這個機會,寫個總結,希望所寫的內容能給研究同類問題的博友一些見解和啟發!!博客里面涉及的公式太繁瑣了,直接截圖了。

    轉載請注明出處:http://www.cnblogs.com/adong7639/p/4194307.html

 

 人臉檢測之問題概述

        人臉檢測是CV領域的一個經典課題,很多學者對人臉檢測做了深入的研究,但真正的分水嶺卻是在2001年viola等大神發表的那篇經典之作Rapid Object Detection using a Boosted cascade of simple features,這篇文獻提出的每一個成果都極大的改進了人臉檢測的效果和處理時間,使得人臉檢測進入實用階段。

        在這里我想說下,網上或是一些人寫的文章,將人臉檢測和人臉識別兩個概念混為一談,人臉檢測指的是在一系列背景圖像中其中的人臉圖像,至於這個人臉是誰的人臉,我們無須確定;而人臉識別,則是在有限人臉范圍內,比如說現在一個部門有10個人,現在要做自動打卡簽到,攝像機檢測到一張人臉,需要判斷這張人臉屬於這10人中的哪一位的人臉,這個判斷過程就是人臉識別過程。人臉檢測和人臉識別應該屬於兩個問題,說白了人臉檢測探討的人臉的共同特征與非人臉的共同特征的差異性,人臉識別探討的是不同類型的人臉之間的差異性。

         opencv中現在已經有比較理想的人臉檢測源碼和xml文件,當然如果你只是要檢測出人臉或是其它的特定目標,你可以直接利用OPENCV中的xml文件或者訓練自己的xml文件,opencv分類器的訓練這一塊網上介紹的方法太多了,關於opencv訓練器和檢測器的博客,我會在另外一篇博客中寫的,畢竟自己也在opencv中做過些工作,還是遇到了一些問題,希望可以和大家交流一下。opencv中的人臉檢測模塊,現在使用的特征有兩種haar和LBP,關於這兩種特征提取的方法,我在接下面的博客會詳細介紹。


二 人臉檢測之特征提取

          特征提取是整個計算機視覺和模式識別最基本也是相當關鍵的一步,曾看到有位仁兄的說法,特征提取是CV領 域最難的一部分。做過圖像處理、模式識別的的人都知道,這個領域的很多問題都是在不停地找特征,然后根據這些特征做某種判決。對於目標檢測來說,無論用什 么辦法,最終都是通過某些特征和某些方法來判決目標或是背景,這其實是一個信號檢測的過程(信號檢測與估計這門基礎課還是蠻重要的,童鞋們有機會好好學 下)。

好了,廢話少說了,談到人臉的特征,最先使用haar特征做人臉檢測的還是2001年的viola,使用類似haar小波的矩形框來提取人臉圖像的局部特征。Haar特征如下圖:

 

 

  圖2-1 Viola使用的haar特征

上面的這些都是典型的矩形特征,后來Rainer LienhartJochen Maydt用對角特征擴展haar特征,即haar-like特征

如圖2-1所示:

    

 

2-2 擴展的haar_like特征

        矩形特征對一些簡單的圖形結構,比如邊緣、線段比較敏感,但是其只能描述特定走向(水平、垂直、對角)的結構,因此比較粗略。圖2-3為viola文獻中給出人臉部分特征分析圖,臉部一些特征能夠由矩形特征簡單地描繪,例如,通常,眼睛要比臉頰顏色更深;鼻梁兩側要比鼻梁顏色要深;嘴巴要比周圍顏色更深。

2-3 矩形特征人臉示例

      給出了這么多的矩形特征,到底改如何使用了?下面介紹特征的計算方法和積分圖。積分圖(Integral Image)主 要的思想是將圖像從起點開始到各個點所形成的矩形區域像素之和作為一個數組的元素保存在內存中,當要計算某個區域的像素和時可以直接索引數組的元素,不用 重新計算這個區域的像素和,從而加快了計算。積分圖能夠在多種尺度下,使用相同的時間來計算不同的特征,因此大大提高了檢測速度。

2-4 積分圖

       對於圖像img中任意一點p(x,y),其積分圖值f(x,y)為包含這個點左上角的所有像素灰度值之和,可以利用以下等式計算: 

                                       

 

       利用積分圖計算特征值:一個區域的像素值,可以利用該區域的端點的積分圖來計算,如圖2-4所示,ii(1)表示區域A的像素值,ii(2)表示區域A+B的像素值,ii(3)表示區域A+C的像素值,ii(4)表示區域A+B+C+D的像素值。而區域D的像素值=ii(1)+ii(4)-ii(2)-ii(3),由此,可用積分圖快速得到一個區域的像素值。圖2-4 利用積分圖計算特征值。

         通過積分圖可以方便地得出任意矩形區域的灰度和值,以Viola使用的haar特征為例。對於圖2-5中的A,  B這類特征,特征數值計算公式為:v=Sum(白) – Sum(黑),而對於C,D來說,計算公式如下:v=Sum(白)-2*Sum(黑),之所以將黑色區域像素和乘以2,是為了使兩種矩形區域中像素數目一致,其它的haar特征計算方法類似。

 

 

 

圖2-5 haar矩形特征計算

         上面的這些矩形可以稱為特征模板,特征模版可以在24X24的圖像窗口內以“任意”尺寸、“任意’’放置,每一種形態稱為一個特征。假設訓練或檢測窗口大小為Width x Height個像素,w , h分別為特征原型的長、寬,所示四種特征原型對應的w /h分別為:2/1,1/2,3/1,2/2。 假定圖像的大小為24x24,那么Width=24,Height=24,改變各個模版的w和h的大小和位置就可以得到不同的矩形了,每一個矩形可以計算出一個特征值。這樣計算出來的矩形特征數量多達160000個,這些特征聯合起來就構成特征向量,構成了后面的分類器的輸入組成部分。

        關於24x24的圖像中到底有多少個矩形特征,不同的計算方法給出的結果也不相同。以Width=24,Height=24為例,對於特征模版A而言,w的范圍[2, 24],h的范圍[1 , 24];對於特征模版B而言,h的范圍[2, 24],w的范圍[1 , 24];對於特征模版C而言,w的范圍[1 24],h的范圍[3 , 24];有些文獻認為w=0,或是h=0,也即一些線條特征也包括進去,個人認為線條特征已經失去了原本的矩形特征在人臉上的意義,另外這樣計算出來的特征數目相當龐大,實際很多特征基本上沒有意義的,不但加重了后面的分類器的負擔,也使得訓練效率低下。關於有多少個特征的問題,我也曾今疑惑過,但我后來計算中舍棄了很多不必要的特征,減少了計算,也是加快了訓練過程。


 人臉檢測之Adaboost訓練

        AdaBoost算法是一種分類器算法,是由Freund和Robert E.Schapire在1995年提出的,其基本思想是利用大量的分類能力一般的簡單分類器(weaker classifier)通過一定方法疊加起來,構成一個分類能力很強的強分類器。理論證明,只要每個簡單分類器分類能力比隨機猜測要好,當簡單分類器個數趨向於無窮時,強分類器的錯誤率將趨於零。AdaBoost用於人臉檢測時,從人臉中抽取大量的一維簡單特征。這些簡單特征都有一定的人臉和非人臉區分性。最終系統使用數千個一維簡單分類器,組合起來達到很好的分類效果。

        現在常見的AdaBoost算法主要有Discrete AdaBoost,Real AdaBoostLogit AdaBoost,Gentle AdaBoost。關於這四種算法簡單說明我引自 http://blog.sina.com.cn/s/blog_7632c6010100ydz2.html ,

        Discrete AdaBoost是指,弱分類器的輸出值限定在{-1,+1},和與之相應的權值調整,強分類器生成的AdaBoost算法;Real AdaBoost是指,弱分類器輸出一個可能度,該值的范圍是整個R, 和與之相應的權值調整,強分類器生成的AdaBoost算法。事實上,Discrete到Real的轉變體現了古典集合到模糊集合轉變的思想。
        Logit和Gentle算法是由同一個人提出的,他認為adaboost實際上是一個尋優過程,然后用運籌學里的兩種不同的尋優方法提出了logit和gentle,logit是自適應的牛頓法,gentle是用的牛頓步長法。作者認為,logit AdaBoost在每一輪中都使目標最優,會使訓練樣本的代表性下降。然后這位作者的這篇文章被幾位大牛批了一遍具體見        Discussion of the Paper Additive Logistic Regression A Statistical View of Boosting by Jerome Friedman, Trevor Hastie and Robert Tibshirani

另外,值得一提的是:
1、2004年, Bo WU & Haizhou AI & Chang HUANG & Shihong LAO在Computer Society上發表文章Fast Rotation Invariant Multi-View Face Detection Based on Real AdaBoost.提出了使用Real Boost檢測旋轉人臉,獲得了很好的效果。
2、2002年, Rainer Lienhart & Alexander Kuranov & Vadim Pisarevsky 在MRL Technical Report上

Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection

       通過實驗得出結論,在人臉檢測上Gentle AdaBoost的效果要好於 Discrete 和 Real,這也是Opencv里為什么要用Gentle的原因吧。

       參看好多的博客些的AdaBoost,一般都是介紹Discrete AdaBoost算法,關於Discrete Adaboost算法請參看博客

http://blog.csdn.net/weixingstudio/article/details/7631241  我覺得介紹的比較詳細,這里我主要講我使用的Real Adaboost算法。


3.1 RealAdaBoost Classification Functions

3.1.1 RealAdaBoost概述

        特征提取工作完成后,就要借助分類器合理利用這些特征選擇出有效的特征,輸出用於后期目標檢測的參數。在模式識別領域,經典的分類方法有:PCA  ANN ,貝葉斯, SVM, Adaboost。這些算法現在被廣泛應用於目標的分類識別課題中。

3.1.2 Real AdaBoost算法的具體步驟如下

       在訓練過程中涉及到弱分類器的選擇過程,一個弱分類器就表示一個特征,能否選出這個這個弱分類器就決定於這個特征對於樣本的區分性情況。那些區分性比較好 的特征,在正負樣本上會表現出明顯的差異,就容易被選到,相應的弱分類器將被選中,這樣最終的強分類器對待分類目標的判決就相當於多個特征判決。


 人臉檢測之檢測人臉

4.1 cascade訓練檢測框架

        通過上文論述的強分類器的訓練過程后,就可以進行具體的目標分類檢測,為了提高檢測速度,Viola等人提出一種Cascade的級聯檢測器用於人臉檢測,如圖4-1示:

 

圖 4-1 cascade訓練檢測示意圖

 

 

五人臉檢測演示

     利用訓練器可以訓練出滿足要求的人臉檢測參數,利用這些參數就可以檢測圖像中的人臉了。效果如下:

  



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM