基于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),则表示该该平滑窗内检测到目标,如(图一)所示。这样做的好处是不但通过多个弱分类器来形成一个强的级联分类器,而且可以减少运算量,比如当一个平滑窗第一个特征没有通过第一个分类器,那么就没有必要继续运算下去,直接拒绝掉当前平滑窗,转而处理下一个平滑窗,事实上作者的目的就是为了快速抛弃没有目标的平滑窗,从而达到快速检测目标。