这是一篇纯干货文章,旨在与AI初学者分享关于人脸检测的4种常见方法,以及它们的各自优缺点的对比。同时我也从一位资深的AI开发者角度,给大家提出一些个人的开发技巧和建议,便于大家找到适合自己需求的方法。

在本教程中,你们可以学习到 关于AI深度学习的人脸检测技巧、建议和最佳实践,以使用 OpenCV 和 dlib 实现高精度人脸检测。

AI人脸检测提示、建议和最佳实践

在本文的第一部分,首先我们来回顾在构建自己的计算机视觉管道时会遇到的四个主要人脸检测器,包括:

  • OpenCV 和 Haar 级联
  • OpenCV 基于深度学习的人脸检测器
  • Dlib 的 HOG + 线性 SVM 实现
  • Dlib 的 CNN 人脸检测器

然后我们将以上几种方法进行优缺点对比,以及我对何时应该使用给定人脸检测器的个人建议。

OpenCV 的 Haar 级联人脸检测器的优缺点

OpenCV 的 Haar 级联人脸检测器是库附带的原始人脸检测器。 它也是大多数人都熟悉的人脸检测器。速度非常快,但容易出现误报检测。

优点:

  • 非常快,能够超实时运行
  • 低计算要求 - 可以轻松地在嵌入式、资源受限的设备上运行,例如 Raspberry Pi (RPi)、NVIDIA Jetson Nano 和 Google Coral
  • 小模型大小(刚好超过 400KB;作为参考,大多数深度神经网络将在 20-200MB 之间)。

缺点:

  • 极易出现误报检测
  • 通常需要手动调整 detectMultiScale 函数
  • 远不及 HOG + 线性 SVM 和基于深度学习的人脸检测对应物那么准确

我的建议:当速度是你最关心的问题时,使用 Haar 级联,并且你愿意牺牲一些准确性来获得实时性能。

如果你正在使用 RPi、Jetson Nano 或 Google Coral 等嵌入式设备,请考虑:

  • 在 RPi 上使用 Movidius 神经计算棒 (NCS) — 这将允许你实时运行基于深度学习的人脸检测器
  • 阅读与你的设备相关的文档——Nano 和 Coral 有专门的推理引擎,可以实时运行深度神经网络

OpenCV 深度学习人脸检测器的优缺点

OpenCV 的深度学习 SSD 人脸检测器既快速又准确,能够在现代笔记本电脑/台式机 CPU 上实时运行。

OpenCV 的深度学习人脸检测器基于具有小型 ResNet 主干的单次检测器 (SSD),使其既准确又快速。

优点:

  • 准确的人脸检测器
  • 利用现代深度学习算法
  • 无需参数调整
  • 可以在现代笔记本电脑和台式机上实时运行
  • 模型大小合理(刚好超过 10MB)
  • 依赖 OpenCV 的 cv2.dnn 模块
  • 可以通过使用 OpenVINO 和 Movidius NCS 在嵌入式设备上提高速度

缺点:

  • 比 Haar 级联和 HOG + 线性 SVM 更准确,但不如 dlib 的 CNN MMOD 人脸检测器准确
  • 可能在训练集中存在无意识的偏见——可能无法像浅肤色的人那样准确地检测到深色皮肤的人

我的建议:OpenCV 的深度学习人脸检测器是“全能”检测器。 它使用起来非常简单,不需要额外的库,并且依赖于 OpenCV 的 cv2.dnn 模块,它已经被写到 OpenCV 库中。

此外,如果你使用的是嵌入式设备,例如 Raspberry Pi,可以插入 Movidius NCS 并利用 OpenVINO 轻松获得实时性能。

也许这个模型最大的缺点,是我发现对深色皮肤的人的面部检测不如浅肤色的人准确。 这不一定是模型本身的问题,而是它所训练的数据的问题——为了解决这个问题,我建议在更多样化的种族集上训练/微调人脸检测器。

dlib 的 HOG + 线性 SVM 人脸检测器的优缺点

HOG + 线性 SVM 是物体检测/人脸检测文献中的经典算法。当需要比 Haar 级联更高的准确性,但又无法承担基于深度学习的检测器的计算复杂性时,可以考虑采用它。

HOG + 线性 SVM 算法由 Dalal 和 Triggs 在其 2005 年开创性的著作《用于人体检测的定向梯度直方图》中首次引入。

与 Haar 级联类似,HOG + 线性 SVM 依赖于图像金字塔和滑动窗口来检测图像中的对象/人脸。该算法是计算机视觉文献中的经典之作,至今仍在使用。

优点:

  • 比 Haar 级联更准确
  • 比 Haar 级联更稳定的检测(即,要调整的参数更少)
  • 由 dlib 创建者和维护者 Davis King 专业实施
  • 在计算机视觉文献中的 dlib 实现和 HOG + 线性 SVM 框架方面都有很好的记录

缺点:

  • 仅适用于人脸的正面视图 — 由于 HOG 描述符不能很好地容忍旋转或视角的变化,因此不会检测到侧面人脸
  • 需要安装一个额外的库 (dlib) —— 本身不一定是一个问题,但如果你只使用 OpenCV,那么你可能会发现添加另一个库很麻烦
  • 不如基于深度学习的人脸检测器准确
  • 对于准确性,由于图像金字塔构造、滑窗和在窗口的每一站计算 HOG 特征,它实际上在计算上非常昂贵

我的建议:HOG + Linear SVM 是每个计算机视觉开发者都应该了解的经典对象检测算法。 也就是说,对于 HOG + 线性 SVM 提供的准确性,算法本身非常慢,尤其是当你将其与 OpenCV 的 SSD 人脸检测器进行比较时。

我倾向于在 Haar 级联不够准确的地方使用 HOG + 线性 SVM,但我不能承诺使用 OpenCV 的深度学习人脸检测器。

dlib 的 CNN 人脸检测器的优缺点

Dlib 的 CNN 人脸检测器是最准确的,但速度很慢。 当你需要准确性高于一切时,可以使用它。

dlib 的创建者 Davis King 基于他在最大边缘对象检测方面的工作训练了一个 CNN 人脸检测器。 由于算法本身的设计,以及 Davis 在管理训练集和训练模型时所付出的努力,该方法非常准确。也就是说,如果没有 GPU 加速,这个模型就无法实时运行。

优点:

  • 令人难以置信的准确人脸检测器
  • 模型尺寸小(小于 1MB)
  • 专业实施和记录

缺点:

  • 需要安装额外的库 (dlib)
  • 代码更冗长——如果使用 OpenCV,最终用户必须注意转换和修剪边界框坐标
  • 没有 GPU 加速就无法实时运行
  • 通过 OpenVINO、Movidius NCS、NVIDIA Jetson Nano 或 Google Coral 进行加速,不是开箱即用的兼容

我的建议:在离线批量处理人脸检测时,我倾向于使用 dlib 的 MMOD CNN 人脸检测器,这意味着我可以设置我的脚本并让它以批处理模式运行,而不必担心实时性能。

事实上,当我为人脸识别构建训练集时,我经常在训练人脸识别器本身之前使用 dlib 的 CNN 人脸检测器来检测人脸。当我准备好部署我的人脸识别模型时,我会经常将 dlib 的 CNN 人脸检测器换成一个可以实时运行的计算效率更高的人脸检测器(例如,OpenCV 的 CNN 人脸检测器)。

我倾向于不使用 dlib 的 CNN 面部检测器的唯一地方是当我使用嵌入式设备时。 该模型不会在嵌入式设备上实时运行,它与 Movidius NCS 等开箱即用的嵌入式设备加速器不兼容。

也就是说,你无法超越 dlib 的 MMOD CNN 的人脸检测精度,因此,如果需要准确的人脸检测,请使用此模型。

我个人对人脸检测方法的建议

要获得良好的全方位人脸检测器,请使用 OpenCV 的基于深度学习的人脸检测器。它准确且能够在现代笔记本电脑和台式机上实时运行。

当谈到一个好的、通用的人脸检测器时,我建议使用 OpenCV 的 DNN 人脸检测器:

  • 它实现了速度和准确性的良好平衡
  • 作为基于深度学习的检测器,它比 Haar 级联和 HOG + 线性 SVM 对应物更准确
  • 它足够快,可以在 CPU 上实时运行
  • 可以使用 USB 设备(例如 Movidius NCS)进一步加速
  • 不需要额外的库/包——人脸检测器的支持通过 cv2.dnn 模块烘焙到 OpenCV 中

也就是说,有时候你会想要使用上面提到的每个人脸检测器,因此请务必仔细阅读每个部分。

拓展阅读

我们TSINGSEE青犀视频的研发人员近期也在积极开发人脸检测、人脸识别、人流量统计、安全帽检测等AI技术,并积极融入到现有的视频平台中。典型的示例如EasyCVR视频融合云服务,具有AI人脸识别、车牌识别、语音对讲、云台控制、声光告警、监控视频分析与数据汇总的能力,广泛应用在小区、楼宇的智能门禁,周界可疑人员徘徊检测、景区人流量统计等场景中。