在本教程中,我们将比较和探讨OpenCV、Dlib和深度学习中的几种人脸识别方法。我们将提供代码示例,并讨论每种方法的优缺点,同时分享如何根据特定应用选择合适模型的实用规则。
我们假设图像尺寸为300×300。
基于Haar级联的人脸检测技术自2001年Viola和Jones提出以来,一直是先进的人脸检测技术。近年来进行了许多改进,OpenCV提供了多种基于Haar的模型。
代码示例用于加载haar级联模型文件并将其应用于灰度图像。输出包含检测到的面孔列表,每个成员是包含坐标和尺寸的四个元素列表。
简单、高效,适合实时应用。
可能在检测复杂背景下的小或部分遮挡的脸时表现不佳。
这种模型基于ResNet-10架构,使用Caffe或TensorFlow进行训练。输出为归一化坐标,表示边界框。
代码加载模型,并使用前向传播进行检测。输出为4-D矩阵,边界框坐标需乘以原始图像大小。
克服了Haar级联的缺点,适用于更复杂背景。
计算速度慢于基于Haar的检测器。
基于HoG特征和SVM的模型,由5个HOG过滤器组成,适用于多种视角。模型嵌入头文件中。
代码加载检测器,将图像通过检测器,输出为包含坐标和大小的面部列表。
适用于多种条件,如非正面角度。
可能在检测小脸时表现不佳。
基于CNN的检测器,使用MMOD(最大边缘对象检测器)训练。训练过程简单,无需大量数据。代码加载模型,输出坐标。
适用于多种角度和大小的人脸检测。
速度较慢。
使用FDDB数据集评估模型。结果表明,Dlib在视觉上表现更好,但准确性稍逊于Haar级联和OpenCV-DNN。主要原因是输出边界框大小不同,以及Dlib模型在小脸检测方面存在局限性。
视觉上更精确的边界框。
在准确性评估时存在偏见,尤其在小脸检测方面。
使用300×300图像评估方法的实时性。OpenCV-DNN、Dlib和Dlib的CNN检测器在CPU和GPU上均有显著差异。
处理器:英特尔酷睿i7 6850K
RAM:32 GB
GPU:NVIDIA GTX 1080 Ti,11 GB内存
操作系统:Linux 16.04 LTS
编程语言:Python
在给定图像上运行每个方法10000次,结果表明除了MMOD外,所有方法均能在实时内执行。MMOD在GPU上非常快,但在CPU上速度较慢。
综上所述,建议在大多数情况下使用OpenCV-DNN,因为它快速且准确,即使面对小尺寸人脸。对于中、大型图像尺寸,Dlib的HoG检测器在CPU上速度较快,适用于已知不会处理非常小面孔的应用。高分辨率照片处理时,OpenCV-DNN方法表现较好,因为它能检测小面孔。基于这些分析,可根据具体应用选择合适的人脸识别方法。