论文:PFLD: A Practical Facial Landmark Detector
Github:http://sites.google.com/view/xjguo/fld
GitHub - polarisZhao/PFLD-pytorch: PFLD pytorch Implementation
论文基于mobilbeNet v2的主干结构,设计了一个快速准确的人脸关键点检测模型,PFLD。其中,PFLD 0.25X仅仅2.1Mb,速度达到了140fps。
n表示第n个关键点
m表示第m个输入图片,
rn表示随机的权重
d表示loss的距离,例如L1,L2
θ1, θ2, and θ3 (K=3),表示预测的欧拉角,yaw,pitch,roll和groundtruth之间的偏差。
w表示人脸属于profile-face, frontal-face, head-up, head-down, expression,occlusion这几种类别里面的分数。
网络输入图片为112*112,数据增强方法包括,随机水平翻转,[-30,30]之间每5度的角度旋转,20%的人脸随机遮挡。
网络以mobileNetv2作为主干网络结构。后续分为绿色和红色2个分支。红色的分支为主干分支,用于回归预测68个关键点,绿色的分支为辅助分支,用于预测欧拉角。对于推理阶段,只使用红色的主干分支。
NME:normalized mean error
所有预测关键点和groundtruth关键点之间的L2 Norm,然后除以(关键点的个数*两只眼睛之间的距离),
def compute_nme(preds, target):
""" preds/target:: numpy array, shape is (N, L, 2)
N: batchsize L: num of landmark
"""
N = preds.shape[0]
L = preds.shape[1]
rmse = np.zeros(N)
for i in range(N):
pts_pred, pts_gt = preds[i, ], target[i, ]
if L == 19: # aflw
interocular = 34 # meta['box_size'][i]
elif L == 29: # cofw
interocular = np.linalg.norm(pts_gt[8, ] - pts_gt[9, ])
elif L == 68: # 300w
# interocular
interocular = np.linalg.norm(pts_gt[36, ] - pts_gt[45, ])
elif L == 98:#wflw
interocular = np.linalg.norm(pts_gt[60, ] - pts_gt[72, ])
elif L == 106:#lapa
interocular = np.linalg.norm(pts_gt[66, ] - pts_gt[79, ])
else:
raise ValueError('Number of landmarks is wrong')
rmse[i] = np.sum(np.linalg.norm(pts_pred - pts_gt, axis=1)) / (interocular * L)
return rmse