OpenCV中Adaboost训练的经验总结

以OpenCV训练级联Adaboost为例进行说明
numPos: 12000
numNeg: 120000
numStages: 15
precalcValBufSize[Mb] : 1000
precalcIdxBufSize[Mb] : 800
stageType: BOOST
featureType: HOG
sampleWidth: 40
sampleHeight: 40
boostType: DAB
minHitRate: 0.999
maxFalseAlarmRate: 0.7
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 150
===== TRAINING 0-stage =====
<BEGIN
POS count : consumed   12000 : 12000
NEG count : acceptanceRatio    120000 : 1
+----+---------+---------+
|  14| 0.999083| 0.684617|
+----+---------+---------+
===== TRAINING 1-stage =====
<BEGIN
POS count : consumed   12000 : 12011
NEG count : acceptanceRatio    120000 : 0.688808
+----+---------+---------+
|  24| 0.999083| 0.695967|
+----+---------+---------+
===== TRAINING 2-stage =====
<BEGIN
POS count : consumed   12000 : 12022
NEG count : acceptanceRatio    120000 : 0.470459
+----+---------+---------+
|  35| 0.999083|  0.68575|
+----+---------+---------+
===== TRAINING 3-stage =====
<BEGIN
POS count : consumed   12000 : 12033
NEG count : acceptanceRatio    120000 : 0.544413
+----+---------+---------+
|  59| 0.999083|   0.6992|
+----+---------+---------+
===== TRAINING 4-stage =====
<BEGIN
POS count : consumed   12000 : 12044
NEG count : acceptanceRatio    120000 : 0.377264
+----+---------+---------+
| 103| 0.999083| 0.671933|
+----+---------+---------+


1 正负样本比例问题:1:4或者1:5训练出来的分类器要优于1:1或者1:10
正负样本比例接近的时候1:1,对负样本的看中程度很低,在实际的生活中负样本肯定远远多于正样本
正负样本比例较大的时候1:10,对负样本多于看中而忽略了正样本的统计特性,造成正样本权重总和很小,当权重小于一定程度的时候可能很大一部分正样本都不参与训练了(在weightTrimRate=0.95时),那么假设没有正样本参与训练了,只有负样本参与后续训练,训练出来的分类器会是什么样子的呢?
不管是目标检测问题与单纯数据分类问题我们都不可以专门针对负样本进行训练,这样的训练是无意义的
因此我们只能尽可能保证不过分看中负样本的情况下尽量增加负样本的个数,对于正样本的个数,比如人脸检测至少需要上万或者几十万的正样本吧,这个没有较好的结论,如果有人知道OpenCV公开的haarcascade_frontalface_alt.xml的参数请指教一下。

2 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个的情况就是上面所说的”可能有问题“

3 maxFalseAlarm:影响每个强分类器中弱分类器的个数,设置较大,每级可以滤除负样本的比例就较小,这样在测试过程中虚警率就较高;设置较小,每级强分类器中弱分类器的个数就较多,检测时间就会相对要长,在可以接受的检测时间下尽量降低maxFalseAlarm是我们要追求的目标
关于负样本的选择,因为每级剩下的负样本个数低于numNeg*maxFalseAlarm,在第二轮选择的时候从之前选择的负样本后面继续选择,而不是重头开始将选择过的负样本也包含进来,只有当遍历完一遍负样本列表后才重头在扫描一遍

4 weightTrimWeight:影响参与训练的样本,不管是正样本还是负样本,当更新完样本权重之后,将样本权重按照从小到大的顺序排列,当从后累加样本权重不小于weightTrimWeight时前面的样本就不参与后面的训练了,这里有一个优化是等于该阈值的样本还是参与训练的,这样可以在保证训练精度的基础上缩短检测时间,因为我们认为是样本权重很小的时候表示该样本被正确分类了,而忽略了样本很多的时候,尽管样本没有被正确分类,也可能被排除在外了。还有一种情况就是正样本比例悬殊的时候,例如1:20,当正样本完全分类正确了,那么正样本比例总和仅占4.8%,后续参与训练的正样本可能就没有了

5 maxWeakCount:决定每级强分类器中弱分类器的最大个数,当FA降不到指定的maxFalseAlarm时可以通过指定最大弱分类器个数停止单个强分类器

6 boost参数(maxDepth、bt):影响决策树构建的法则以及权重更新策略
至于Gentle AdaBoost.考虑到(AdaBoost对”不像”的正样本权值调整很高,而导致了分类器的效率下降),而产生的变种算法.它较少地强调难以分类的样本.
Rainer Lienhart, Alexander Kuranov, Vadim Pisarevsky在论文Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection中提出 在stump弱分类器(即每个弱分类器使用一个特征进行分类)上进行的对比试验中,Gentle的结果明显好于Real和 Discrete.


有不对的地方请指教!

训练时存储在变量中的参数(9个参数)

参数 说明
data 训练的分类器的存储目录
vec 正样本文件,由open_createsamples.exe生成,正样本文件后缀名为.vec
bg 负样本说明文件,主要包含负样本文件所在的目录及负样本文件名
numPos 每级分类器训练时所用到的正样本数目,应小于vec文件中正样本的数目,具体数目限制条件为:numPos+(numStages-1)numPos(1-minHitRate)<=vec文件中正样本的数目
numNeg 每级分类器训练时所用到的负样本数目,可以大于-bg指定的图片数目
numStages 训练分类器的级数,强分类器的个数
precalcValBufSize 缓存大小,用于存储预先计算的特征值,单位MB
precalcIdxBufSize 缓存大小,用于存储预先计算的特征索引,单位MB
baseFormatSave 仅在使用Haar特征时有效,如果指定,级联分类器将以老格式存储

存储在参数类中的参数()

1、存储CvCascadeParams的对象中的参数(4个参数)

参数 说明
stageType 级联类型,目前只能取BOOST
featureType 训练使用的特征类型,目前支持的特征有Haar,LBP和HOG
w 训练的正样本的宽度,Haar特征的w和h一般为20,LBP特征的w和h一般为24,HOG特征的w和h一般为64
h 训练的正样本的高

2、存储在CvCascadeBoostParams的对象中的参数(6个参数)

参数 说明
bt 训练分类器采用的Adaboost类型
minHitRate 影响每个强分类器阈值,每一级分类器最小命中率,表示每一级强分类器对正样本的的分类准确率
maxFalseAlarm 最大虚警率,影响弱分类器的阈值,表示每个弱分类器将负样本误分为正样本的比例,一般默认值为0.5
weightTrimRate 0-1之间的阈值,影响参与训练的样本,样本权重更新排序后(从小到大),从前面累计权重小于(1-weightTrimRate)的样本将不参与下一次训练,一般默认值为0.95
maxDepth 每一个弱分类器决策树的深度,默认是1,是二叉树(stumps),只使用一个特征。
maxWeakCount 每级强分类器中弱分类器的最大个数,当FA降不到指定的maxFalseAlarm时可以通过指定最大弱分类器个数停止单个强分类器
mode 值为BASIC、CORE、ALL三种,根据值不同采用不同的Haar特征,BASIC是基本的Haar特征,CORE是所有的上下Haar特征,ALL是使用所有的Haar特征

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值