史丰畅
(江苏科技大学计算机学院 镇江 212003)
人脸识别[1]是根据人的脸部特征信息进行身份识别的一种技术,在现实生活广泛应用于教育、金融、公安等领域。而人脸检测是指输入一副图像,确定图像中所有人脸的位置、尺度和位姿的过程。它是进行人脸识别、人像对比、视频人像追踪等视觉任务的基本步骤和前提。
早期的人脸检测技术基于先验知识来和手工设计的特征来提取人脸图像的特征。如:姜军[2]等人采用与人脸生理结构特征相符合的人脸镶嵌图模型,针对人脸图像的灰度和边缘信息,建立人脸知识库。并通过多级监测步骤加快检测速度。很好地解决了复杂背景下的多人脸检测问题。梁路宏[3]等提出了多模板匹配的人脸检测方法,首先通过人眼模板进行初步筛选,然后使用多个不同长宽比的人脸模板进行检测定位,最后利用人脸的边缘特征确认。该方法具有较高的检测成功率。
近年来,研究人员发现基于卷积神经网络的算法能够自动学习到图像中的特征,并且取得了超越传统视觉算法的效果。越来越多的人也将卷积神经网络应用于人脸检测算法中,如刘伟强[4]设计了一种级联架构的卷积神经网络,通过多个尺度的图像区分人脸与背景区域。蒋纪威[5]等对目标检测算法YOLO[6]进行改进,提出了一种基于YOLOv3[7]的人脸检测算法,该算法能够对人脸进行实时检测。
但是上述人脸检测算法大多是将受限条件下的图片作为检测检测对象,在现实场景中应用时,人脸检测算法仍然面临人群高密度、明暗变化、小人脸以及遮挡等诸多挑战[8]。
人脸关键点检测是人脸识别中的关键步骤,通常用于人脸识别、三维人脸重建、表情分析等。通过对眉毛、眼睛、鼻子、嘴巴等关键点的检测,以获得更好的人脸特征,从而提升人脸识别的准确率。如Face++[9]提出的从粗到细的人脸关键点检测算法,能够准确检测出人脸的内部关键点和轮廓关键点共68个。
本文在现有的人脸检测算法上进行改进,将人脸关键点检测技术用于人脸检测中,提出了一种一阶段的人脸检测算法。该算法利用特征金字塔网络提取多尺度的人脸特征,通过多任务学习策略同时预测人脸分数,人脸框位置和人脸关键点。实验表明,加入了人脸关键点检测后,不仅提高了对正常人脸的检测性能,也能够准确检测出被遮挡的人脸。
本文的人脸检测算法首先使用特征金字塔网络[10]提取图像中多尺度的人脸特征信息,并通过上下文模块来增强对较小人脸的检测性能。然后通过多任务学习的方式,进行人脸分类,戴口罩人脸分类,以及回归人脸框和人脸的关键点,人脸检测网络结构如图1所示。
图1 人脸检测网络结构
人脸尺度的变换很大,同一张图像中存在从几个像素到几千个像素的人脸,因此对于检测中的多尺度问题,本文采用特征金字塔网络提取不同尺度的人脸特征。
本文的特征金字塔网络以ResNet-152[11]作为主干网络,其中特征图C2、C3、C4、C5四个不同尺度的特征为ResNet中各个残差块输出的特征图,特征图C6由C5经过3*3卷积后得到。
为了增强对小人脸的检测能力,本文在五个特征金字塔输出的特征图上均加入了上下文模块来扩张预检测区域的上下文信息,增强特征的感受野。
上下文模块将特征金字塔输出的特征输入感受野分别为3、5、7的分支中,然后将三个分支得到的特征合并,最后经过relu激活函数后输出特征。
多任务学习在人类检测中广泛使用,能够有效提高算法的性能。本文也采用了多任务学习的方式来检测图像中包含的人脸。多任务损失函数如下:
人脸分类损失Lcls(pi,p*i):这是一个二分类的softmax损失,其中pi是锚点i为人脸的概率值,p*i是锚点i的标签值,正锚点(含有人脸)值为1,负锚点(不含人脸)值为0。
戴口罩人脸分类损失Lcls_mask(qi,q*i):与人脸分类损失类似,戴口罩人脸分类损失也是二分类损失,其中qi为锚点i人脸戴口罩的概率值,q*i为标签值,q*i为1表示该锚点的人佩戴了口罩,为0则表示没有佩戴口罩。
人脸框回归损失Lbox(ti,ti*):该损失函数用于回 归 人 脸 所 在 的 位 置,其 中ti={tx,ty,tw,th}和分别为与正锚点有关的人脸预测框和人脸标签框(包括中心点坐标,宽度和高度)。损失函数采用如下所示的smooth L1损失:
人脸关键点损失Lpts(li,l*i):为了增强对部分困难人脸样本的检测能力,本文还对人脸关键点进行了回归,其中}分别为预测和标注的五个人脸关键点。与人脸框的损失相同,关键点损失也采用了smooth L1损失:
为了加快网络的收敛速度,多任务损失的中的部分损失只在满足条件的情况下计算。如戴口罩人脸分类损失Lcls_mask(qi,q*i)和人脸框回归损失只在存在人脸的情况下(p*i=1)计算;由于目前开源的口罩人脸检测数据集中没有对人脸关键点进行标注,因此人脸关键点损失只在存在人脸且不带口罩的情况下计算,即p*i=1,q*i=0。
为了验证本文的算法在复杂环境下是否能正确检测出人脸。本文采用了WIDER Face[12]和MAFA[13]两个数据集,其中WIDER Face用于测试算法在复杂环境下人脸的检测性能,MAFA数据集用于测试算法能否有效检测戴口罩的人脸。
WIDER Face数据集是是常用的人脸检测数据集,包含32203张图像。本文使用了带人脸关键点的WIDER Face数据集,然后在61个不同的场景类别中随机采样,将该数据集分为训练集(70%),验证集(10%)和测试集(20%)。并且根据EdgeBox[14]方法的检测率,通过逐步合并困难样本定义了三个难度的样本(简单、中等和困难)。
MAFA数据集是一个遮挡人脸数据集,其中大部分数据为被口罩遮挡的人脸图片,本文筛选后,从数据集中选出了3006张图片作为训练集,1059张图片作为测试集。
本文的实验平台为Ubuntu16.04、CUDA10.1、cuDNN7.6.5、NVIDIA GTX1080Ti。人脸检测算法使用Python语言和深度学习框架Tensorflow实现。
首先将人脸数据集进行预处理,将标签转换为CSV文件,数据集含有4类标签,分别为人脸是否佩戴口罩、是否为人脸、人脸框坐标和人脸关键点坐标。然后使用预训练的模型初始化网络参数,初始化学习率设置为0.0001,使用带动量的随机梯度下降算法进行优化。
本节评估了人脸关键点对测试集准确率的影响,并着重考察在困难样本上算法的性能。表1为有无人脸关键点对算法效果的影响。从表1可以看出,在不使用人脸关键点损失的情况下,模型在困难样本上的单类别平均正确率(Average Precision,AP)为90.6%,略低于ISRN模型[15]的90.9%,添加了关键点回归损失后,困难样本的AP显著提升,达到了91.7%,全类平均正确率(mean Average Precision,mAP)也从50.8%提升至52.3%,说明人脸关键点损失对于准确率的提升至关重要。
表1 人脸检测关键点对算法的影响
为了评估算法在遮挡人脸数据集上的准确率,本节使用MAFA数据集进行测试。表2为算法在MAFA数据集上的实验结果。从表2可以看出,在不使用人脸关键点损失时,算法的mAP为88.6%,略高于FAN模型[16]的88.4%,而加入人脸关键点损失后,本文的算法提升至89.5%,提升了0.9%,说明尽管模型在训练戴口罩人脸样本时没有对人脸关键点损失进行计算,但人脸关键点损失增强了网络对人脸特征的提取能力和对不带口罩人脸的检测准确率,进而提升了对戴口罩人脸的检测能力。
表2 MAFA数据集实验结果
本文提出了一种一阶段的人脸检测算法,通过多尺度特征提取和多任务学习进行训练,同时加入了人脸关键点用于提升人脸检测准确率。训练后的算法不仅能够检测图像中任意尺度的人脸,而且也能够准确检测出戴口罩人脸。实验结果表明加入人脸关键点损失后不仅提高了常规人脸数据集上的准确率,也提升了面部被遮挡的人脸检测能力。