一篇优秀的人脸特征点检测算法,学习一下~
paper: PFLD: A Practical Facial Landmark Detector
link: PFLD paper
code: no open source yet Android apk
摘要
- 人脸关键点检测器实际应用所需特征: 准确性好,高效,模型轻量级;
- 本文提出在非限定条件下的具有理想检测精度的轻量级landmark检测模型,在移动设备上能达到超实时的性能:
- 仅在训练阶段进行旋转信息的估计来进行几何规范的特征点定位;
- 设计了新的损失函数,针对训练集中数据的不同状态调整其在损失函数中的权重缓解数据不平衡的问题;
- 算法效果: 模型size 2.1Mb,在Qualcomm ARM 845 处理器上达到140fps
引言
- 人脸关键点检测作为人脸相关应用的基础部分面对很多挑战,包括检测精度、处理速度、模型size的等多维的因素都要考虑到,在现实场景中很慢获取质量很高的人脸,因此引入了几个挑战:
- 局部变化: 现实场景中人脸的表情、光照、以及遮挡情况变化都很大;
- 全局变化: 姿态和成像质量也影响图像中人脸的表征,人脸全局结构的错误估计直接导致定位不准;
- 数据不平衡: 不平衡的数据使得算法模型无法正确表示数据的特征;
- 模型的有效性: 由于手机和嵌入式设备计算性能和内存资源的限制,必须要求检测模型的size小处理速度快;
- 本文贡献:
- 设计出一个使用的人脸特征点检测器PFLD,在复杂情况下也能保持高精度;
- 针对全局变化,PFLD采用分支网络来估计人脸样本的集合信息;
- 针对数据不平衡,设计新的loss function,加大对稀少样本错误的惩罚(感觉和focal loss思想类似)
- 使用mult-scale fc层用于扩大感受野精确定位人脸的特征点;
- 使用Mobilenet block构建网络的backbone提升模型的处理速度减少模型计算量
本文方法
- 设计新的损失函数同时处理1,2,3三个问题;
- 考虑到问题4提出由主干网络预测特征点和估计几何信息的辅助网络组成的算法架构;
Loss Function
- loss function解析:
L
:
=
1
M
∑
m
=
1
M
∑
n
=
1
N
γ
n
∥
d
n
m
∥
\mathcal{L} :=\frac{1}{M} \sum_{m=1}^{M} \sum_{n=1}^{N} \gamma_{n}\left\|\mathbf{d}_{n}^{m}\right\|
L:=M1∑m=1M∑n=1Nγn∥dnm∥
- M M M表示人脸样本的数量, N N N表示每张人脸预设的需要检测的特征点数目;
- ∥ ⋅ ∥ \|\cdot\| ∥⋅∥计算在本文中表示landmark的 l 2 l_2 l2距离;
- γ n \gamma_{n} γn代表不同类型样本的不同权重;
- 综合几何约束和数据不平衡的问题提出新的loss:
L
:
=
1
M
∑
m
=
1
M
∑
n
=
1
N
(
∑
c
=
1
C
ω
n
c
∑
k
=
1
K
(
1
−
cos
θ
n
k
)
)
∥
d
n
m
∥
2
2
\mathcal{L} :=\frac{1}{M} \sum_{m=1}^{M} \sum_{n=1}^{N}\left(\sum_{c=1}^{C} \omega_{n}^{c} \sum_{k=1}^{K}\left(1-\cos \theta_{n}^{k}\right)\right)\left\|\mathbf{d}_{n}^{m}\right\|_{2}^{2}
L:=M1∑m=1M∑n=1N(∑c=1Cωnc∑k=1K(1−cosθnk))∥dnm∥22
- ∑ c = 1 C ω n c ∑ k = 1 K ( 1 − cos θ n k ) \sum_{c=1}^{C} \omega_{n}^{c} \sum_{k=1}^{K}\left(1-\cos \theta_{n}^{k}\right) ∑c=1Cωnc∑k=1K(1−cosθnk)就代表权重 γ n \gamma_{n} γn
- 其中 θ 1 , θ 2 , and θ 3 ( K = 3 ) \theta^{1}, \theta^{2}, \text { and } \theta^{3}(\mathrm{K}=3) θ1,θ2, and θ3(K=3)分别代表gt和prediction在yaw、pitch、roll三种角度之间的偏差(理解一下人脸姿态估计的三种角度: pitch代表上下翻转,yaw代表水平翻转,roll代表平面内旋转),角度越大 cos \cos cos值越小,权重越大
- C C C表示不同的类别的人脸: 正脸、侧脸、抬头、低头、表情以及遮挡情况, ω n c \omega_{n}^{c} ωnc根据样本类别分数进行调整,本文采用分类的倒数作为权重
- d n m \mathbf{d}_{n}^{m} dnm由backbone net计算得出, θ n k \theta_{n}^{k} θnk由辅助网络计算得出,然后由loss建立两者的联系;
backbone network
- backbone特性: mobilenet block + multi scale fc
auxiliary network
- 辅助网络只在训练阶段起到辅助作用,测试阶段不需要,辅助网络特性:在不需要正面人脸作为输入的情况下计算出目标的角度
- 辅助网络的输入为backbone的第4的block;
实验结果
- PFLD在各数据的表现只能用优秀来形容…先上一图,在mean normalised error相同的情况下,PFLD的精度很优秀
- 再上一图,PFLD在各个平台的性能表现
- 继续展现实力啦,不同的评价标准不同的数据子集,精度依然是最好的
- 最后一图,在AFLW数据集的表现,结果同样是最优秀的
- 在一些具有挑战性样本上的表现
总结
- 提出FDLD人脸特征点检测器,由主干网络和辅助网络组成,主干网络以mobilenet block为主要结构,同事引入多尺度fc扩大感受野增强面部结构特征的表达能力,辅助网络可以有效估计旋转信息,用来提升特征点的定位能力;
- 有几何规范化和数据不平衡问题引出新loss函数,整个算法在精度、模型尺寸、运行速度上都由于最先进的方法;
- TO DO:引入其他几何/结构信息来提升精度, 替换基础的loss(L2),针对训练阶段遇到的问题设计更加复杂的加权策略;
- By the way… 之前没有研究过人脸姿态估计相关内容,理解上可能有些不对望指正… and 这个算法目前只有apk,还没有开源(期待),算法整体思路比较简单,但是效果很棒,在日常算法开发研究过程中需要多思多想多尝试啊