有了haar特征,有了提升性能的積分圖,是不是已經可以很好的解決人臉檢測問題了?答案是:no. 因為,計算每一個特征值的時候速度都大幅提升了,但是,一個小小的24*24是人臉圖像根據不同的位置,
以及不同的縮放,可以產生超過160,000個特征!這個數量太龐大了,所以肯定要舍棄大量的特征。那么,如何保證使用少量的特征,而又能得到精確的結果呢?
大神永遠有解決方法,viola等人使用adaboost來進行分類。聲明一下,adaboost並不是viola等人提出的,而是Freund和Schapire提出。但是viola的偉大正是因為他將這個模型首次用到了人臉識別中,這使得
人臉識別在嵌入式系統應用成為一個可能的事情。
什么是adaboost呢?
AdaBoost,是英文"Adaptive Boosting"(自適應增強)的縮寫,是一種機器學習方法,由Yoav Freund和Robert Schapire提出。[1]AdaBoost方法的自適應在於:前一個分類器分錯的樣本會被用來訓練下一個分類器。
AdaBoost方法對於噪聲數據和異常數據很敏感。但在一些問題中,AdaBoost方法相對於大多數其它學習算法而言,不會很容易出現過擬合現象。AdaBoost方法中使用的分類器可能很弱(比如出現很大錯誤率),但只
要它的分類效果比隨機好一點(比如兩類問題分類錯誤率略小於0.5),就能夠改善最終得到的模型。而錯誤率高於隨機分類器的弱分類器也是有用的,因為在最終得到的多個分類器的線性組合中,可以給它們賦予負
系數,同樣也能提升分類效果。
AdaBoost方法是一種迭代算法,在每一輪中加入一個新的弱分類器,直到達到某個預定的足夠小的錯誤率。每一個訓練樣本都被賦予一個權重,表明它被某個分類器選入訓練集的概率。如果某個樣本點已經被准確
地分類,那么在構造下一個訓練集中,它被選中的概率就被降低;相反,如果某個樣本點沒有被准確地分類,那么它的權重就得到提高。通過這樣的方式,AdaBoost方法能“聚焦於”那些較難分(更富信息)的樣本上。
在具體實現上,最初令每個樣本的權重都相等,對於第k次迭代操作,我們就根據這些權重來選取樣本點,進而訓練分類器Ck。然后就根據這個分類器,來提高被它分錯的的樣本的權重,並降低被正確分類的樣本權重。
然后,權重更新過的樣本集被用於訓練下一個分類器Ck[2]。整個訓練過程如此迭代地進行下去。
人臉檢測使用adaboost的流程是什么呢?
首先是要把級聯的概念搞清楚。所有偉大的東西,其思想都是很簡單的。
級聯結構:
將多個強分類器連接在一起進行操作。每一個強分類器都由若干個弱分類器加權組成。例如,一個級聯用的強分類器包含20個左右的弱分類器,然后在將10個強分類器級聯起來,就構成了一個級聯強分類器,
這個級聯強分類器中總共包括200個(20*10)分類器。因為每一個強分類器對負樣本的判別准確度非常高,所以一旦發現檢測到的目標位負樣本,就不在繼續調用下面的強分類器,減少了很多的檢測時間。因為一幅
圖像中待檢測的區域很多都是負樣本,這樣由級聯分類器在分類器的初期就拋棄了很多負樣本的復雜檢測,所以級聯分類器的速度是非常快的;只有正樣本才會送到下一個強分類器進行再次檢驗,這樣就保證了最后
輸出的正樣本的偽正(false positive)的可能性非常低。
最優弱分類器:
尋找合適的閾值,使該分類器對所有樣本的判斷誤差最小。對於每個特征f,計算所有訓練樣本的特征值並排序:
遍歷排序后的特征值,對於序列中的每個元素,計算以下值:
1.全部人臉樣本的權重和t1
2.全部非人臉樣本的權重和t0
3.在此元素之前的人臉樣本的權重和s1
4.在此元素之前的非人臉樣本的權重和s0
5.此元素的分類誤差:r=min{[s1+(t0-s0)],[s0+(t1-s1)]}
找出r值最小的元素作為最優閾值,最優分類器就產生了。
強分類器:
For T輪迭代:
1.重新統一權重
2.訓練出本輪的最優弱分類器(詳見上一P)
3.根據本輪迭代中的分類結果重新分配樣本權重(增加錯誤分配樣本的權重)
這樣,T輪之后將產生T個最優弱分類器
組合T個最優弱分類器得到強分類器:
相當於讓所有弱分類器投票,再對投票結果按照弱分類器的錯誤率加權求和,將投票加權求和的結果與平均投票結果比較得出最終的結果。
級聯分類器的訓練過程:
參考文檔:
1 https://wizardforcel.gitbooks.io/dm-algo-top10/content/adaboost.html
2 https://zh.wikipedia.org/wiki/AdaBoost
3 https://blog.csdn.net/cyh_24/article/details/39755661