10年后再看Robust Real-Time Face Detection(二) 之学习分类函数

来源:互联网 发布:王国风云2 mac 编辑:程序博客网 时间:2024/05/29 17:59

给定我们一个特征集合, 一个训练样本集(也就是一幅幅样本图像。 图像可能是有人脸的图像(称为positive images), 图像也可能不含人脸的图像(negative images))。 那么我们的任务就是采用机器学习的算法学习一个分类函数。一旦学习到了这个函数, 我们就可以利用这个函数对一幅未知的图像进行分类了。 在机器学习领域中称为监督学习。

然而, 问题是, 对于每一个图像子窗口(each image sub-window), 我们都能够计算出与之相关的160,000个矩形特征,数目远远超过了窗口内像素的个数。 也就是这个窗口对应的特征向量的维数是相当大的。 尽管我们利用积分图能够很快地计算出矩形特征, 然而要计算如此大数目的矩形特征显然代价也是很昂贵的, 同时也是没必要的, 吃力不讨好。

这里, 我们利用实验上的一个假设, 就是我们可以从160,000个特征中只选择其中少量数目的特征, 用这些少量的, 高效的特征组建很有效的分类器。 这个主意很不错, 然而接下来, 我们就面对一个主要的挑战, 那就是如何从这么多的特征中, 选择出这些少量的, 具有点石成金作用的特征呢??

这并没有难倒大牛Viola Jones。 他解决这个问题的办法就是采用了Adaboost算法的一个变体(variant), 具体原理如下:

Adaboost学习算法的主要思想就是采用一组弱分类器组合成一个强的分类器, 从而提高分类的性能。 弱分类器的优点就是简单, 容易实现。 缺点就是“弱”, 也就是说弱分类器无法对我们的训练数据做出准确的分类(例如, 一个弱分类器可能在51%的时间内能够对一个训练样本做出准确的分类, 剩下的时间内可能对这个样本误分)。当第一个弱分类器实现对所有的训练样本分类后, 我们从这一级类器产生误分的样本选择出来, 然后增大这些误分样本的权重(或者说提高其被下一级弱分类器选中的概率), 重点关照。 然后重新分类。依次进行下去,。。, 最终, 我们将所有的弱分类器组合起来, 加权平均, 设定一个阈值, 作为新的强分类器的Perceptron,  这样我们就得到了一个强的分类器。

传统的Adaboost 如何能够帮助我们从如此大数量的矩形特征中选择出最佳特征呢? 不难类比得到, 其实Adaboost很容易被我们看成是贪婪的选择最佳特征的过程(a greedy feature selection process)。试想, 传统的Adaboost 其实就是通过采用一种贪婪的机制给好的分类函数更大的权重, 差的分类函数更小的权重, 然后组合起来, 最终我们得到了一个好的分流函数。在选择最佳的特征时候, 原理也是这样的。 我们所需要做的就是将我们的弱分类器的分类函数限制为为只依赖于一个特征的单变量函数。为了实现这个目标, 我们的弱学习算法只选择一个能够最佳的分类出我们训练样本的矩形特征(the single rectangle feature)。 对于每一个矩形特征,  找到一个阈值, 从而使得我们的弱分类器能够对我们的样本实现最小的误分率。 分类Perceptron函数如下:


其中, x 是图像的24 x 24像素子窗口(或者是检测子)。f是我们选择的一个的矩形特征,θ是我们找到的最佳阈值, p 代表记性(polarity), 表面不等式的方向。

事实上, 单单采用一个矩形特征对这个子窗口分类的误差是很大的。 能够达到0.1 ——0.3.。 当然这是第一轮的情况。 第二轮的时候, 误差达到了0.4——0.5。该算法的伪代码如下:





0 0
原创粉丝点击