OpenCV 4.11.0
开源计算机视觉
加载中…
搜索中…
未找到匹配项
使用 Haar 级联进行人脸检测

目标

  • 学习使用基于 Haar 特征的级联分类器进行人脸检测的基础知识
  • 将其扩展到眼睛检测等

基础知识

使用基于 Haar 特征的级联分类器进行目标检测是由 Paul Viola 和 Michael Jones 在 2001 年的论文“使用简单特征的增强级联进行快速目标检测”中提出的一种有效方法。这是一种基于机器学习的方法,其中级联函数是从大量正面图像和负面图像中训练出来的。然后将其用于检测其他图像中的物体。

在这里,我们将进行人脸检测。最初,该算法需要大量的正面图像(人脸图像)和负面图像(无脸图像)来训练分类器。然后我们需要从中提取特征。为此,使用下图所示的 Haar 特征。它们就像我们的卷积核。每个特征都是一个单值,通过从黑色矩形下像素的总和中减去白色矩形下像素的总和获得。

图像

现在,使用每个内核的所有可能的尺寸和位置来计算大量特征。对于每个特征计算,我们需要找到白色和黑色矩形下像素的总和。为了解决这个问题,他们引入了积分图像。它将计算像素总和的过程(无论像素数量有多少)简化为仅涉及四个像素的操作。

但是,在我们计算的所有这些特征中,大多数都是无关的。例如,考虑下图。顶行显示了两个良好的特征。选择的第一个特征似乎侧重于眼睛区域通常比鼻子和脸颊区域更暗的特性。选择的第二个特征依赖于眼睛比鼻梁更暗的特性。但是,在脸颊或任何其他地方应用相同的窗口是无关紧要的。那么我们如何从 160000 多个特征中选择最佳特征呢?这是通过 **Adaboost** 实现的。

图像

为此,我们将每个特征应用于所有训练图像。对于每个特征,它都会找到最佳阈值,该阈值将人脸分类为正面和负面。但显然,会出现错误或误分类。我们选择误差率最小的特征,这意味着它们是最佳区分人脸和非人脸图像的特征。(这个过程并不像这样简单。一开始每个图像都赋予相同的权重。每次分类后,误分类图像的权重都会增加。然后再次进行相同的过程。计算新的误差率。还有新的权重。该过程持续进行,直到达到所需的精度或误差率,或者找到所需的特征数量)。

最终分类器是这些弱分类器的加权和。它被称为弱分类器,因为它单独不能对图像进行分类,但与其他分类器一起构成一个强分类器。论文指出,即使只有 200 个特征也能提供 95% 的检测精度。他们的最终设置大约有 6000 个特征。(想象一下,从 160000 多个特征减少到 6000 个特征。这是一个巨大的进步)。

所以现在你拿一张图片。取每个 24x24 的窗口。将 6000 个特征应用于它。检查它是否是人脸。哇…哇…这难道不是效率低下且耗时吗?是的,它是。作者为此提供了一个很好的解决方案。

在一幅图像中,大部分图像区域是非人脸区域。因此,最好采用一种简单的方法来检查窗口是否不是人脸区域。如果不是,则立即将其丢弃。不要再次处理它。而是关注可能存在人脸的区域。这样,我们可以花更多时间来检查可能的人脸区域。

为此,他们引入了 **级联分类器** 的概念。不是将所有 6000 个特征应用于一个窗口,而是将特征分组到不同的分类器阶段并逐个应用。(通常,前几个阶段将包含非常少的特征)。如果一个窗口未能通过第一阶段,则将其丢弃。我们不考虑其上的剩余特征。如果通过,则应用第二阶段的特征并继续该过程。通过所有阶段的窗口都是人脸区域。计划如何!!!

作者的检测器有 6000 多个特征,38 个阶段,前五个阶段分别有 1、10、25、25 和 50 个特征。(上图中的两个特征实际上是从 Adaboost 中获得的最佳两个特征)。根据作者的说法,平均每个子窗口评估 6000 多个特征中的 10 个特征。

因此,这是对 Viola-Jones 人脸检测工作原理的简单直观解释。阅读论文以了解更多详细信息。

OpenCV 中的 Haar 级联检测

在这里,我们将处理检测。OpenCV 已经包含许多针对人脸、眼睛、微笑等预训练的分类器。这些 XML 文件存储在 opencv/data/haarcascades/ 文件夹中。让我们使用 OpenCV 创建人脸和眼睛检测器。

我们使用函数:**detectMultiScale (image, objects, scaleFactor = 1.1, minNeighbors = 3, flags = 0, minSize = new cv.Size(0, 0), maxSize = new cv.Size(0, 0))**

参数
图像类型为 CV_8U 的矩阵,包含检测到物体的图像。
objects矩形向量,每个矩形包含检测到的物体。矩形可能部分位于原始图像之外。
scaleFactor指定在每个图像比例下图像大小缩减多少的参数。
minNeighbors指定每个候选矩形应有多少个邻居才能保留它的参数。
flags参数与旧级联在函数 cvHaarDetectObjects 中的含义相同。它不用于新级联。
minSize最小可能的物体大小。小于此大小的物体将被忽略。
maxSize最大可能的物体大小。大于此大小的物体将被忽略。如果 maxSize == minSize,则模型在单个比例上进行评估。
注意
不要忘记删除 CascadeClassifier 和 RectVector!

试一试

使用上面的代码试用此演示。已经准备好了名为 haarCascadeDetectionCanvasInput 和 haarCascadeDetectionCanvasOutput 的画布元素。选择一张图像并单击“试一试”以查看结果。您可以更改文本框中的代码以进行更多调查。