本文主要参考了OpenCV的官方文档
http://docs.opencv.org/modules/ml/doc/boosting.html
boosting算法是一个监督式机器学习算法,它解决的是一个二元分类问题。本文包括对算法思想的理解,不包含算法的数学推导。
目标检测就是用这个分类算法,把只含有目标的图片作为一类,不含有目标的作为另一类,然后训练分类器,进行检测的时候,输入一张图片,用一个窗口扫描这个图片,对每个窗口应用分类器,返回是目标的类别时,就检测到了目标。
监督式机器学习目标是找到一个函数y=h(x),对于一个输入x,给出一个输出y,y如果是取几个离散的值,称为分类问题,y如果取连续的值,成为回归问题。函数h(x)需要对样本数据((Xi,Yi),i=1,2,…N,Xi是一个k维向量,是对特征的一个编码)训练得到h(x)的表达式,然后对于一个新的x,使用y=h(x)进行计算就可预测出y。一般会会为h(x)选择一个模型,只不过是包含参数的,训练就是指根据采集的样本数据把这个参数确定下来,使得这个参数确定后的模型能够很好的刻画输入x和输出y之间的函数关系。
Boosting(提升)这一概念为监督式分类学习问题提供了一种有力的解决方法。它通过结合许多弱分类器的性能来获得可靠的分类结果。弱分类器是指识别错误率仅仅比随机猜测好一点的分类器;强分类器指的是识别准确率很高并且能在多项式时间内完成的分类器。
Boosting有许多变式,有DiscreteAdaboost, Real AdaBoost, LogitBoost, and Gentle AdaBoost,这篇论文包含这些算法的详细介绍http://web.stanford.edu/~hastie/Papers/AdditiveLogisticRegression/alr.pdf
这四个是类似的,下面以DiscreteAdaBoost算法为例,介绍算法流程
第一步,需要采集样本,为每个样本编码特征向量,标记每个样本的类别
第二步,为每个样本初始化相同的权值1/N
第三步,在加权的样本集上训练弱分类器f_m(x),然后计算加权训练误差err_m和比例系数c_m,再然后更新权重,被错误分类的样本的权重被提升,然后归一化权重,这个过程再重复M-1次
第四步,输出最后的分类器
从OpenCV官网上看,这一句“Gentle AdaBoost and Gentle AdaBoost are often thepreferable choices. “,说明Gentle AdaBoost和Gentle AdaBoost在这四个算法中经常是是更可取的。
OpenCV对这四个算法都做了实现,对于做应用来说,不必去重复造轮子,关心接口就好了
如下?。。。