代码:https://github.com/deepinsight/insightface/tree/master/RetinaFace

https://github.com/biubug6/Pytorch_Retinaface

 

论文基于RetinaNet进行改进,提出了RetinaFace。传统的目标检测框架RetinaNet只进行分类,边框预测。RetinaFace再此基础上,增加了人脸关键点landmark预测,稠密3D人脸预测。

目前CNN人脸检测的准确路 人脸检测算法retinaface_3D

主要贡献:

  1. 人工在人脸检测数据集WIDER FACE 上标注了人脸的5个关键点,通过增加5个关键点的loss约束,使得在困难样本上的检测效果明星提升。
  2. 增加了基于自监督的网格解码分支,用于预测3D人脸形状。
  3. 在WIDER FACE 的hard 测试集上,取得了91.4%的效果。
  4. 在IJB-C 测试集上,使用RetinaFace做预处理,可以获得更佳的人脸识别精度(TAR=89:59% for FAR=1e-6)
  5. 采用mobileNetv1这样的轻量框架,RetinaFace可以在VGA分辨率下,单核cpu实现实时推理。
  6. 贡献了人脸关键点的额外标注及其代码。

 

人脸的特点:

很小的长宽比,1:1 ---- 1:1.5 ,很大的尺度scale变化。

 

Two-stage v.s. single-stage :

one-stage更高效,具有更高的召回率,缺点是误检率也大,框的定位不够准确。

 

Loss设计:

目前CNN人脸检测的准确路 人脸检测算法retinaface_目前CNN人脸检测的准确路_02

Lcls表示分类的loss,

Lbox表示人脸框的loss,

Lpts表示人脸关键点的loss,

Lpixel表示稠密3D人脸的2D投影图和原图之间的L1 loss。λ1-λ3 分别为0.25,0.1,0.01

 

Lpixel分支,使用了图卷积,相比传统卷积具有更少的参数量。

目前CNN人脸检测的准确路 人脸检测算法retinaface_卷积_03

传统卷积的参数量大小为K*K*Cin*Cout,图卷积的参数量大小为K*Cin*Cout。其中K表示连接的线路个数。如上图,K=1表示和红色点直接相连,K=2表示距离红色点路径=2的所有点,K=3表示距离红色点路径=3的所有点。

目前CNN人脸检测的准确路 人脸检测算法retinaface_卷积_04

稠密回归分支,分别通过图卷积预测形状和纹理参数Pst,维度为128维。相机参数Pcam,包括相机的位置,姿势,焦距,维度为7维。光源参数Pill,包括光源的位置,颜色,环境光颜色,维度为9维。通过这3个预测,生成3D的人脸mesh,然后再将其投影为2D的图片,计算其和输入图片的L1距离。

 

网络结构:

目前CNN人脸检测的准确路 人脸检测算法retinaface_目前CNN人脸检测的准确路_05

整体结构为Resnet-152+FPN,或者MobileNetv1+FPN的设计,其中FPN包括,P2,P3,P4,P5,P6共5个分支。

Context Module 模块,采用可变形卷积DCN来替换传统的3*3卷积。

 

Anchor设计:

目前CNN人脸检测的准确路 人脸检测算法retinaface_github_06

 

WIDER FACE 额外标注:

目前CNN人脸检测的准确路 人脸检测算法retinaface_github_07

目前CNN人脸检测的准确路 人脸检测算法retinaface_目前CNN人脸检测的准确路_08

作者将WIDER FACE中的人脸数据集分成5个档次,分别为无可置疑的68个关键点,可以标注68个关键点,无可置疑的5个关键点,可以标注5个关键点,可以被纹理区分。

 

实验结果:

目前CNN人脸检测的准确路 人脸检测算法retinaface_3D_09

目前CNN人脸检测的准确路 人脸检测算法retinaface_卷积_10