1. 程式人生 > >opencv_traincascade的引數解釋——(LBP+cascade)行人檢測

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