标签:else 分支 amp addclass 树节点 图片路径 stage hid show
利用adaboost训练人脸分类器时,主要做几件事,准备正负样本,生成正样本pos.vec文件,生成负样本列表文件,训练等,具体可以看这几个博客:
http://blog.csdn.net/u013355191/article/details/40381107,这里不赘述。
记录下我在研究过程理解的,生成正样本程序CreateSamples.exe以及训练程序opencv_haartraining.exe的所有参数的具体意义与用处。
这个可执行程序主要用来生成用于训练的正样本,位于\opencv\build\common目录下,老版本名字为:createsamples.exe
该程序的主函数中有四个分支:
if( imagename && vecname )
{
cvCreateTrainingSamples(
vecname,
imagename,
bgcolor,
bgthreshold,
bgfilename,
num,
invert,
maxintensitydev,
maxxangle,
maxyangle,
maxzangle,
showsamples,
width,
height );
通过传入的单张图片的扭曲变形来创建多个正样本,如果有单张传入的图像路径以及正样本vec路径,则走到这个分支:
vecname:要生成用于训练的vec文件的路径,内容为xxx/xxx/xxx/xxx.vec,例如通过 -vec xxx/xxx/xxx/xxx.vec 传入
imagename:通过一张图片的扭曲形变成多张图片的单张样本图片的路径。例如通过 -img xxx/xxx/xxx/xxx.jpg传入
bgcolor:这是创建样本时样本扭曲函数中用来决定像素是否有效的像素值,作为背景过滤的基本值将像素值在(bgcolor-bgthreshold)与(bgcolor+bgthreshold)之外的像素保留来生成正样本,因为操作的是灰度图,所以这个值0范围是~255。例如通过:-bgcolor 128传入
bgthreshold:决定背景掩码的实际取值范围,例如通过:-bgthreshold 32传入。
bgfilename:记录所有负样本的目录文件,xxx/xxx/xxx/neg.txt,例如通过:-bg xxx/xxx/xxx/neg.txt传入
num:要创建的样本的数量,例如通过:-num 800传入
invert:通过单张图片生成样本时,是否需要反相或随机反相。例如通过:-inv 或 -randinv,前者invert变量取得值为1,后者invert变量取得值为0x7FFFFFFF。
maxintensitydev:用于生成前景(有效像素区域)灰度值的常数值,实际样本的前景灰度值会根据这个参数结合随机数产生多种不同的灰度值。例如通过: -maxidev 220传入
maxxangle:对样本图片的x轴方向的扭曲的最大弧度,X轴即是图片水平方向的旋转。以弧度为单位,默认1.1
maxyangle:对样本图片的y轴方向的扭曲的最大弧度,Y轴即是图片竖直方向的旋转。以弧度为单位,默认1.1
maxzangle:对样本图片的z轴方向的扭曲的最大弧度,Z轴即是垂直于图像平面的方向的旋转(可理解为旋转轴是一条穿过显示器的垂线)。以弧度为单位,默认0.5。
showsamples:样本创建期间,是否通过imshow显示出每一个生成的样本图片出来。通过:-show来表示显示,没有则不显示
width:要创建的样本图片的宽度,后面的训练样本步骤要使用和这时一样的值,不然会报错,例如通过:-w 20来指定生成的正样本的宽度为20pix
height:要创建的样本图片的高度,后面的训练样本步骤要使用和这时一样的值,不然会报错,例如通过: -h 20来指定生成的正样本的宽度为20pix
}//第一个分支
else if( imagename && bgfilename && infoname )
{
cvCreateTestSamples(
infoname,
imagename,
bgcolor,
bgthreshold,
bgfilename,
num,
invert,
maxintensitydev,
maxxangle,
maxyangle,
maxzangle,
showsamples,
width,
height );
通过传入的单张图片扭曲变形来创建多个测试样本,如果传入了单张样本图片路径,负样本图片路径清单,以及正样本路径清单,则走到这个分支:
infoname:在这个分支这个是生成的测试样本的路径清单。
bgfilename:背景图片路径描述清单,利用这里提供的背景图片作为背景创建测试图像。例如通过:-bg xxx/xxx/neg.txt来传入
其他参数都差不多意思,这里不在赘述
}//第二个分支
else if( infoname && vecname )
{
total = cvCreateTrainingSamplesFromInfo(
infoname,
vecname,
num,
showsamples,
width,
height );
如果没有指定单张图片路径,表示.通过描述文件的图片列表清单中创建训练样本,创建的训练正样本保存在vecname 指定的.vec文件中:
infoname:正样本的列表清单文件。例如通过:-info xxx/xxx/xxx/pos.info来传入。
其他的与前面分支类似,不赘述
}//第三个分支
else if( vecname )
{
cvShowVecSamples( vecname, width, height, scale );
如果只有指定了正样本的vecname文件,则显示VEC文件中的样本图片:
scale:指定显示是否缩放图片大小及缩放的大小 。
}//第四个分支
这个程序调用的是以下这个函数来训练分类器
cvCreateTreeCascadeClassifier(
dirname,
vecname,
bgname,
npos,
nneg,
nstages,
mem,
nsplits,
minhitrate,
maxfalsealarm,
weightfraction,
mode,
symmetric,
equalweights,
width,
height,
boosttype,
stumperror,
maxtreesplits,
minpos,
bg_vecfile );
这个可执行程序用来训练分类器,位于调用\opencv\build\common目录下,老版本的名字为haartraining.exe:
dirname:通过-data传入的目录名,用来存放训练好的分类器,如果不存在训练程序自行创建。
vecname:通过-vec传入的正样本.vec文件,由opencv_createsamples生成的统一尺寸的正样本集。
bgname: 通过-bg传入的负样本图片目录清单,
npos:通过-npos传入的每级分类器所需的正样本数目 。
nneg:通过-nneg传入的每组分类器所需的负样本数目,可以大于bgname文件清单中列出的负样本数目。
nstages:通过-nstages传入,想要训练的分类器的级数,每级是一个强分类器,每个强分类器又有若干弱分类器。
mem:通过-mem传入的预先计算的以MB为单位的可用内存。内存越大则训练的速度越快。
nsplits:通过-nsplits传入的每个弱分类器特征个数(一般为1) 。
minhitrate:通过-minhitrate传入,该参数决定分类器的每一级强分类器最小检测率, 默认0.995。具体实现就是针对每一个正样本累加这级强分类器的所有弱分类器的置信度,然后对所有正样本得到的累加置信度按从小到大排序,因为minhitrate决定至少要分对minhitrate*npos个正样本,所以取第(1.0-minhitrate)*npos正样本的置信度为这级强分类器的阈值,通过这个阈值将大于这个阈值的分为正类,否则分为负类。所以minhitrate这个值决定每级分类器的正样本的正检率,总的正检率为minhitrate^nstages。
maxfalsealarm:通过-maxfalsealarm传入,决定了分类器的每一级强分类器的分负样本分错的最大比例,它决定了该强分类器的弱分类器的个数。默认0.5。它具体的实现是,前面通过minhitrate参数与弱分类器的置信度累加和,得到了该强分类器的阈值后,通过这个阈值来分类负样本,负样本的分错个数不能超过numneg*maxfalsealarm,如果超过则继续训练本级强分类器,增加新弱分类器直到的阈值将负样本分错个数小于numneg*maxfalsealarm为止就跳出循环,那本级强分类器训练成功。
weightfraction:通过-weighttrimming传入,在每级强分类器的训练中每训练一个弱分类器前将所有样本中,包括正样本与负样本,按权重从小到大排列将权重最低的weightfraction*(npos+nneg)的样本去除掉,因为权重很小说明这个样本总能被正确分类了,删除这些已经能正确分类的样本,让训练更多集中于还不能正确分类的样本上,提高训练效率。默认为0.95。
mode:通过-mode传入,它指出了训练时用哪些模板haar特征,有三个枚举值,mode==0表示Viola提出的原始矩形特征,mode==1表示所有垂直的haar特征,mode==2表示所有特征。默认为0。
symmetric:通过-sym或-nonsym传入,它指出了正样本是否垂直对称。
equalweights:通过-eqw传入,如果有-ewq则equalweights值为1.否则默认为0。1表示所有样本的初始化权重相等,0表示不等。
width:通过-w传入,指出正样本的宽
height:通过-h传入,指出正样本的高
boosttype:通过-bt传入,分为四类值{ “DAB”, “RAB”, “LB”, “GAB” } :0 - Discrete AdaBoost ,1 - Real AdaBoost ,2 - LogitBoost ,3 - Gentle AdaBoost 分别代表4个应用的boost算法的种类,默认为Gab
stumperror:通过-err传入,它指出了四种在训练弱分类器时的计算阈值方法:1.misclass 2.gini 3.entropy 4.least sum of squares。
maxtreesplits: 通过-maxtreesplits传入,表示树节点数的最大值。一般为0。
minpos:能过-minpos传入,训练过程中,节点可使用的正样本数目。正样本根据节点被分类,通常来说,minpos不小于npos / nsplits
bg_vecfile:通过-bg-vecfile传入,如果有参数-bg-vecfile传入表示其值为true,则表示负样本与正样本类似是.vec文件的形式传入,否则负样本是以图片路径清单形式传入,它决定了读取负样本的形式。
感谢:::::
http://blog.csdn.net/xidianzhimeng/article/details/10470839
http://blog.csdn.net/xidianzhimeng/article/details/42147601
http://www.cnblogs.com/chensheng-zhou/p/5542887.html
http://blog.sina.com.cn/s/blog_5f853eb10100sdgn.html
http://blog.csdn.net/ding977921830/article/details/46723027
http://blog.csdn.net/u011583927/article/details/44892249
标签:else 分支 amp addclass 树节点 图片路径 stage hid show
原文地址:http://blog.csdn.net/lanxuecc/article/details/52597244