人脸关键点定位算法 (Facial landmark detection) 是指在 2D 人脸图片上定位出一些具有特殊语意信息的点,例如鼻尖、眉毛、嘴角等,如图 1 所示。人脸关键点定位算法并不是一项单一的任务,而是作为众多高级人脸分析任务的基础,这些高级人脸任务主要有人脸识别、3D 人脸重建、人脸表情迁移、人脸美化等。因此,人脸关键点定位的精度将于严重影响后续任务的精度。
图 1 人脸关键点定位图片
目前,人脸关键点定位模型主要可以分为基于手工特征的传统方法和基于深度学习的回归方法。传统方法主要有 AAMs (active appearance models)、CLMs (constrained local models)、ESR (explicit shape regression)、SDM (supervised descent method) 等,这些方法主要是通过手动设计的特征去拟合出人脸关键点的位置。近年来,随着以卷积神经网络 (Convolutional Neural Networks, CNNs) 和循环神经网络 (Recurrent Neural Networks, RNNs) 为代表的深度学习的方法快速发展,人脸关键点定位算法也迅速转向基于深度学习的方法。由于深度神经网络强大的特征提取能力,基于深度学习的人脸关键点定位算法在测评指标如 NME (Normal Mean Error) 和 FR (Failure Rate) 上迅速超越传统方法。
一般来说,基于深度学习的人脸关键点定位又可以分为基于坐标回归的方法和基于热图回归的方法。总的来说,基于坐标回归的方法速度快、计算量小,但是精度不如基于热图回归的方法高;然而,基于热图回归的方法更侧重于结果的精度,但是模型体积较大、速度较慢。对于实际应用场景来说,按照任务要求的不同(如速度、精度以及运算效率等),选择不同类型的方法。接下来,文章将先对人脸关键点定位算法在实际使用中所面临的问题进行简要分析,然后按照不同类型的方法,对该领域的实践经验进行介绍。
一、 人脸关键点定位算法所面临的一些挑战
1.1 输入图片具有很强的特异性
在实际使用场景中,如人脸美妆、人脸识别等,模型输入的图片本身具有极强的特异性,例如极端的光照环境、夸张的表情、大角度的姿态、图片抖动所产生的模糊等。如图 2 所示,对这些图片进行精确地人脸关键点定位非常困难。
图 2 一些极端姿态的人脸图片
1.2 训练数据的不平衡
目前,公开的人脸关键点定位数据库都存在数据不平衡这一问题,既:正脸的图片的总数要远多于侧脸的图片总数,而大角度侧脸的训练图片更少。使用这种数据集训练出的人脸关键点定位算法,在评测数据集上可以获得非常高得精度,但是在实际使用中,有可能因为头部的轻微偏转,导致模型的精度严重下降。
1.3 模型运行效率
目前,人脸关键点定位任务在学术界和工业界所最求的目标并不完全相同。在学术界中,科研人员更加关注模型最终输出的结果在各种评测集上是否达到了最优,其次才是模型的参数量和执行效率等问题;然而,在工业界中,工程师们在一定的误差范围内,追求模型更小的体积以及更快的运行效率。这一问题致使高精度的人脸关键点定位模型很难直接应用到实际的任务之中。
二、 人脸关键点定位算法经验总结:
我们这一篇文章,主要将集中在算法在实际使用场景中的调优问题,将主要围绕在压缩模型体积的情况下,尽量减少定位精度的损失。下面将分别对基于坐标回归的方法和基于热图回归的方法在实际项目中的一些经验和总结分别进行描述和讨论。
2.1 基于坐标回归的人脸关键点定位算法调优
基于坐标回归的人脸关键点算法速度快,但是定位精度略差于基于热图回归的方法。这种方法比较适宜用于对实时性要求较高、但对定位精度要求相对不高的任务中(如人脸识别、情绪判断、头部姿态估计等)。基于坐标回归的算法在我们的实际项目中,可以做到模型体积小于 200KB,速度到达 1500fps ,同时在精度上仍然可以达到要求。下面介绍常用的调优方法:
2.1.1 设计轻量化的模型
在我们实际经验中,使用精心设计和调参的小模型在一定的情况下,精度完全可以超过使用了特征提取能力更强的大模型;常用的轻量化特征提取网络如 ShuffleNet、MobileNet 等,但是这些模型的体积对于边缘计算设备(智能手机、机器人等)仍然较大,模型的参数量和计算量如表 1 所示。此外,这种为图像分类设计的网络,直接应用到人脸关键点定位任务中并不是一种好的策略。为此,我们设计了一种专门用来进行人脸关键点定位的一种轻量化模型,表 2 是模型的基本结构。其中 ConvDW 代表深度可分离卷积,ConvDW* 表示在该层对输入的 Feature Map 进行降采样。
我们使用 MSE Loss 作为优化函数,在 300W 数据集上进行训练和测试,获得结果如表 3 所示。从表中我们可以看出,使用我们专门设计的人脸关键点定位模型可以在极小的模型参数量和计算量中,获得更好地结果。
2.1.2 使用恰当的损失函数
对于基于坐标回归的人脸关键点定位算法,Loss 函数也是一项至关重要的优化项。在 Wing-CNN 文章之前,大部分基于坐标回归的算法都是使用 MSE Loss 作为损失函数,但是 MSE Loss 非常容易受到异常值的影响,通俗的来讲,MSE Loss 有可能因为几个极端的异常数据而陷入局部极值中,导致模型收敛较差。因为人脸关键点定位的标注数据本身就存在一定的误差,因此标注数据中存在异常值(或错误值)的可能性比目标检测、图像分类等视觉任务更大。问了解决这一问题,Wing-CNN 中提出使用 Wing Loss 来缓解模型对异常值的敏感程度。在表 4 中,我们对比了使用我们设计的小模型作为 BackBone 分别使用 MSE Loss 和 Wing Loss 作为损失函数在 300W-Fullset 上的测试结果。从表中,我们可以看出使用 Wing Loss 可以明显的提升模型的结果精度。
2.1.2 使用多阶段模型去提升人脸关键点定位性能
在实际应用中,如果需要获得高精度的人脸关键点定位结果,通常使用基于热图回归的算法;但是,有一些特殊的任务如手机端的视频人脸美妆软件(该算法完全在手机端运行,不需要借网络),就会对速度有较高的要求,同时也需要获得非常精确地人脸关键点定位结果。此时,我们可以借助多阶段人脸关键点定位模型来完成。
训练多阶段人脸关键点定位模型,首先使用一个非常浅层的关键点定位模型(Model-I)去进行 5 点定位,之后通过 5 点对人脸图片进行校正,然后再使用一个相对较大的模型(Model-II)进行正常的人脸关键点定位(如 68 点、106 点等)。图 3 表示多阶段的人脸定位模型训练的基本过程。
图 3 多阶段人脸关键点训练过程
在模型训练阶段,为了节约计算量,Molde-I 可以使用较小尺寸的输入图片(如 64x64),使用更加激烈的数据增广方法例如更大的旋转角、更强的边框扰动;在训练 Model-II 过程中,输入经过 Model-I 处理后转正的图片,此时的图片的输入尺寸、增广方式都按照正常训练方式进行。依据我们多次相关类型项目经验,多阶段定位模型可以获得与基于热图回归方法相互匹敌的结果,并且模型的运算速度快、系统开销少。因为 Model-I 的模型非常小,而且输入图片的尺寸也非常小,所以基本不会对模型速度和运行开销产生影响。
2.2 基于热图回归的人脸管家点定位算法模型调优
通常情况下,基于热图回归的人脸关键点模型算法受限于自身体积、运算量等制约,不会部署到对速度具有较高要求的移动端产品中。但是随着短视频、直播等新兴行业的发展和边缘计算设备运算能力的逐步提升,将高精度的人脸关键点定位算法在实际项目部署的需求逐渐增加。目前,我们是使用知识蒸馏的方法,可以完成精度高、实时性强的关键点定位模型在手机端的部署。我们对 Hourglass 进行精简,精简的方式主要是模型的深度和宽度两个方面,然后使用热图回归的常用方法对完成 Teacher Model 和 Student Model 的训练,在知识蒸馏过程中,不但需要对 Student Model 中每一个 Block 输出的 Feature Map 进行监督学习,也需要让 Student Model 对训练数据进行学习。知识蒸馏过程中,使用 MSE Loss 作为损失函数。
2.3 训练数据方面的调优
2.3.1 使用对抗生成网络(GAN)进行数据增广
根据实际的项目经验可知,同一张人脸图片在不同的光照背景、图片质量的情况下,定位结果会产生一定的偏差,如图 4 所示。这些细微的偏差会导致模型在最终的结果产生震荡,不但会对最终的精度产生影响,当算法应用到视频中时,会是定位结果在相邻帧之间产生严重的抖动。
图 4 图片背景对关键点定位结果导致的影响
对于这一问题,我们主要是通过 GAN 来替换图片的背景,完成训练图片的大规模增广。图 5 是我们在 300W 数据集上进行的数据增广实验结果。实际项目经验显示,使用 GAN 进行数据增广训练的人脸关键点定位模型无论是在定位精度还是在稳定性上都远好于未使用数据增广训练的模型。
图 5 使用 GAN 进行数据增广的结果
2.3.2 通过头部姿态来进行数据增广
对于常用的人脸关键点定位数据库包括 300W、AFLW、COFW 以及 WFLW 等,这些数据库中的正面人脸都远多于侧面的人脸图片。为了让训练数据中正脸和侧脸图片数量大致相等,我们可以通过给定的人脸关键点坐标等来计算出人脸的朝向(patch、yaw、roll),通过对人脸朝向的角度区间进行分类,然后手动复制那些姿态较少的数据,使各个区间中人脸图片的数量基本保持一致。与 GAN 背景转换方法相比,这种方法不需要训练对抗生成网络,因此也更加常用。
在本篇文章中,我们首先介绍了人脸关键点定位模型在实际使用时所面临的一些问题,然后分别从基于坐标回归的方法、基于热图回归的方法以及数据增广这三个角度,介绍了一些我们在项目中所总结的算法调优的经验和方法。希望这些方法和总结可以促进人脸关键点定位技术的发展和进步。