紧接上一篇文章http://blog.csdn.net/xiao_lxl/article/details/44645969 OpenCV 级联分类器训练(一)——步骤和方法
级联分类器训练中命令行和训练过程中参数注释:
命令行:
-data: 指定生成的文件目录
-vec: vec文件名(.vec)
-bg: 负样本描述文件名(.dat)
-npos: 在每个阶段用来训练的正样本数目
-neg: 在每个阶段用来训练的负样本数目,这个值可以设置大于真正的负样本图像数目,因为程序会自动从负样本图像中切割出和正样本大小一致的图像块,这个参数一般设置为正样本数目的1~3倍。
-nstages:训练级数,推荐使用15~20,一般层数越高,耗时越长。
-mem: 程序可使用的内存,一般设为256即可。实际运行时一般不怎么占用内存,以MB为单位
-nonsym: 后面不用跟参数,用于指定目标对象是否垂直对称
-minhitrate:最小命中率,即训练目标的准确度。这里设为0.99。
-maxfalsealarm:最大虚警(误检率),每层训练到这个值小于0.5时结束,进入下一级训练。
-weighttrimming:指定是否使用权修正和使用多大的权修正,一般选择0.9.
-mode:all指定Harr类型,BASIC仅仅使用垂直特征,ALL使用垂直以及45度旋转特征
-w: 正样本图像的宽,训练样本的尺寸必须和训练样本创建的尺寸相同
-h: 正样本图像的高
注意:
1)最大虚警率-maxfalsealarm和最小命中率-minhitrate的设置的关联性。
系统首先根据命中率进行分类,然后计算虚警率,如果虚警率高于最大虚警率,则系统就抛弃该分类器,而建立下一个分类器。
虚警率和命中率是每阶训练产生的相应值级联,每阶训练结束后虚警率和命中率都会进行更新。
2)分类器训练过程中的阶数设置。训练的阶数的选择,根据提供的正负样本的数量进行设置。
如果正负样本较少,最好不要把阶数设置过大,这会使训练程序出错,训练不成功。
如果分类器效果不好,还可以在原来训练成果的分类器基础上,增加训练阶数接着进行训练,这样会使样本误判的概率下降。
3)正负样本比例问题:比例大约1:3的样子比较好,1:3或者1:4训练出来的分类器要优于1:1或者1:9,原因是正负样本比例接近时,对负样本的命中程度低(实际中负样本肯定远远多于正样本),正负样本比例较大(比如1:9)时,重视负样本的统计特性而忽略了正样本的统计特性,造成正样本权重总和小,当权重小于一定程度的时候可能很大一部分正样本都不参与训练了(在weightTrimRate=0.95时)。
4) minHitRate:分类器的每一级希望得到的最小检测率。总的检测率大约为minHitRate ^ numStages。影响每个强分类器阈值,当设置为0.95时如果正训练样本个数为12000个,那么其中的600个就很可能被判别为负样本,第二次选择的时候必须多选择后面的600个,按照这种规律我们为后面的每级多增加numPos*minHitRate个正样本,根据训练的级数可以得到如下公式
numPos+(numStages-1)*numPos*(1-minHitRate),即需要准备的训练正样本个数
5) maxFalseAlarm:分类器的每一级希望得到的最大误检率。总的误检率大约为maxFalseAlarm ^ numStages,.影响每个强分类器中弱分类器的个数,设置较大,每级可以滤除负样本的比例就较小,这样在测试过程中虚警率就较高;设置较小,每级强分类器中弱分类器的个数就较多,检测时间就会相对要长,在可以接受的检测时间下尽量降低maxFalseAlarm是我们要追求的目标
关于负样本的选择,因为每级剩下的负样本个数低于numNeg*maxFalseAlarm,在第二轮选择的时候从之前选择的负样本后面继续选择,而不是重头开始将选择过的负样本也包含进来,只有当遍历完一遍负样本列表后才重头在扫描一遍
6) weightTrimRate:影响参与训练的样本(不管是正样本还是负样本),当更新完样本权重之后,将样本权重按照从小到大的顺序排列,从后面开始累加样本权重大于weightTrimRate时,前面的样本就不参与后面的训练了
7) maxWeakCount:决定每级强分类器中弱分类器的最大个数,当FA降不到指定的maxFalseAlarm时可以通过指定最大弱分类器个数停止单个强分类器。
8) boost参数(maxDepth、bt):影响决策树构建的法则以及权重更新策略
训练过程中出现的dos窗口:
N: 训练层数
SMP: 样本占总样本个数
F:
ST.HR: 阈值
HR: 击中率
FA: 虚警,只有当每一层训练的FA低于你命令中设置的maxfalsealarm数值,才会进入下一级训练
EXP.ERR: 经验错误率
Parentnode:9 表示现在训练到第9级。