opencv_traincascade的參數解釋——(LBP+cascade)行人檢測

源碼.\opencv\sources\apps\traincascade\traincascade.cpp

運行命令:

./opencv_traincascade -data  E:\xml  -vec  pos_sample_data.vec -bg neg_data.txt -numNeg 1111-numPos 1400-numStages 15 -precalcValBufSize 500-precalcIdxBufSize 500-stageType BOOST-featureType LBP-w 164-h 24


1)opencv_traincascade

   位置: E:\opencv\build\x64\vc10\bin\opencv_traincascade

   訓練的可執行文件

2)-data :

     xml是個文件夾的名字,存放訓練過程中生成的文件,如params.xml (存放訓練時的參數)、stage0(stage1,stage2...stagei)存放i層的訓練的數據,每一層都有好些弱分類器,隨着層數的增加,弱分類器的個數也在增加,最後都在FA<0.5結束。FA是falseAlarm、負樣本的誤檢測率。


3)-vec:

    pos_sample_data.vec是通過opencv_createsamples生成的vec文件,正樣本的數據

    如執行opencv_createsamples -vec e:/dataset/posImgData164_24.vec -bg e:/dataset/bg.txt-info e:/dataset/pos.txt -num 1648-w 164 -h 24   (-num:正樣本的數目)

  將正樣本圖片寫入到一個vec二進制文件中(這應該是爲了在訓練的時候方便並行運算)

正樣本和負樣本均放在一個文件夾下,結構如下:

負樣本文件夾下面有一個文件夾和一個bg.txt,存放的數據如下

/img 

    img1.jpg 

    img2.jpg

bg.txt

 

bg.txt裏面的數據如下

img/img1.jpg

img/img2.jpg

 

正樣本文件夾下面有一個文件夾和一個pos.txt,存放的數據如下

/img 

    img1.jpg 

    img2.jpg

pos.txt


pos.txt除了存放圖片名外,還存放了圖像中目標的boundingbox的Rect,內容如下

img/img1.jpg  1  140 100 45 45

img/img2.jpg  2  100 200 50 50   50 30 25 25

 

文件名之後跟的是boundingbox的數目,後面就是對應的Rect。

問題:截取的正樣本大小不一致,還需要自己編寫程序歸一化不???


4) -bg:

      負樣本文件的數據,如neg_data.txt

5)-numPos:

     正樣本的數目,但是應當注意,這個數值一定要比準備正樣本時的數目少,不然會報can not get new positive sample.

    理由: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個的情況就是上面所說的”可能有問題“


6)-featureType:

    訓練時,提取圖像特徵的類型,目前只支持LBP、HOG、Haar三種特徵但是HAAR訓練非常非常的慢,而LBP則相對快很多,因爲HAAR需要浮點運算,精度自然比LBP更高,但是LBP的效果也基本能達到HAAR的效果,推薦使用LBP。


7) -w:

    必須與opencv_createsample中使用的-w值一致,並且-w和-h的比例必須符合真實目標的比例. (別人說的,還未驗證過)???

8) -h:

   必須與opencv_createsample中使用的-h值一致,並且-w和-h的比例必須符合真實目標的比例.


9)-numStages:

      (訓練分類器的級數)


下圖是訓練過程中的截圖


另:-w和-h的大小對訓練時間的影響非常大,我測試了兩個不同尺寸下的訓練,分別是Size(100,15)和Size(164,24),後者所用的時間至少是前者的2-3倍。


函數參數:

    bool CvCascadeClassifier::train( const std::string _cascadeDirName,      (存放訓練參數的路徑,如-data  xml)
                const std::string _posFilename,              (pos_data.vec,正樣本的數據)
                const std::string _negFilename,                   (neg_data.txt,負樣本的數據)
                int _numPos, int _numNeg,                  (正負樣本個數)
                int _precalcValBufSize, int _precalcIdxBufSize,  (緩存大小,用於存儲預先計算的特徵值,單位MB;緩存大小,用於存儲預先計算的特徵索引,單位M幣 )
                int _numStages,                 (訓練分類器的級數)
                const CvCascadeParams& _cascadeParams,
                const CvFeatureParams& _featureParams,   (特徵參數)
                const CvCascadeBoostParams& _stageParams,
                bool baseFormatSave = false );


級聯參數cascadeParams

-stageType 級聯類型,staticconst char* stageTypes[] = { CC_BOOST };

-featureType 特徵類型,staticconst char* featureTypes[] = { CC_HAAR, CC_LBP, CC_HOG };

-w

-h 訓練樣本的尺寸,必須跟使用opencv_createsamples創建的訓練樣本尺寸保持一致

Boosted分類器參數stageParams

-bt Boosted分類器類型

DAB-discrete Adaboost, RAB-RealAdaboost, LB-LogiBoost, GAB-Gentle Adaboost

-minHitRate 分類器的每一級希望得到的最小檢測率,總的最大檢測率大約爲min_hit_rate^number_of_stages

-maxFalseAlarmRate 分類器的每一級希望得到的最大誤檢率,總的誤檢率大約爲

max_false_rate^number_of_stages

-weightTrimRate Specifies whether trimming should beused and its weight. 一個還不錯的數值是0.95

-maxDepth 弱分類器的最大深度,一個不錯數值是1,二叉樹

-maxWeightCount 每一級中弱分類器的最大數目


參數:

http://www.lai18.com/content/10170009.html   (參數說明)

http://blog.csdn.net/quincuntial/article/details/50427005 

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