首页 » 刷脸背后:人脸检测 人脸识别 人脸检索 » 刷脸背后:人脸检测 人脸识别 人脸检索全文在线阅读

《刷脸背后:人脸检测 人脸识别 人脸检索》3.1 DPM人脸检测算法

关灯直达底部

该人脸检测算法使用的检测模型为dpm-baseline[1],本书称之为DPM人脸检测算法。它可以检测多角度的人脸,是M.Mathias等人在2014年提出的[2]。和一些比较成熟的算法相比,DPM人脸检测算法的检测效果和它们相当,甚至可以取得更好的结果,主要原因在于:其选择了合适的训练数据,以及发现了非极大值抑制的重要性。M.Mathias等人公开了训练好的人脸检测模型——dpm-baseline,并提供了开源的代码。本书就是使用他们提供的开源模型和源代码进行人脸检测的。

3.1.1 DPM人脸检测算法的使用

本书实现的DPM人脸检测算法是基于MATLAB语言实现的,对应的项目名称为dpmMATLAB。该项目内包含了DPM算法运行所需的全部文件,分为两部分,即dpm_face_detector和voc-dpm-master[3]。dpm_face_detector中存放了人脸检测模型[1]、主要程序[4]和测试图片;voc-dpm-master中存放了程序运行中需要调用的函数。

在运行程序之前,还需要一些配置,具体如下:

(1)首先打开MATLAB,切换到主函数detect_faces.m所在的目录。

(2)单击home→Set Path→Add to Path with Subfolders,选择voc-dpm-master文件夹,如图3-1所示,最后单击“保存”按钮并关闭。

(3)本书程序是在Windows 64位操作系统和MATLAB 2012b下运行的。如果读者的运行环境和本实验一致,则配置完成。如果读者使用的是32位操作系统或者在文献[3]中下载voc-dpm-master,则使用dpmMATLABchange文件夹下的.cc文件,替换掉voc-dpm-master中对应的文件,并使用“mex–O xx.cc”对这类.cc文件进行编译。编译成功后,则配置完成。

图3-1 Add to Path with Subfolders对话框

待检测图片在dataoriginal_image文件夹下。

检测结果在dataface_detection_results文件夹下。

读者可根据实际情况,在detect_faces.m文件中,修改存放检测图片和检测结果的路径,如下:

选择好路径后,运行主函数detect_faces.m,即可使用DPM人脸检测算法进行人脸检测。

3.1.2 DPM人脸检测算法的原理

该算法使用可变形部件模型(Deformable Part Model)目标检测框架[5],包含一个训练好的、可以检测多角度人脸的模型dpm-baseline.mat,对输入的检测图片在检测模型上进行处理后,得到若干个检测框,初步得到的检测框经过NMS处理,即可得到最终人脸检测结果。作者在文中提到,该算法检测质量好的主要原因是选择了合适的训练数据和发现了非极大值抑制的重要性[2]。

1.dpm-baseline模型的训练数据

该模型从AFLW数据集收集了15 106个样本数据进行训练,分为三类:6752个正面脸样本(脸部上下偏移±20°),5810个侧面脸样本(脸部左右偏移20°~60°),2544个侧面脸样本(脸部左右偏移60°~100°),分别训练成3个组件(Component)。通过翻转,3个组件变为6个组件,每个组件有一个根模板和8个部件,如图3-2所示,该图来源于文献[2]。除初始化组件外,所有训练参数都使用默认值。

图3-2 dpm-baseline模型的6个组件

选择的样本质量和数量合适,是该算法检测效果好的一个重要因素。在检测质量方面,DPM算法选择了多角度的人脸样本进行训练,训练好的模型可以检测多种角度的人脸。作者从精度和召回率方面评估了训练样本数量不同对检测质量的影响。结果显示,当有500个训练样本时,DPM的平均精度可以达到95%,增加训练样本个数可以在保持精度不变的情况下提高召回率。

2.非极大值抑制的重要性

非极大值抑制(Non-Maximum Suppression,NMS)的目的是保证每个检测实例只有一个检测框。对于同一个检测实例,选择得分最高的检测框的同时,自动移除得分低的检测框。假设我们设置重叠阈值(Overlap Thresh)为0.3,已经找到了一个得分高的检测框A,比较检测框B和检测框A,如果检测框A、B的重叠面积比总和面积(IoU)小于0.3,则认为检测框A、B不是同一个检测实例,保留检测框B,否则删除检测框B。NMS的重叠阈值是一个影响检测质量的重要参数。作者在论文中指出,使用不同的重叠阈值在Pascal Faces数据集上比较DPM的检测质量,发现阈值为0.3比默认值0.5的检测效果好,如图3-3所示,该图引自文献[2]。

图3-3 DPM在Pascal Faces数据集上使用不同重叠阈值的检测结果

3.源代码分析

上面从理论方面分析了DPM检测模型和NMS的重要性,接下来我们将结合文献[4]中的源代码详解如何利用dpm-baseline.mat和NMS进行人脸检测。Code1、Code2中的程序均来自文献[4]。

Code1:主函数 detect_faces.m

通过对detect_faces.m的分析,读者对DPM人脸检测过程会有一个大概的了解。接下来,我们分析一下process_face.m的主要代码。

Code2:process_face.m

由Code1中的主函数detect_faces.m可知,最终得到的人脸检测框通过函数showsboxes_face在图片上进行标记,但是这些检测框区域内的图像有的是真实的人脸,有的可能并非人脸。我们称非人脸的检测框为“噪声”,因此,在showsboxes_face函数中,我们对每一张图片得到的所有检测框进行判断,如果不是噪声,则在图片上标记出该检测框;否则,忽略该检测框,不标记。

关于如何去噪,这里使用了GN Stamou和I.Pitas等人提出的方法,步骤如下:

(1)把检测框区域对应的图片切出来,并且把这张图片转换为HSV颜色空间。

(2)在HSV图像中,如果一个像素点的0<H<0.15,且0.2<S<0.6,则称为“像皮肤”(skin-like)。

(3)如果该区域内的skin-like个数除以该图的总像素点个数大于1/4,则认为是真人脸,否则为假人脸。

下面是去噪算法的代码。

Code3:out_false.m

关于该算法的更多细节,可以查看FaceDetectAlgosdpmMATLAB下的所有文件。

3.1.3 DPM人脸检测算法的检测结果

经测试,我们发现DPM人脸检测算法的检测质量很好。DPM人脸检测算法可以检测正脸、侧脸、仰脸、平躺草地等类型的图片,这归功于选择了多角度的训练样本。针对图片尺寸小的情况,检测时间短、效果好;但针对大尺寸的图片,检测时间长,甚至报错。在图3-4中,我们呈现了一些有代表性的图片的检测结果。

图3-4 DPM人脸检测算法的检测结果