Face Alignment 被翻译为面部对齐,即对所检测的人脸图像进行旋正使其符合标准要求,但是往往也包含 Facial Landmark Detection,这两者往往容易混为一谈。以下为两者的定义:
Face Alignment : Face alignment is the task of identifying the geometric structure of faces in digital images, and attempting to obtain a canonical alignment of the face based on translation, scale, and rotation.
Facial Landmark Detection : Facial landmark detection is the task of detecting key landmarks on the face and tracking them (being robust to rigid and non-rigid facial deformations due to head movements and facial expressions).
PS:这篇文章里就不讲解 MTCNN 了,感兴趣的话可以看这篇文章 [论文笔记] 人脸检测方向系列论文。
1. Deep Convolutional Network Cascade for Facial Point Detection
2. Coarse-to-Fine CNN
3. TCDCN
4. Deep Alignment Network
5. Style Aggregated Network
6. Look at Boundary
7. PFLD
论文链接:Deep Convolutional Network Cascade for Facial Point Detection,发表时间:CVPR 2013
该论文由港中文的孙祎、王晓刚、汤晓鸥提出,应该是最早使用 CNN 进行人脸关键点检测的论文之一了。在论文中,作者设计了 Three-level cascaded CNNs 用于人脸关键点检测(5 Points):Left Eye Center (LE),Right Eye Center (RE),Nose Tip (N),Left Mouth Corner (LM),Right Mouth Corner (RM)。在模型的各个 level 中,模型会对各个人脸关键点做多次预测,取其平均值。
论文链接:Extensive Facial Landmark Localization with Coarse-to-Fine Convolutional Network Cascade,发表时间:ICCV 2013
该论文由 Face++ 发表于 ICCV 2013,也是与上篇论文一样通过设计多层级联网络,以此达到 Coarse-to-Fine 的效果。在该篇论文中,作者将人脸关键点(68 Facial Landmarks)分为 Inner Points(人脸五官区域的特征点) 和 Contour Points(人脸轮廓的特征点),并分开进行预测。此外,作者对于 Inner Points 的预测过程中,按照五官区域进行划分,对各个区域的特征点进行微调。
之所以作者按照五官区域进行划分,是因为不同区域的关键点的预测难度不同(如下图左侧所示),一起进行预测效果不好;将 Inner Points 和 Contour Points 分开预测,是因为 Contour Points 的预测难度大于 Inner Points(如下图右侧所示)。此外,作者也指出之所以预测 Contour Points 的分支没有第三、四层网络,是受运行时间的限制。
最后,作者也给出了不同层网络的预测精度,如下图所示:
论文链接:Facial Landmark Detection by Deep Multi-task Learning,发表时间:ECCV 2014
TCDCN(Task-Constrained Deep Convolutional Network) 由 MMLab 发表于 ECCV 2014,其主要思想为使用多任务学习提升人脸关键点检测的准确度,相关任务有:Head Pose Estimation 和 Facial Attribute Inference。此外,作者为避免不同任务的学习难度不同(由任务本身所决定)和收敛速度不同(由数据集中各个任务对应数据的分布所决定)对主任务带来的负面影响,提出了 Task-contrained Model 和 Task-wise Early Stopping。
与传统多任务学习方法相比,作者采用多任务学习的目的是为了更好的学习主任务,于是作者对其他子任务是赋予了相应的权重,以此更好的优化主任务:人脸关键点检测。
为避免不同任务收敛速度不同所带来的负面影响,作者提出了 Task-wise Early Stopping(如下所示):用 E v a l a E^a_{val} Evala 和 E t r a E^a_{tr} Etra 分别表示任务 a 在训练集和验证集上的损失值,若任务 a 的测量值超过阈值ϵ,则该任务停止学习停止。其中,第一项代表训练误差的上升/下降趋势,第二项测量与训练误差相比的泛化误差。
作者还对是否采用 Task-wise Early Stopping 进行了对比实验,并绘制出训练曲线,如下图所示:
此外,作者对各个子任务对于主任务的贡献进行了分析,如下图所示:
PS: 官方开源项目 Facial Landmark Detection by Deep Multi-task Learning。
论文链接:Deep Alignment Network: A convolutional neural network for robust face alignment,发表时间:2017.06
Deep Alignment Network(DAN)整体基于 Multi-Stage CNN 对人脸关键点的预测结果进行多次微调,思路与前几篇利用级联的卷积神经网络达到 Coarse-to-fine 一致,不过 DAN 每个阶段的输入都是整张人脸图像,而不是局部区域。除初始阶段外,每个阶段的输入包含:经过旋正后的人脸图像,根据上一阶段所预测的人脸关键点所生成的 Landmark Heatmap 以及上一阶段网络的 FeatureMap。(作者在文中指出该篇文章的思路是受 Cascade Shape Regression(CSR)启发所产生,相关文章:Cascaded Pose Regression)
这里要注意一点,每个阶段的输出并非人脸关键点坐标,而是人脸关键点坐标的偏离量,故上图中每个阶段的输出为 △ S i \bigtriangleup S_i △Si,与 T i ( S i − 1 ) T_i(S_{i-1}) Ti(Si−1) 相加后得到相对于该阶段所输入人脸图像的人脸关键点坐标 T i ( S i − 1 ) + △ S i T_i(S_{i-1})+\bigtriangleup S_i Ti(Si−1)+△Si,经过反变换后可得到原图的人脸关键点坐标 T i − 1 ( T i ( S i − 1 ) + △ S i ) T_i^{-1}(T_i(S_{i-1})+\bigtriangleup S_i) Ti−1(Ti(Si−1)+△Si)。其中,Connection Layer 和 Feed Forward NN 的细节如下所示:
这里提一下常见的人脸关键点检测的评价指标:Inter-Ocular Normalization, Inter-Pupil Normalization, Normalization Mean Error。 其中,Inter-Ocular Normalization 和 Inter-Pupil Normalization 的计算公式一致: e i = ∣ ∣ x i − x i ∗ ∣ ∣ 2 d e_i=\frac{||x_i-x^*_i||_2}{d} ei=d∣∣xi−xi∗∣∣2( x i x_i xi 表示第 i 个关键点的预测坐标, x i ∗ x^*_i xi∗ 表示第 i 个关键点的 ground truth),只是公式中的 d d d 的取值不一致:Inter-Ocular Normalization 中 d d d 取值左右眼角的距离,Inter-Pupil Normalization 中 d d d 取值双眼区域 12 个关键点的平均距离。(关于这点网上资料并不多,我也仅在 Github 上见到相关的讨论,具体链接:How to calculate inter-pupil distance?)此外,Normalization Mean Error 的计算公式为: e = ∑ i = 1 N ∣ ∣ x i − x i ∗ ∣ ∣ 2 N ∗ d e=\frac{\sum^N_{i=1}{||x_i-x^*_i||_2}}{N*d} e=N∗d∑i=1N∣∣xi−xi∗∣∣2。
PS: 官方开源项目 MarekKowalski/DeepAlignmentNetwork(基于 Theano 实现),Github 复现项目 zjjMaiMai/Deep-Alignment-Network-A-convolutional-neural-network-for-robust-face-alignment(基于 Tensorflow 实现),Github 复现项目 justusschock/deep_alignment_network_pytorch(基于 PyTorch 实现)。
论文链接:Style Aggregated Network for Facial Landmark Detection,发表时间:2018.03
在论文中,作者为了解决由于 Variation Of Image Style 所带来的问题(毕竟许多 In The Wild 数据集都是由网络上搜集所得,图像风格无法保证一致,这里所指的图像风格包括但不限于:明亮/昏暗,黑白/彩色),提出了 Style Aggregated Network(SAN)。该网络包含两个模块:Style-aggregated Face Generation Module 和 Facial Landmark Prediction Module,其中,Style-aggregated Face Generation Module 用于将所输入的人脸图像的风格转换为 Aggregated Style(就是同一所有人脸图像的图像风格),Facial Landmark Prediction Module 以原图像和统一图像风格后的人脸图像作为输入进行人脸关键点检测。具体细节如下所示:
在论文中,作者将同一张图像转换三个不同的图像风格并进行人脸关键点检测,以此验证图像风格对人脸关键点检测的影响(如下图左侧所示);此外,作者还在数据集 300-W 中进行数据聚类,并对每个类计算其 Mean Face Image(如下图右侧所示)。
关于如何训练 Style-aggregated Face Generation Module ,作者也在论文中进行较为详细的描述,大致流程如下图所示:
PS: 官方开源项目 D-X-Y/landmark-detection(基于 PyTorch 实现)。
论文链接:Look at Boundary: A Boundary-Aware Face Alignment Algorithm,发表时间:2018.05
Look at Boundary(LAB)由清华大学、武汉大学和商汤联合提出,与其他人脸关键点检测方法相比,该论文最大的亮点在于通过预测 Estimated Boundary Heatmap 辅助人脸关键点检测。此外,为提高所生成 Estimated Boundary Heatmap 的质量,作者还引入了 Adversarial Learning 的思想,构造 Boundary Effectiveness Discriminator;作者从 Pose Estimation 中受到启发,引入 Stacked Hourglass Network 和 Message Passing(包括 Intra-level message passing 和 Inter-level message passing);作者为更好的利用 Estimated Boundary Heatmap 的信息,设计了两个模块:Input Image Fusion 和 Feature map Fusion。
PS: 关于 Hourglass Network 的相关知识,可以看这篇论文 Stacked Hourglass Networks for Human Pose Estimation,关于 Message Pass 的相关知识,可以看这篇论文 Structured Feature Learning for Pose Estimation
作者之所以提出利用 Facial Boundary Heatmap,是因为任何人脸关键点数据集可以转换到统一的数据格式(即 Facial Boundary Heatmap),而且通过 Facial Boundary Heatmap 可以预测任意个数的人脸关键点,还能部分解决人脸关键点检测中所存在的遮挡、旋转等问题。
首先,我们需要由常见的人脸关键点数据生成 Boundary Heatmap:将人脸关键点按照所属 Boundary Line 进行划分,通过插值的方式生成相应的 Boundary Line(每个 Boundary Line 在不同的图像中),计算图像中各点到 Boundary Line 的距离以此构造 Distance Transform Map,最后通过高斯分布得到 Ground Truth Heatmap(具体流程如下图左侧所示)。
接着,在预测 Boundary Heatmap 的过程中,作者引入了 Stacked Hourglass Network 和 Message Passing(具体流程如下图右侧所示)。其中,Message Passing 分为 Intra-level message passing (即同层中各个 Boundary 相互传递信息) 和 Inter-level message passing(即相邻两层中对应 Boundary 相互传递信息)。
最后,作者为了提高所预测的 Boundary Heatmap 的质量(为避免使用 MSE Loss 所导致的 Refression-to-the-mean Problem),便引入 Adversarial Learning 的思想进行对抗学习,即设计了 Boundary Effectiveness Discriminator。
此外,作者也通过示例举出各个部分对于预测 Boundary Heatmap 的贡献,具体细节如下所示:
在预测人脸关键点的过程中,作者将所预测的 Boundary Heatmap 与 Original Image 融合作为输入,并模型的多个阶段将 FeatureMap 与 Boundary Heatmap 融合,即 Input Image Fusion 与 Feature Map Fusion。
PS: 官方开源项目 wywu/LAB(基于 Caffe 实现)。
论文链接:PFLD: A Practical Facial Landmark Detector,发表时间:2019.02
PFLD 由天津大学、武汉大学、腾讯AI实验室、美国天普大学联合提出,其主要思路为通过 Auxiliary Net 对人脸的旋转角度进行估计(仅在训练阶段),从而计算该样本的 loss 权重,最终达到缓解极端角度问题的效果。此外,作者也考虑到实际应用的需求,该模型大小仅为 2.1 Mb 且在手机上能达到 140 Fps((Qualcomm ARM 845 processor))。
常见的人脸关键点检测算法中,其损失函数一般都是 L2 Loss(如下图左侧所示,其中的 γ \gamma γ 用来控制各个关键点的权重)。作者考虑到现有数据集中极端情况的样本数量少,故对旋转角度大的样本给予更大的 Loss 权重(如下图右侧所示,),以此缓解所存在的数据样本分布不平衡的问题。
作者利用 MobileNet-V2 Block 搭建 Backbone,以 Backbone 中 Layer 3 所输出的 FeatureMap 作为 Anxiliary Net 的输入,具体如下所示:
PS: 官方开源项目 PFLD,Github 复现项目 guoqiangqi/PFLD。
参考资料:
如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!
作者信息:
知乎:没头脑
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink