OpenCV中Adaboost訓練的經驗總結

以OpenCV訓練級聯Adaboost爲例進行說明
numPos: 12000
numNeg: 120000
numStages: 15
precalcValBufSize[Mb] : 1000
precalcIdxBufSize[Mb] : 800
stageType: BOOST
featureType: HOG
sampleWidth: 40
sampleHeight: 40
boostType: DAB
minHitRate: 0.999
maxFalseAlarmRate: 0.7
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 150
===== TRAINING 0-stage =====
<BEGIN
POS count : consumed   12000 : 12000
NEG count : acceptanceRatio    120000 : 1
+----+---------+---------+
|  14| 0.999083| 0.684617|
+----+---------+---------+
===== TRAINING 1-stage =====
<BEGIN
POS count : consumed   12000 : 12011
NEG count : acceptanceRatio    120000 : 0.688808
+----+---------+---------+
|  24| 0.999083| 0.695967|
+----+---------+---------+
===== TRAINING 2-stage =====
<BEGIN
POS count : consumed   12000 : 12022
NEG count : acceptanceRatio    120000 : 0.470459
+----+---------+---------+
|  35| 0.999083|  0.68575|
+----+---------+---------+
===== TRAINING 3-stage =====
<BEGIN
POS count : consumed   12000 : 12033
NEG count : acceptanceRatio    120000 : 0.544413
+----+---------+---------+
|  59| 0.999083|   0.6992|
+----+---------+---------+
===== TRAINING 4-stage =====
<BEGIN
POS count : consumed   12000 : 12044
NEG count : acceptanceRatio    120000 : 0.377264
+----+---------+---------+
| 103| 0.999083| 0.671933|
+----+---------+---------+


1 正負樣本比例問題:1:4或者1:5訓練出來的分類器要優於1:1或者1:10
正負樣本比例接近的時候1:1,對負樣本的看中程度很低,在實際的生活中負樣本肯定遠遠多於正樣本
正負樣本比例較大的時候1:10,對負樣本多於看中而忽略了正樣本的統計特性,造成正樣本權重總和很小,當權重小於一定程度的時候可能很大一部分正樣本都不參與訓練了(在weightTrimRate=0.95時),那麼假設沒有正樣本參與訓練了,只有負樣本參與後續訓練,訓練出來的分類器會是什麼樣子的呢?
不管是目標檢測問題與單純數據分類問題我們都不可以專門針對負樣本進行訓練,這樣的訓練是無意義的
因此我們只能儘可能保證不過分看中負樣本的情況下儘量增加負樣本的個數,對於正樣本的個數,比如人臉檢測至少需要上萬或者幾十萬的正樣本吧,這個沒有較好的結論,如果有人知道OpenCV公開的haarcascade_frontalface_alt.xml的參數請指教一下。

2 minHitRate:影響每個強分類器閾值,當設置爲0.95時如果正訓練樣本個數爲10000個,那麼其中的500個就很可能背叛別爲負樣本,第二次選擇的時候必須多選擇後面的500個,按照這種規律我們爲後面的每級多增加numPos*minHitRate個正樣本,根據訓練的級數可以得到如下公式
numPos+(numStages-1)*numPos*(1-minHitRate)《=準備的訓練樣本
以上式子也只是根據訓練級數和準備的正樣本總和設置一個參與訓練的正樣本個數,只能作爲估算,小於計算出來的數可能沒有問題,但是大於那個數肯定有問題
現在解釋下”可能有問題“是如何理解的:因爲我們總是默認每次添加固定個數的正訓練樣本,但是有時候後面的固定個數的正訓練樣本中也可能存在不滿足條件的樣本,這些樣本跟我們排除的樣本類似,所以比如我們打算添加500個樣本就夠了,但是實際需要添加600個,這時候就出現問題了。
從上面例子的結果中可以看出,每級我們允許丟掉12000*0.001個正樣本=12,需要注意的是萬一第11個或者第10個跟第12個的閾值是一樣的,那麼我們之丟掉了前面的10個或者9個而已,因此每次增加的個數可能要小於12個,大於12個的情況就是上面所說的”可能有問題“

3 maxFalseAlarm:影響每個強分類器中弱分類器的個數,設置較大,每級可以濾除負樣本的比例就較小,這樣在測試過程中虛警率就較高;設置較小,每級強分類器中弱分類器的個數就較多,檢測時間就會相對要長,在可以接受的檢測時間下儘量降低maxFalseAlarm是我們要追求的目標
關於負樣本的選擇,因爲每級剩下的負樣本個數低於numNeg*maxFalseAlarm,在第二輪選擇的時候從之前選擇的負樣本後面繼續選擇,而不是重頭開始將選擇過的負樣本也包含進來,只有當遍歷完一遍負樣本列表後才重頭在掃描一遍

4 weightTrimWeight:影響參與訓練的樣本,不管是正樣本還是負樣本,當更新完樣本權重之後,將樣本權重按照從小到大的順序排列,當從後累加樣本權重不小於weightTrimWeight時前面的樣本就不參與後面的訓練了,這裏有一個優化是等於該閾值的樣本還是參與訓練的,這樣可以在保證訓練精度的基礎上縮短檢測時間,因爲我們認爲是樣本權重很小的時候表示該樣本被正確分類了,而忽略了樣本很多的時候,儘管樣本沒有被正確分類,也可能被排除在外了。還有一種情況就是正樣本比例懸殊的時候,例如1:20,當正樣本完全分類正確了,那麼正樣本比例總和僅佔4.8%,後續參與訓練的正樣本可能就沒有了

5 maxWeakCount:決定每級強分類器中弱分類器的最大個數,當FA降不到指定的maxFalseAlarm時可以通過指定最大弱分類器個數停止單個強分類器

6 boost參數(maxDepth、bt):影響決策樹構建的法則以及權重更新策略
至於Gentle AdaBoost.考慮到(AdaBoost對”不像”的正樣本權值調整很高,而導致了分類器的效率下降),而產生的變種算法.它較少地強調難以分類的樣本.
Rainer Lienhart, Alexander Kuranov, Vadim Pisarevsky在論文Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection中提出在stump弱分類器(即每個弱分類器使用一個特徵進行分類)上進行的對比試驗中,Gentle的結果明顯好於Real和 Discrete.


有不對的地方請指教!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章