对adaboost+haar特征进行人脸检测的原理的认识

来源:互联网 发布:车易拍官网软件下载 编辑:程序博客网 时间:2024/06/02 00:12

          学习了adaboost两个星期了,对这个东西有一点点认识,就记录一下对它的认识吧。

          adaboost用于人脸检测是在Viola和Jones这两位大牛在《Rapid Object Detection using a Boosted Cascade of Simple Features》这篇论文上第一次提出的,而这个adaboost算法是Freund和Schapire这两位大牛的在《A Decision-Theoretic Generalization of On-Line Learning and an Application of Boosting》提出的,不过里面大量的数学公式,没时间来得及看,先留着吧。

        adaboost的基本原理如图1所示,有一堆篮球与红球,如果想用一根直线把红球跟篮球分开是不可能的,但是我们可以用多根直线来将它们分开。如图2所示,用两根直线将整张图划分


图1(来自网络)

成四个部分,其中三个部分都只有篮球,而另外一个部分有红球,就这样我们将红球与篮球区分开了。而adaboost算法就是基于这个原理,构造一个强分类器,这个强分类器由多个弱分类器组成,每个弱分类器只包含一个特征。从图1中我们可以看到,每个特征就是一条直线,一个弱分类器就是利用直线将这些球分成两部分。显然图1(a),图1(b)的划分有4个篮球归入到了红球堆中。而图1(c),图1(d)的划分使原本归入红球堆的四个篮球回到它们所属的篮球堆中,却有新的6个篮球被划分到红球堆中,图1中每个图展示的就是一个弱分类器。而图2中显示的就是一个强分类器。就结合图1中两个弱分类器,就可以将红球都归入到红球堆中,并将篮球正确地归入篮球堆中,从而将



图2(来自网络)

红球和篮球完全分开来。

         具体算法流程如图3所示,这个算法主要是多次迭代。在每次迭代中,先用上一次迭代得到的每个训练实例的权重,根据公式求出每个弱分类器的差值。然后找出所有特征中差值最低的弱分类器作为这次迭代的参考分类器。根据这个弱分类器的差值得到这个弱分类器的对应权值。然后用这个参考分类器来重新分配每个训练实例的权重。就这样多次迭代后,根据每次迭代所用的参考分类器及其对应的权值组成一个强分类器。



图3(来自《RapidObject Detection using a Boosted Cascade of Simple Features》)

         在理解了这个原理后,学习《RapidObject Detection using a Boosted Cascade of Simple Features》这篇论文就容易多了。在这篇论文中,作者是用haar特征来识别人脸的。为什么要用这个特征呢?因为我们人脸有很多特征适合这个haar特征。例如,两眼与鼻子就刚好与其中一个haar特征对应,如图4。所以,通过人脸的多个haar特征,可以组合成一个人脸的强分类器。而论文中之所以用级联的方式,我觉得是为了程序运行的快。因为一个强分类器里的弱分类器越多,它的运行的时间就越长。所以可以将一个强分类器拆成几个强分类器,每个强分类器筛掉不是人脸的图片,通过减少待选择的图片的数量,来使程序运行的更快。

         而如何实现这个算法呢?Opencv里已经写好了对应的函数,至于如何调用csdn找找就行了。而如何训练haar特征,生成xml文件,看这个网站:http://note.sonots.com/SciSoftware/haartraining.html

 

图4(来自网络)