【机器学习】传统目标检测算法之级联分类器Cascade

先附上参考文章吧。

文章其实是“P. Viola, M. Jones. Rapid Object Detection using a Boosted Cascade of Simple Features[J].CVPR, 2001”的学习笔记,下面第二个链接是文献的中英文版本。

https://www.cnblogs.com/YiXiaoZhou/p/5875492.html

https://www.cnblogs.com/wjgaas/p/3618557.html


基于AdaBoost的特征选择

实际应用中,对分类产生较大影响的往往只有少数的特征,比如传统的主成分分析方法(PCA)就是用来寻找这些对分类影响较大的特征,而论文中提取了180000多的特征,远远过完备(180000>>24*24),所以选择主要的特征是必要的。文中使用adaboost中的弱分类器实现特征的选择,在设计弱分类器时,仅考虑一维特征,选择误差最小的那个分类器作为该轮迭代产生的弱分类器,而对应的维度就是该轮迭代选择出的特征。其过程如下表:

【机器学习】传统目标检测算法之级联分类器Cascade

在之前的文章中已经介绍过adaboost的算法模型了,其有很重要的一点就是可以用来做特征选择。这里的adaboost每一轮只选出一个特征。通过迭代一定轮数,就可以构建出一个adaboost的强分类器,同时也自动做了特征选择。

级联分类器

为了提高人脸检测的速度和精度,最终的分类器还需要通过几个强分类器级联得到。在一个级联分类系统中,对于每一个输入图片,顺序通过每个强分类器,前面的强分类器相对简单,其包含的弱分类器也相对较少,后面的强分类器逐级复杂,只有通过前面的强分类检测后的图片才能送入后面的强分类器检测,比较靠前的几级分类器可以过滤掉大部分的不合格图片,只有通过了所有强分类器检测的图片区域才是有效人脸区域。

【机器学习】传统目标检测算法之级联分类器Cascade

到这里,应该能搞懂级联分类器Cascade做了什么事情。

AdaBoost训练出来的强分类器一般具有较小的误识率,但检测率并不很高。正确率就是TPR,误检率就是FPR。

【机器学习】传统目标检测算法之级联分类器Cascade

较小的误实率的意思就是给我一个人脸特征,我有很大的概率可以把它判别为人脸特征。检测率不是很高的意思就是给我一个不是人脸的特征,我也有不小的概率将它划分为人脸特征。

一般情况下,高检测率会导致高误识率,这是强分类阈值的划分导致的,要提高强分类器的检测率就要降低阈值,要降低强分类器的误识率就要提高阈值,这是个矛盾的事情。据参考论文的实验结果,增加分类器个数可以在提高强分类器检测率的同时降低误识率,所以级联分类器在训练时要考虑如下平衡,一是弱分类器的个数和计算时间的平衡,二是强分类器检测率和误识率之间的平衡。

假设AdaBoost分类器要实现99%的正确率,1%的误检率需要200维特征,而实现具有99.9%正确率和50%的误检率的AdaBoost分类器仅需要10维特征,那么通过级联,假设10级级联,最终得到的正确率和误检率分别为(这个例子既考虑了特征个数既弱分类器个数又考虑了分类器检测率与误识率):

【机器学习】传统目标检测算法之级联分类器Cascade

这个公式应该很好理解,因为多个强分类器之间是串行的。

可以看到通过级联adaboost分类器们能够使用较少的特征和较简单的分类器更快更好的实现分类。

另外在检测的过程中,因为TPR较高,所以一旦检测到某区域不是目标就可以直接停止后续检测。由于在人脸检测应用中非人脸区域占大部分,这样大部分检测窗口都能够很快停止,是分类速度得到很大的提高。

级联分类器的训练过程

【机器学习】传统目标检测算法之级联分类器Cascade

这个训练流程与普通的训练稍微有点不一样。

第一层强分类器的样本的为全部样本,有正有负,第二层强分类的样本为第一层分类器预测正的那一部分,其中错分的作为负样本,正确的就是正样本,一次类推。