人脸检测是计算机视觉最典型的应用之一,早期OpenCV的logo就是Haar人脸检测的示意图。 很多人的第一个OpenCV学习目标就是跑通Haar级联人脸检测,Dlib库在业内开始流行很大程度上是因为其HOG-SVM人脸检测比OpenCV Haar的好,而近年来OpenCV和Dlib均已包含基于深度学习的人脸检测算法实现。 Haar-Cascade,HOG-SVM,深度学习正是代表着人脸检测乃至目标检测的三个时代。 昨天Learn OpenCV网站博主Vikas Gupta博士发表文章,对OpenCV与Dlib中四种人脸检测算法实现进行了比较分析,包含C++/Python的代码示例,且对精度和速度都进行了量化。 先来看看作者发布的视频: 1. OpenCV Haar Cascade人脸检测 算法无需赘言。 代码示例: 优点 1)几乎可以在CPU上实时工作; 2)简单的架构; 3)可以检测不同比例的人脸。 缺点 1)会出现大量的把非人脸预测为人脸的情况; 2)不适用于非正面人脸图像; 3)不抗遮挡。 2. OpenCV DNN 人脸检测 从OpenCV3.3版本后开始引入,算法出自论文《SSD: Single Shot MultiBox Detector》(https:///abs/1512.02325)。使用ResNet-10作为骨干网。 OpenCV提供了两个模型: 1)原始Caffe实现的16位浮点型版本(5.4MB); 2)TensorFlow实现的8位量化版本(2.7MB)。 Vikas Gupta的代码包含了这两种模型。 模型加载代码示例: 检测测试代码示例: 优点 1)在这四种方法中是最准确的; 2)在CPU上能够实时运行; 3)适用于不同的人脸方向:上,下,左,右,侧面等。 4)甚至在严重遮挡下仍能工作; 5)可以检测各种尺度的人脸。 缺点 作者认为没有什么大的缺点^_^ (52CV君不敢妄提缺点,但认为不能使用NVIDIA GPU绝对是个遗憾) 3. Dlib HoG人脸检测 代码示例: 优点 1)CPU上最快的方法; 2)适用于正面和略微非正面的人脸; 3)与其他三个相比模型很小; 4)在小的遮挡下仍可工作。 缺点 1)不能检测小脸,因为它训练数据的最小人脸尺寸为80×80,但是用户可以用较小尺寸的人脸数据自己训练检测器; 2)边界框通常排除前额的一部分甚至下巴的一部分; 3)在严重遮挡下不能很好地工作; 4)不适用于侧面和极端非正面,如俯视或仰视。 4. Dlib CNN人脸检测 算法来自论文《Max-Margin Object Detection》(https:///abs/1502.00046)。 代码示例: 优点 1)适用于不同的人脸方向; 2)对遮挡鲁棒; 3)在GPU上工作得非常快; 4)非常简单的训练过程。 缺点 1)CPU速度很慢; 2)不能检测小脸,因为它训练数据的最小人脸尺寸为80×80,但是用户可以用较小尺寸的人脸数据自己训练检测器; 3)人脸包围框甚至小于DLib HoG人脸检测器。 5. 四种方法精度比较 作者在FDDB数据库中测评了四种人脸检测算法实现的精度,结果如下: 可以看到Dlib的两种方法效果都不怎么好,作者发现原来Dlib训练使用的数据集的人脸包围框较小,导致按照FDDB的评价标准不公平。 另外,Dlib无法检测小脸也拉低了分数。 6. 速度比较 软硬件环境: Processor : Intel Core i7 6850K – 6 Core RAM : 32 GB GPU : NVIDIA GTX 1080 Ti with 11 GB RAM OS : Linux 16.04 LTS Programming Language : Python 图像大小300*300,测试结果如下: 可以看到除了MMOD 其他方法都达到实时,而MMOD方法的GPU计算是最快的。 7. 分情况检测结果示例 7.1跨尺度检测 7.2 非正面人脸 7.3 遮挡 8 总结推荐 如何在应用中选择人脸检测算法呢?作者认为应该首先尝试OpenCV DNN方法与Dlib HOG方法,然后再做决定。 一般情况 在大多数应用程序中,我们无法知道图像中人脸尺寸的大小。因此,最好使用OpenCV-DNN方法,因为它非常快速且非常准确,即使对于小尺寸的人脸也是如此。它还可以检测各种角度的人脸。所以OpenCV-DNN是首选。 中到大尺寸的图像 Dlib HOG是CPU上最快的方法。但它不能检测到小脸(<70x70)。因此,如果知道程序不会处理非常小的人脸(例如自拍照),那么基于HOG的人脸检测器是更好的选择。 此外,如果你可以使用GPU(NVIDIA家的),那么MMOD人脸检测器是最好的选择,因为它在GPU上非常快,并且还提供各种角度的检测。 高分辨率图像 由于在高分辨率图像中,这些算法的速度都会很慢,而如果缩小图像尺寸,HOG/MMOD可能会失败,同时OpenCV-DNN却可以检测小脸,所以对于高分辨率图像推荐缩小图像再使用OpenCV-DNN的方法。 原文链接: https://www./face-detection-opencv-dlib-and-deep-learning-c-python/ 代码数据下载: |
|