adaboost训练之经验总结

本文总结了Adaboost训练过程中的关键注意事项,包括正负样本选择、参数设置及训练过程中的常见问题解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:http://blog.youkuaiyun.com/xidianzhimeng/article/details/42147601 

http://blog.youkuaiyun.com/lliming2006/article/details/76019135

对以上的博客汇总了一下,在训练上不断调整,期待分类器的表现。

利用adaboost训练的分类器做了几个项目(当然在实际应用过程中,我对adaboos的源码做了优化和改善,同时我也用了深度学习--caffe做了类似的工作,综合权衡算法检测率、算法效率,在项目中采用的还是adaboost,后期我会花大量时间对caffe改进、优化), 以下纯为训练前要注意的事项。

0、训练前,正样本尺寸的选择很重要。


1、训练时正样本的设置:越多越好,但是要考虑训练机器的内存。在训练前,正样本设置的通用公式为:posNum+numStages*[(1-minHitRate)*posNum +50~300]<total_posNum,.因此要引起注意。
   A、原因:每完成训练一层后,即将开始的那一层将从numStages*[(1-minHitRate)*posNum +300~600]个正样本中选取设定的(训练前就设定)正样本中数量。
   B、后果:如果不注意正样本的的设定公式,分类器很可能训练不到你设定的阶数。
   C、举例: 训练时屏幕会有该层的信息行:POS cout :consumed 110000:123188,意即是从123188个正样本中选取110000个正样本来训练。如果想训练到30层,但总正样本个数是150000,而训练开始前参数设定为130000,minHitRate为0.99,那铁定训练不到20层。因为训练到到第12层时,尽管第12层也只训练130000个正样本,但是这些正样本是从130000+12*[(1-0.99)*130000+100]=151100中选取的,该数量已经超过了正样本总数150000,因此12层的训练无法进行(训练窗口会提示取不到足够的正样本)。
   

2、训练时负样本的选择应注意:
   A、正负样本的比例在1:2~1:3之间较好,具体多少需要自己做实验,有条件的话建议用服务器同时训练几个不同比例额的分类器,从中选取合适的,如1:2,1:2.3,1:2.5,1:3比例的分类器。
   B、负样本的比例一定要大于正样本的比例,否则,训练到某一层时,adaboost会在收集负样本的循环中陷入死循环,造成好几天甚至训练会一直无法继续进行。因此,为保证负样本的通用性(训练别的不同尺寸的正样本的分类器也能用),W*H最好大于100*100。
   C、负样本图片数量的选取要多,少了在训练过程中就截取不到设定的负样本数量,(负样本的选取是训练程序自动经过这个流程:截取--检测-确定是否识别错,只有截取后检测为正样本的才当成负样本:因为它识别错了)。

3、正样本和负样本的共性:
   A、多样性方面:正负样本的多样性越多越好,越全面越好。与算法的术语“泛化性 ”同一个意思。
   B、相似度方面:负样本与正样本的相似度越大越好(非越小越好,否则训练会停在某一层,因为根据上面2-C条所说的,负样本都识别为负样本了:没有识别错,也就程序不能取得足够数量的负样本了,训练怎么能继续下去呢?)。
  

4、参数方面:
    A、minHitRate越大,准确性越高。其他的影响见上述1条列。
    B、maxfalsAlarmRate设置得越大,训练越快,同时生成分类器的大小越小。
    C、maxWeakCount:弱分类器个数,默认是100,设置越大训练越慢,生成的分类器文件也越大(该影响力次于maxfalsAlarmRate),误捡就越少(同一层的仅maxWeakCount不同的分类器相比)。
 
5、训练过程中的应注意的问题
   A、训练过程中遇到正负样本个数不足,比如:30个小时还是看不到训练或者提示样本不足,此时应:暂停(ctrl+c),然后添加正样本或者负样本。然后接着训练,但是在继续训练前要主要生成标注文件个正样本的vec。
   B、由于不知道哪一阶的分类器最佳,可以在全部层数训练完后、或者在训练过程中,生成各阶的分类器,具体方法是复制一份训练器的exe,利用“编辑”打开后修改其中的层数,然后运行即可。但是不能修改分类器参数后再继续训练。
   

    最后,随着分类器阶数的增加,分类器的准确性会下降、误捡也会下降,但是准确性(漏检)的下降较大。形象的比如是:“过五关斩六将”,过到第30关,准确性被斩了不少了。

    另:这些仅仅是训练时应注意的问题和方法。要想真正的掌握它,还是要看算法设计的思想、源码。

      最后,针对分类器层数越高,漏检越严重的现象,为了应用到实际的项目中,在优化代码的同时,我还通过分析分类中代价函数等函数的优缺点后,设计了一个类似与残差的补偿公式,经过训练后,分类器的检测准确率明显提高。


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

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

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

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

5 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值