OpenCV中Adaboost训练的经验总结

转载 2016年08月30日 20:32:30

转载:http://blog.csdn.net/xidianzhimeng/article/details/42147601


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


有不对的地方请指教!

adaboost + cascade 以及在 opencv 中的使用 ------ 模型训练

本文主要说明如何时候用opencv中自带的工具opencv_createsamples和opencv_traincascade训练adaboost + cascade模型Boost核心思想通过对原始数...
  • yinglang19941010
  • yinglang19941010
  • 2016年11月29日 22:33
  • 1382

OpenCV中Adaboost训练的经验总结

关于使用OpenCV训练Adaboost的经验总结,互相交流,有不对的地方请指教!
  • xidianzhimeng
  • xidianzhimeng
  • 2014年12月25日 16:21
  • 18499

adaboost训练 之 弱分类器训练的opencv源码详解 1

adaboost训练弱分类器的原理见上一个博客::http://blog.csdn.net/lanxuecc/article/details/52681525 opencv中adaboost训练弱分...
  • lanxueCC
  • lanxueCC
  • 2016年09月28日 10:52
  • 1232

adaboost训练 之 弱分类器训练的opencv源码详解 2

接着上一个博客http://blog.csdn.net/lanxuecc/article/details/52688605在弱分类器训练的主体函数cvCreateCARTClassifier中我们看到...
  • lanxueCC
  • lanxueCC
  • 2016年09月28日 11:26
  • 1272

AdaBoost算法原理及OpenCV实例

在数据的挖掘和分析中,最基本和首要的任务是对数据进行分类,解决这个问题的常用方法是机器学习技术。通过使用已知实例集合中所有样本的属性值作为机器学习算法的训练集,导出一个分类机制后,再使用这个分类机制判...
  • dcrmg
  • dcrmg
  • 2016年11月04日 23:23
  • 3840

OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别

上一篇文章中介绍了如何使用OpenCV自带的haar分类器进行人脸识别(点我打开)。 这次我试着自己去训练一个haar分类器,前后花了两天,最后总算是训练完了。不过效果并不是特别理想,由于我是在自己...
  • hongbin_xu
  • hongbin_xu
  • 2017年07月03日 21:38
  • 2829

opencv haar+adaboost使用心得 .

最近在使用opencv里的haar+adaboost做检测,其实早在一年前的无锡已经看过用它做车徽检测,然后再做识别(大众,奔驰...)。这次终于要自己动手做了,网上有很多这方面的资料,感谢大家分享他...
  • liulina603
  • liulina603
  • 2012年11月19日 08:48
  • 29254

基于HOG特征的Adaboost行人检测

申明,本文非笔者原创,原文转载自:http://blog.csdn.net/van_ruin/article/details/9166591 1.方向梯度直方图(Histogramo...
  • carson2005
  • carson2005
  • 2015年02月12日 17:35
  • 7284

Adaboost应用系列之三:Opencv2.4.X中利用Adaboost训练HOG特征产生xml分类器

http://opencv.org/downloads.html
  • u012564690
  • u012564690
  • 2014年01月14日 15:15
  • 7802

AdaBoost 人脸检测介绍(6) : 使用OpenCV自带的 AdaBoost程序训练并检测目标

如何创建用户自己的分类器,包括创建正负样本,使用OpenCV自带的AdaBoost程序训练样本,最后利用自己创建的分类器来进行人脸检测。...
  • nk_wavelet
  • nk_wavelet
  • 2016年09月22日 20:21
  • 1258
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV中Adaboost训练的经验总结
举报原因:
原因补充:

(最多只允许输入30个字)