您的位置:首页 > 移动开发 > Objective-C

目标检测(Object Detection)原理与实现(五)

2013-06-25 21:25 519 查看
基于Cascade分类器的目标检测

       从今天开始进入基于机器学习的目标检测,前几节虽然也接触了一些机器学习的方法,但它主要是做辅助工作,机器学习的方法和非机器学习的方法结合在一起使用,说到这想起来前几天看到一位博士师兄发的笑话,说的是百度实验室:

      Theory is when you know everthing but nothing works.

      Practice is when everything works but no one knows why.

      In our lab,theory and practice are  combined:nothing works and no one knows why.

         目前而言,甭管理论好坏吧,只要实用就行,实用的未必是好理论,就像深度学习那样,不说太远了,继续今天的话题,Cascade是Paul Viola发表在2001年的CVPR上,2002年Rainer Lienhart等人改进了Paul的方法,主要是改进了特征并且分析了不同的boosting算法对分类性能的影响和计算复杂度,OpenCV实现的Cascade的分类器也是Rainer的改进版本。所谓不同的boosting算法就是说不同的Adaboost弱分类器,比如Discrete,
Real 和 Gentle Adaboost弱分类器,而Cascade(级联)分类器就是基于多个Adaboot弱分类器对不同的特征进行依次处理(分类)来完成对目标的检测,简单的说有多个Adaboost串起来,然后提取每个平滑窗(sliding window)上的不同特征,把这些特征依次放进不同的Adaboost弱分类器里判断,如果所有的弱分类器都判断正标签(1),则表示该该平滑窗内检测到目标,如(图一)所示。这样做的好处是不但通过多个弱分类器来形成一个强的级联分类器,而且可以减少运算量,比如当一个平滑窗第一个特征没有通过第一个分类器,那么就没有必要继续运算下去,直接拒绝掉当前平滑窗,转而处理下一个平滑窗,事实上作者的目的就是为了快速抛弃没有目标的平滑窗,从而达到快速检测目标。



(图一)
       知道了Cascade强分类器是基于Adaboost算法的,那我们先看下Adaboost弱分类器的工作原理吧

,直接上图,很简单,如图二所示:



(图二)
        但OpenCV里还不是用的这个Adaboost,而是用的Rainer等人改进的Gentle Adaboost弱分类器,Gentle Adabboost弱分类器的工作原理如(图三)所示:



(图三)
         Rainer等人比较了DiscreteAdaboost,Real Adaboost,Gentle Adaboost弱分类器,发现Gentle Adaboost弱分类器比其他两种效果,但是作者没有详细讨论为什么比他们好,作者只是给出了实际检测的性能比较分析图,我也没看出为什么,如果你们知道为什么,请毫不吝啬的告知,在此先谢过了,为了严谨,把三种分类器的性能分析比较图也发出来吧,如(图四)所示:



(图四)
         其中GAB表示Gentle Adaboost,RAB表示Real Adaboost,DAB表示Discrete Adaboost。

         好了,介绍完了分类器的工作原理,下面来看下使用的是什么特征。2001年Paul Viola的CVPR上用的几个不同的特征很简单,就是平滑窗内某些区域像素和的差值,比如(图五)所示的,外围黑色框表示平滑窗,窗内固定的位置有个黑白相间的矩形区域,黑色表示该位置上的像素每个权重都是负一(-1),白色位置上的像素权重为正一(1),然后权重于像素卷积得到的值就是特征值,就一个数字(说的白话一点,就是每个像素值乘上权值后,然后黑白相间的矩形区域相加),不同的黑白相间的矩形区域的计算得到不同的特征,作者还提出一个加速计算这个特征的方法,就是积分图,在此不说了,网上很多。



(图五)
         同样,OpenCV的实现也没有使用上述特征,而是使用了2002年Rainer 等人改进的Harr-like特征,计算方法也类似,如图六所示:



(图六)
        也是矩形区域,不过不同的特征变化的样式多了一些,Rainer也提出了一些快速计算方法,具体阅读参考论文吧。有了特征,有了级联分类器,就是训练和检测了。

        直接调用OpenCV的例子程序检测的效果如(图七)所示:



(图七)
         这节比较简单,只所以要说这个cascade分类器,是因为前一节用到了这个分类器用于检测人脸,而且后续也会出现cascade级联的思想,也可以给自己查漏补缺,写作仓促,难免有错,如发现请指出,谢谢。

      有人做过测试:Opencv的正脸检测精度是68.84058%

                                  Total images 1104

                                   Total correct  760

                                   Total false negatives 314

                                    Total false positives 30% 

                                    accurate  68.84058

                                   侧脸识别精度是33.00091

                                  Total images 1103

                                  Total correct 
364

                                  Total false  negatives 721

                                  Total false  positives 18

                                  % accurate
33.00091

参考文献:

       [1]Rapid Object Detection using a Boosted Cascade of Simple Features. Paul Viola

       [2]Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object  Detection. Rainer Lienhart, Alexander Kuranov, Vadim Pisarevsky

转载请注明来源:http://blog.csdn.net/cuoqu/article/details/9173645
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息