源码:.\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