OpenCV 4.10.0
开源计算机视觉
加载中...
搜索中...
无匹配项
使用 Haar 级联进行人脸检测

目标

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

基础知识

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

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

图片

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

但在我们计算出的所有这些特征中,大部分都是无关紧要的。例如,考虑下面的图像。顶部显示了两个好的功能。选定的第一个特征似乎关注眼睛区域通常比鼻子和脸颊区域更暗的特性。选定的第二个特征依赖于眼睛比鼻梁更暗的属性。但同一窗户应用在脸颊或其他任何地方都是无关紧要的。那么我们如何在 160000 多个特征中选择最好的特征?这是通过Adaboost 实现的。

图片

为此,我们对所有训练图像应用每一项特征。每种特征都会找到一个最佳阈值,此阈值将人脸分类为阳性和阴性。但显然,会出现错误或误分类的情况。我们选择错误率最低的特征,这意味着它们是最好区分人脸和非人脸图像的特征。(该过程并非如此简单。一开始给每张图像赋予相同的权重。每次分类之后,误分类图像的权重都会增加。然后再次进行相同的过程。计算新的错误率。新的权重也是如此。持续此过程,直到达到所需的准确度或错误率,或找到所需数量的特征为止)。

最终分类器是对这些弱分类器进行加权求和。它被称为弱分类器,因为它单独无法对图像进行分类,但与其他分类器一起形成了一个强分类器。该论文指出,即使 200 个特征也能提供具有 95% 准确度的检测。他们最终的设置包含约 6000 个特征。(想象一下从 16 万多个特征减少到 6000 个特征。这是一个很大的收获)。

现在您拍摄一张图像。取每个 24x24 的窗口。对其应用 6000 个特征。检查它是否为人脸。哇..哇..这样是不是有点低效且费时?是的,是这样。作者对此有一个很好的解决方法。

在图像中,大部分图像区域都是非人脸区域。因此,最好有一个简单的方法来检查窗口是否不是人脸区域。如果不是,则直接丢弃它。不要再次处理它。相反,重点放在可能有人脸的区域上。这样,我们可以找到更多时间来检查可能的人脸区域。

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

作者的检测器包含 6000 多个特征,有 38 个阶段,在前五个阶段中有 1、10、25、25 和 50 个特征。(上述图像中的两个特征实际上是从 Adaboost 获得的最佳两个特征)。据作者称,平均每子窗口评估出大约 6000 个特征中的 10 个特征。

因此,这是一个关于 Viola-Jones 人脸检测如何工作的简单直观解释。阅读论文了解更多详情。

Haar 级联在 OpenCV 中的检测

此处我们将处理检测。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 的画布元素。选择一张图像并单击试一试以查看结果。可以更改文本框中的代码以进行进一步调查。