参考: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关,准确性被斩了不少了。
另:这些仅仅是训练时应注意的问题和方法。要想真正的掌握它,还是要看算法设计的思想、源码。
最后,针对分类器层数越高,漏检越严重的现象,为了应用到实际的项目中,在优化代码的同时,我还通过分析分类中代价函数等函数的优缺点后,设计了一个类似与残差的补偿公式,经过训练后,分类器的检测准确率明显提高。