作者:陈张杰(计算机科学与工程系,本科生)
人脸检测是一种计算机视觉任务,其中计算机程序检测到人脸的存在,并找到它们在图像或视频流中的位置。这项技术一直在快速发展和成熟,并开发了各种模型。人脸检测的流行也导致人们对性能、检测率、准确性以及其他一些方面提出了要求,这些方面会影响人们选择使用哪个模型。
基于 Haar 特征的级联分类器由 Paul Viola 和 Michael Jones 于 2001 年提出。它是一种经典的特征提取算法,可以使用 Haar 特征有效地检测特定物体。它的效率通过积分图得到提升。AdaBoost 算法用于训练强分类器。基于 Haar 特征的级联分类器因其卓越的性能而在人脸检测中得到广泛应用。
YuNet 是一种基于卷积神经网络 (CNN) 的人脸检测器,由 Yu Shiqi 于 2018 年开发,并在 2019 年开源。它是一个功能强大的轻量级模型,可以加载到许多设备上。据称 YuNet 不仅可以达到每秒 1000 帧的效率,而且还具有高性能的准确性。YuNet 还因其识别困难的侧面和遮挡人脸的能力而闻名。
当用户需要一个用于人脸检测的模型时,是否继续使用传统的分类器或转向基于神经网络的更新方法已成为一个问题。许多人可能认为传统方法易于训练、计算能力消耗少,并且可以有效地检测人脸。但这种观点是否仍然正确?本文将通过一系列测试比较这两个模型的性能,并证明YuNet 在检测率和效率方面都远远超过了传统的分类器。
- 测试平台:Windows10 x64 Intel(R) Core(TM) i7-10710U CPU @ 1.10GHz 1.61 GHz
- 测试参数:级联分类器:使用默认值(ScaleFactor=1.1,MinNeighbors=2)YuNet:使用默认值(ConfThreshold=0.9,NmsThreshold=0.3)
- 时间成本测量:重复检测 100 次,然后计算平均时间成本。
测试 1
测试图像大小: 320*320
测试结果:
模型 | 检测次数 | 时间消耗 |
---|---|---|
级联分类器 | 8 | 25.81 毫秒 |
YuNet | 8 | 5.09 毫秒 |
这两个模型都成功地检测到所有八张正面人脸,这意味着它们对未遮挡的正面人脸具有可接受的检测率。
然而,在时间成本方面,YuNet 只花了级联分类器所用时间的 1/5。
测试 2
测试图像大小: 320*320
测试结果:
模型 | 检测次数 | 时间消耗 |
---|---|---|
级联分类器 | 7 | 24.00 毫秒 |
YuNet | 10 | 5.36 毫秒 |
测试 2 重点关注模型检测侧面和遮挡人脸的能力,这些面孔存在于上述测试图像中。
YuNet 正确地检测到 10 张人脸,而级联分类器只检测到 7 张。这表明 YuNet 在检测侧面和遮挡人脸方面比传统方法具有更高的检测率。
时间成本与之前的测试类似。
测试 3
测试图像大小:320*320
测试结果
模型 | 检测次数 | 时间消耗 |
---|---|---|
级联分类器 | 7 | 24.58 毫秒 |
YuNet | 37 | 5.12 毫秒 |
测试 3 使用最大自拍作为测试图像,包含各种比例的人脸。
结果表明,Haar 级联分类器只正确地检测到 6 张人脸,它无法检测到规模较小的人脸,并且还存在误检。YuNet 也难以识别较小的人脸,但它正确地识别出图像前半部分的 37 张人脸,是级联分类器结果的六倍。这说明YuNet 在检测各种比例的人脸方面比级联分类器表现更好。
在时间消耗方面,YuNet 的效率仍然远远高于传统方法。可以得出结论,传统方法在对 320*320 图像应用人脸检测时大约需要 25 毫秒,而 YuNet 可以保持在 5 毫秒左右。
测试 4
测试图像大小:640*640
测试结果
模型 | 检测次数 | 时间消耗 |
---|---|---|
级联分类器 | 29 | 111.26 毫秒 |
YuNet | 137 | 22.32 毫秒 |
测试 4 试图证明 YuNet 的优势在更大的输入大小上仍然存在。
值得注意的是,在图像大小扩大后,Haar 特征分类器正确地检测到更多的人脸,但这项改进仍然无法与 YuNet 的改进相比:在本测试中,传统方法正确地识别出 29 张人脸,而 YuNet 可以识别出 137 张人脸。YuNet 在更大图像中仍然具有更好的识别率。
两种方法的效率之间仍然存在显着差距。从时间消耗结果来看,当图像大小增加时,运行 YuNet 仍然比运行级联分类器花费更少的时间。
总结
从测试中可以得出结论,基于 CNN 的 YuNet 具有以下优点
- 具有更高的检测率和效率。
- 可以检测到更多的侧面和遮挡人脸。
- 更轻量级。(文件“face_detection_yunet_2022mar.onnx”的大小为 337 KB,而文件“haarcascade_frontalface_default.xml”的大小为 908 KB)
- 在参数方面节省了时间。级联分类器的参数需要根据一系列变量(例如图片大小、人脸数量和人脸大小)仔细确定,才能获得最佳效果。YuNet 在大多数图像上使用默认参数也能表现良好。
- 稳定的效率。分类器级联的时间消耗与参数设置密切相关,而 YuNet 则没有。
在选择人脸检测模型时,基于 CNN 的模型应该取代传统方法,成为主流。
测试代码
Haar 级联分类器
import cv2 import time img = cv2.imread('test_pics/selfie640.png') k = 100 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') tic = time.perf_counter() # Convert into grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Detect faces for i in range(1, k): faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3) toc = time.perf_counter()
YuNet
import cv2 as cv import numpy as np from yunet import YuNet import time img = cv.imread('test_pics/selfie640.png') k = 100 model = YuNet(modelPath='face_detection_yunet_2022mar.onnx', inputSize=[320, 320], confThreshold=0.9, nmsThreshold=0.3, topK=5000, backendId=3, targetId=0) h, w, _ = img.shape # Inference model.setInputSize([w, h]) tic = time.perf_counter() for i in range(1, k): results = model.infer(img) toc = time.perf_counter()
参考
所有测试图像均来自 Wider Face 数据集和世界最大自拍。