1. 程式人生 > >adaboost訓練之經驗總結

adaboost訓練之經驗總結

參考:http://blog.csdn.net/xidianzhimeng/article/details/42147601 

http://blog.csdn.net/lliming2006/article/details/76019135

對以上的部落格彙總了一下,在訓練上不斷調整,期待分類器的表現。

利用adaboost訓練的分類器做了幾個專案(當然在實際應用過程中,我對adaboos的原始碼做了優化和改善,同時我也用了深度學習--caffe做了類似的工作,綜合權衡演算法檢測率、演算法效率,在專案中採用的還是adaboost,後期我會花大量時間對caffe改進、優化), 以下純為訓練前要注意的事項。

0、訓練前,正樣本尺寸的選擇很重要。


1、訓練時正樣本的設定:越多越好,但是要考慮訓練機器的記憶體。在訓練前,正樣本設定的通用公式為:posNum+numStages*[(1-minHitRate)*posNum +50~300]<total_posNum,.因此要引起注意。
   A、原因:每完成訓練一層後,即將開始的那一層將從numStages*[(1-minHitRate)*posNum +300~600]個正樣本中選取設定的(訓練前就設定)正樣本中數量。
   B、後果:如果不注意正樣本的的設定公式,分類器很可能訓練不到你設定的階數。
   C、舉例: 訓練時螢幕會有該層的資訊行:POS cout :consumed 110000:123188,意即是從123188個正樣本中選取110000個正樣本來訓練。如果想訓練到30層,但總正樣本個數是150000,而訓練開始前引數
設定為130000,minHitRate為0.99,那鐵定訓練不到20層。因為訓練到到第12層時,儘管第12層也只訓練130000個正樣本,但是這些正樣本是從130000+12*[(1-0.99)*130000+100]=151100中選取的,該數量已經超過了正樣本總數150000,因此12層的訓練無法進行(訓練視窗會提示取不到足夠的正樣本)。
   

2、訓練時負樣本的選擇應注意:
   A、正負樣本的比例在1:2~1:3之間較好,具體多少需要自己做實驗,有條件的話建議用伺服器同時訓練幾個不同比例額的分類器,從中選取合適的,如1:2,1:2.3,1:2.5,1:3比例的分類器。
   B、負樣本的比例一定要大於正樣本的比例,否則,訓練到某一層時,adaboost會在收集負樣本的迴圈中陷入死迴圈,造成好幾天甚至訓練會一直無法繼續進行。因此,為保證負樣本的通用性(訓練別的不同尺寸的正樣本的分類器也能用),W*H最好大於100*100。
   C、負樣本圖片數量的選取要多,少了在訓練過程中就擷取不到設定的負樣本數量,(負樣本的選取是訓練程式自動經過這個流程
:擷取--檢測-確定是否識別錯,只有擷取後檢測為正樣本的才當成負樣本:因為它識別錯了)。

3、正樣本和負樣本的共性:
   A、多樣性方面:正負樣本的多樣性越多越好,越全面越好。與演算法的術語“泛化性 ”同一個意思。
   B、相似度方面:負樣本與正樣本的相似度越大越好(非越小越好,否則訓練會停在某一層,因為根據上面2-C條所說的,負樣本都識別為負樣本了:沒有識別錯,也就程式不能取得足夠數量的負樣本了,訓練怎麼能繼續下去呢?)。
  

4、引數方面:
    A、minHitRate越大,準確性越高。其他的影響見上述1條列。
    B、maxfalsAlarmRate設定得越大,訓練越快,同時生成分類器的大小越小。
    C、maxWeakCount:弱分類器個數,預設是100,設定越大訓練越慢,生成的分類器檔案也越大(該影響力次於maxfalsAlarmRate),誤撿就越少(同一層的僅maxWeakCount不同的分類器相比)。
 
5、訓練過程中的應注意的問題
   A、訓練過程中遇到正負樣本個數不足,比如:30個小時還是看不到訓練或者提示樣本不足,此時應:暫停(ctrl+c),然後新增正樣本或者負樣本。然後接著訓練,但是在繼續訓練前要主要生成標註檔案個正樣本的vec。
   B、由於不知道哪一階的分類器最佳,可以在全部層數訓練完後、或者在訓練過程中,生成各階的分類器,具體方法是複製一份訓練器的exe,利用“編輯”開啟後修改其中的層數,然後執行即可。但是不能修改分類器引數後再繼續訓練。
   

    最後,隨著分類器階數的增加,分類器的準確性會下降、誤撿也會下降,但是準確性(漏檢)的下降較大。形象的比如是:“過五關斬六將”,過到第30關,準確性被斬了不少了。

    另:這些僅僅是訓練時應注意的問題和方法。要想真正的掌握它,還是要看演算法設計的思想、原始碼。

      最後,針對分類器層數越高,漏檢越嚴重的現象,為了應用到實際的專案中,在優化程式碼的同時,我還通過分析分類中代價函式等函式的優缺點後,設計了一個類似與殘差的補償公式,經過訓練後,分類器的檢測準確率明顯提高。

1 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個的情況就是上面所說的”可能有問題“
2 maxFalseAlarm:影響每個強分類器中弱分類器的個數,設定較大,每級可以濾除負樣本的比例就較小,這樣在測試過程中虛警率就較高;設定較小,每級強分類器中弱分類器的個數就較多,檢測時間就會相對要長,在可以接受的檢測時間下儘量降低maxFalseAlarm是我們要追求的目標 關於負樣本的選擇,因為每級剩下的負樣本個數低於numNeg*maxFalseAlarm,在第二輪選擇的時候從之前選擇的負樣本後面繼續選擇,而不是重頭開始將選擇過的負樣本也包含進來,只有當遍歷完一遍負樣本列表後才重頭在掃描一遍 3 weightTrimWeight:影響參與訓練的樣本,不管是正樣本還是負樣本,當更新完樣本權重之後,將樣本權重按照從小到大的順序排列,當從後累加樣本權重不小於weightTrimWeight時前面的樣本就不參與後面的訓練了,這裡有一個優化是等於該閾值的樣本還是參與訓練的,這樣可以在保證訓練精度的基礎上縮短檢測時間,因為我們認為是樣本權重很小的時候表示該樣本被正確分類了,而忽略了樣本很多的時候,儘管樣本沒有被正確分類,也可能被排除在外了。還有一種情況就是正樣本比例懸殊的時候,例如1:20,當正樣本完全分類正確了,那麼正樣本比例總和僅佔4.8%,後續參與訓練的正樣本可能就沒有了 4 maxWeakCount:決定每級強分類器中弱分類器的最大個數,當FA降不到指定的maxFalseAlarm時可以通過指定最大弱分類器個數停止單個強分類器 5 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.