本文转载自http://blog.csdn.net/marvin521/article/details/9173645,转载为了以后阅读方便,如有侵权,请联系,立刻删除。
基于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