人脸关键点检测之PFLD

论文: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。

难点挑战:

  1. Local Variation,包括表情,局部光照,遮挡
  2. Global Variation,包括姿态,图片质量
  3. Data Imbalance,数据集中类别和属性分布不均匀
  4. Model Efficiency,模型的大小和计算量

主要贡献:

  1. 训练过程加入人脸几何约束geometric constraint,使得大角度,难样本,传递更大的loss。
  2. 加入人脸属性信息(profile-face, frontal-face, head-up, head-down, expression,
    and occlusion),解决数据不平衡data imbalance

Loss设计:

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

总结:

  1. 以mobilenetv2作为主干网络结构,简单实用,模型够小,速度够快,更加贴合实际工业应用。
  2. 手机端模型实际测试,效果还是差些,可能需要加更多的数据进行训练。

你可能感兴趣的