源碼:.\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個正樣本,根據訓練的級數可以得到如下公式
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