Contributions

  • 手工标注wider face数据集的5个关键点,在外监督的辅助下,人脸检测准确率得到提升
  • 添加自监督网格编码分支(3D部分不讨论)。
  • 在IJB-C测试集上,RetinaFace将ArcFace在人脸认证(face verification)上进一步提升(TAR=89.59%FAR=1e-6)。这表示更好的人脸定位可以显著提升人脸识别。
  • 在WIDER FACE难子集上,RetinaFace的AP=91.4%,比最好的两级级联方法ISRN提升1.1%

model

一文读懂——RetinaFace-编程之家
1.特征金字塔
RetinaFace应用特征金字塔从P2到P6,其中P2到P5是从Resnet残差级(C2到C5)计算而来。P6将C5通过一个3×3,s=2的卷积得到。C1到C5来自于在ImageNet-11k数据集上预训练的ResNet-152分类框架而P6通过Xavier随机初始化。
p5=c5,通过skip connection,将相同维度的feature map 相加,获得p2-p6。
一文读懂——RetinaFace-编程之家
2.上下文模块
将独立上下文模块应用于5个特征金字塔上用于提高感受野和加强严格上下文建模能力。将所有侧连的3×3卷积层和上下文模块都替换为了DCN(deformable conv),可以进一步加强非严格上下文建模能力。
一文读懂——RetinaFace-编程之家
DCN在标准卷积中向采样网络中添加了2D偏移。对于输入的一张feature map,假设原来的卷积操作是3×3的,那么为了学习offset,我们定义另外一个3×3的卷积层,输出的offset field其实就是原来feature map大小,channel数等于2(分别表示x,y方向的偏移)。这样的话,有了输入的feature map,有了和feature map一样大小的offset field,我们就可以进行deformable卷积运算。所有的参数都可以通过反向传播学习得到。
一文读懂——RetinaFace-编程之家
一文读懂——RetinaFace-编程之家

一文读懂——RetinaFace-编程之家
在获得金字塔输出p2-p6后,作者又将输出放入context module。context module将原feature分成128×2,上面的128feature经过两层3×3deformable conv生成64feature,最后将带有3个不同感受野的feature concatenate成256的feature。其目的就是增加感受野,加强上下文联系。

3.Anchor设置
Anchor设置 如表2所示,在从P2到P6的特征金字塔上使用特定尺度anchor。P2用于抓取小脸,通过使用更小的anchor,当然,计算代价会变大同事误报会增多。宽高比1:1。输入图像640×640,anchor从16×16到406×406在特征金字塔上。总共有102,300个anchors,75%来自P2层。给大家解释一下这个102300怎么来的:(160×160+80×80+40×40+20×20+10×10)x3 = 102300。
一文读懂——RetinaFace-编程之家

LOSS

对于每一个训练anchor i,我们最小化多任务损失:
一文读懂——RetinaFace-编程之家
1.人脸分类损失Lcls(pi,pi∗)L_{cls}(p_i,p_i^*)Lcls(pi,pi),pi表示月anchor i为人脸的概率,pi*表示lable真值.分类损失是softmax损失
2.人脸框回归损失Lbox(ti,ti∗)L_{box}(t_i,t_i^*)Lbox(ti,ti),其中ti=(tx,ty,tw,th)i,ti∗=(tx∗,ty∗,tw∗,th∗)it_i=(t_x,t_y,t_w,t_h)_i,t_i^*=(t_x^*,t_y^*,t_w^*,t_h^*)_iti=(tx,ty,tw,th)i,ti=(tx,ty,tw,th)i表示与正样本anchor对应的预测狂的位置与真实标注框的位置,归一化box回归目标并使用Lbox(ti,ti∗)=R(ti,ti∗)L_{box}(t_i,t_i^*)=R(t_i,t_i^*)Lbox(ti,ti)=R(ti,ti),R表示smooth_L1
3.人脸关键点回归Lpts(li,li∗)L_{pts}(l_i,l_i^*)Lpts(li,li),于box回归一致,关键点归一化后使用smooth_L1函数计算loss。