项目实战—人脸检测之级联分类器理论(一)
至本次教程开始,我们将进入实战篇,当然仍然会设计到一些理论部分,比如机器学习相关的知识,级联分类器等等。接下来,我们将使用OpenCV自带的级联分类器实现一个简单的人脸检测的功能。
首先逐步开始研究级联分类器。
级联分类器,即使用类 Haar 特征工作的级联增强分类器,是集成学习的一种特殊情况,称为 boost。它通常依赖于 Adaboost 分类器(以及其他模型,如 Real Adaboost、Gentle Adaboost 或 Logitboost)。
我们如何检测图上是否有人脸呢?有一种名为 Viola-Jones 的目标检测框架的算法,包括了实时人脸检测所需的所有步骤:
· 提取 Haar 特征,特征来自 Haar 小波
· 创建图像
· Adaboost 训练
· 级联分类器
Haar 特征选择
人脸上最常见的一些共同特征如下:
· 与脸颊相比,眼部颜色较深
· 与眼睛相比,鼻梁区域较为明亮
· 眼睛、嘴巴、鼻子的位置较为固定......
这些特征称为 Haar 特征。特征提取过程如下所示:
在上图中,第一个特征测量眼部和上脸颊之间的强度差异。特征值计算的方法很简单,对黑色区域中的像素求和再减去白色区域中的像素即可。
然后,将这个矩形作为卷积核作用到整个图像。为了不产生遗漏,我们需要用到每个卷积核的所有的维度和位置。简单的 24 * 24 的图像可能会产生超过 160000 个特征,每个特征由像素值的和/差组成。这样在计算上无法实现实时人脸检测。那么,该如何加快这个过程呢?
一旦通过矩形框识别到有用区域,则在与之完全不同的区域上就无需再做计算了。这一点可以通过 Adaboost 实现。
使用积分图像原理计算矩形框特征的方法更快。我们将在以后介绍这一点。
原始论文中提到几种可用于 Haar 特征提取的矩形框:
· 双矩形特征计算的是两个矩形区域内像素和的差,主要用于检测边缘 (a,b)
· 三矩形特征计算的是中心矩形和减去两个外部矩形和的差,主要用于检测线 (c,d)
· 四矩形特征计算的是矩形对角线对之间的差 (e)
特征提取完成后,使用 Adaboost 分类器将它们应用于训练集,该分类器结合了一组弱分类器来创建准确的集成模型。只需 200 个特征(最初是 16 万个),实现了 95%的准确率。该论文的作者提取了 6000 个特征。
积分图像
以卷积核的形式计算特征需要花费很长时间。出于这个原因,作者 Viola 和 Jones 提出了图像的中间表示:积分图像。积分图像的作用是仅使用四个值简单地计算矩形和。我们来看看它是如何工作的!
假设我们想要确定一个坐标为 (x,y) 的给定像素的矩形特征。然后,像素的积分图像是给定像素的上方和左侧的像素之和。
其中 ii(x,y) 是积分图像,i(x,y) 是原始图像。
当计算整个积分图像时,有一种只需要遍历一次原始图像的递归方法。实际上,我们可以定义以下一对递归形式:
其中 s(x,y) 是累积行和,而 s(x−1)=0, ii(−1,y)=0。
这是怎么实现的呢?假设我们想要估算区域 D 的像素总和。我们已经定义了 3 个其他区域:A,B 和 C。
· 点 1 处的积分图像的值是矩形 A 中的像素的总和。
· 点 2 处的值为 A + B。
· 点 3 处的值为 A + C。
· 点 4 处的值是 A + B + C + D。
因此,区域 D 中的像素之和可以简单地计算为: 4+1−(2+3)。
这样我们仅使用 4 个数组值就计算出了矩形 D 的值。
人们应该知道矩形在实际中是非常简单的特征,但对于人脸检测已经足够了。当涉及复杂问题时,可调滤波器往往更灵活多变。
使用 Adaboost 学习分类函数
给定一组带标签的训练图像(正负样本均有),Adaboost 用于:
· 提取一小部分特征
· 训练分类器
由于 16 万个特征中的大多数特征与之极不相关,因此我们设计一个增强模型的弱学习算法,用来提取单个矩形特征,将最好的正负样本区分开。
虽然这个过程十分的有效,但是仍然存在一个重大问题,而正是由于这个问题,导致了级联分类器的诞生,我们将在下一个教程中详述。