【人脸关键点】——PFLD人脸关键点检测解读_数据平衡
 

应用场景: 人脸特效,疲劳检测,美妆,

非官方code: https://github.com/polarisZhao/PFLD-pytorch

1. 挑战

  • 局部变化:表情、局部极端光照(如高亮和阴影)和遮挡会给面部图像带来部分变化/干扰

  • 全局变化:姿态和成像质量是影响人脸图像整体外观的两个主要因素,当对人脸的整体结构进行错误估计时,会导致很大一部分标志点的定位效果不佳

  • 数据平衡

  • 模型效率

针对上面的问题,本篇文章从,模型+loss两个方面进行设计改进。(其实现在深度学习的论文,会分析相关的挑战,但是并不会针对对应的挑战设计解决方案,更多的还是在通用AI的层面进行设计)

2. 模型结构

【人脸关键点】——PFLD人脸关键点检测解读_人脸关键点检测_02
图1 模型结构图
【人脸关键点】——PFLD人脸关键点检测解读_损失函数_03
图2 人脸关键点

【人脸关键点】——PFLD人脸关键点检测解读_人脸检测_04
图3 辅助分支

  • 整个模型基于mobilenetv2设计
  • 上面的橙色框为人脸关键点预测分支。mobilenet-v2提取特征,3个不同尺度的特征融合之后,接全连接层输出196个值,98个关键点
  • 绿色框为辅助分支。经conv特征加强后,经fc输出3个值,分别代表欧拉角
  • 辅助分支不在实际推理的时候使用,只用于训练

3. 训练

  1. PFLD的模型训练策略

一开始我们设计的那个简单的网络,采用的损失函数为MSE,所以为了平衡各种情况的训练数据,我们只能通过增加极端情况下的训练数据、平衡各类情况下的训练数据的比例、控制数据数据的采样形式(非完全随机采样)等方式进行性能调优。(re-sample)

  1. 损失函数(re-weight)
    【人脸关键点】——PFLD人脸关键点检测解读_人脸关键点检测_05

上式中 wn为可调控的权值函数(针对不同的情况选取不同的权值,如正常情况、遮挡情况、暗光情况等等)。C为6,表示有6个类别。theta为人脸姿态的三维欧拉角(K=3),d为回归的landmark和groundtrue的度量(一般情况下为MSE,也可以选L1度量)。M表示批量大小。N表示关键点个数为98。该损失函数设计的目的是,对于样本量比较大的数据(如正脸,即欧拉角都相对较小的情况),给予一个小的权值,在进行梯度的反向传播的时候,对模型训练的贡献小一些;对于样本量比较少的数据(侧脸、低头、抬头、表情极端),给予一个较大的权值,从而使在进行梯度的反向传播的时候,对模型训练的贡献大一些。该模型的损失函数的设计,非常巧妙的解决了平衡各类情况训练样本不均衡的问题。

  1. 辅助网络
    【人脸关键点】——PFLD人脸关键点检测解读_人脸检测_06
    PFLD的训练过程中引入了一个子网络,用以监督PFLD网络模型的训练。该子网络仅在训练的阶段起作用,在inference的时候不参与;该子网络的用处,是对于每一个输入的人脸样本,对该样本进行三维欧拉角的估计,其groundtruth由训练数据中的关键点信息进行估计,虽然估计的不够精确,但是作为区分数据分布的依据已经足够了,毕竟还该网络的目的是监督和辅助训练收敛,主要是为了服务关键点检测网络。

4. 总结

  • 论文从re-sample,re-weight,数据集扩充三个方面来对多场景的人脸挑战进行处理。但是这样需要数据集中增加类别标签,如:模糊,遮挡,卡通…(暂时还没有看到非监督的方法)
  • 论文利用人脸关键点的另一个相关指标——欧拉角,进行辅助监督学习。其实人脸关键点只需要红色的虚线框,用不用欧拉角都无所谓。论文的思路是:欧拉角算是人脸姿态中的一个相关量。所以增加一个辅助分支进行监督学习。

总结,论文从通用AI设计的数据平衡+相关指标辅助两个主要方面进行人脸关键点检测器的设计