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:

      (训练分类器的级数)


下图是训练过程中的截图

opencv_traincascade的参数解释——(LBP+cascade)行人检测_第1张图片

另:-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 

你可能感兴趣的:(目标检测)