insightface新作:RetinaFace单阶段人脸检测

论文地址:RetinaFace: Single-stage Dense Face Localisation in the Wild

Github开源代码: github.com/deepinsight/

insightface团队再出新作。人脸检测大家应该也很熟悉了,这篇论文实际上在目标检测这一块的变动不大,但是多加了人脸关键点的损失来辅助训练,同时增加了一个所谓自监督学习的分支,在这个分支上进行2D到3D的编码与解码,同时计算进行解码编码还原后的五个人脸关键点的损失。基于多重损失的设计让该检测器又进步了一些,目前在insightface github项目上已经开源了,快去围观,实际测试表示的确有提升

损失函数

损失函数的修改是这篇论文的一个着重改进点。为了实现下面这个损失的训练作者还在WIDER FACE这个巨大的人脸数据集上进行了五点的标注。

L = L_{cls(p_i, p_i^*)} + \lambda_1p_i^*L_{box}(t_i, t_i^*) + \lambda_2p_i^*L_{pts}(l_i, l_i^*) + \lambda_3p_i^*L_{pixel} \\

前面2项还是比较好理解,和以往的多任务人脸检测的损失是一样的,分类的损失,bbox的回归损失,第三项是五个人脸关键点的回归损失。最后一项比较陌生。这一项损失是接下来要介绍的所谓Dense Regression分支带来的损失,我下面会详细介绍。 \lambda_1, \lambda_2, \lambda_3 的取值分别是0.25, 0.1和0.01,也就是说来自于带标签的检测和landamark的损失权重会更高, 而最后这个基于自监督的Dense Regression Branch的权重较少。

Dense Regression Branch

这个分支简单来说,就是将2D的人脸映射到3D模型上,再将3D模型解码为2D图片,然后计算经过编解码的图片和原始图片的差别。中间用到了图卷积。

这里实际上用到了mesh decoder来做解码,mesh decoder是一种基于图卷积的方法,参数量会比我们平时用的普通2D卷积计算量要少。可以看看下图,我们知道普通的卷机操作参数一般是 Kernel_H * Kernel_w * Channel_{in} * Channel_{out} , 而图卷积在计算参数的时候,参数量只有 K * Channel_{in} * Channel_{out}

在Decider完之后会做一个3D到2D的映射。之后会有一个所谓Dense Regression Loss的东西。实际上就是比较没有经过编码解码的图片和编码解码完的图片的五个人脸特征点的位置的差别啦。

L_{pixel} = \frac{1}{W * H} \sum_i^W \sum_j^H || R(D_{ST}, P_{cam}, P_{ill})_{i, j} - I^*_{i, j} ||_1 \\

W, H 就是anchor I的宽高啦。

实现细节

这一块不详细说了,主网络是基于ResNet152的金字塔结构,对于每一层金字塔都有特定的Anchor Setting,据说这样可以捕捉到不同的信息, P2用于设置为捕微小人脸的功能。中间还使用了OHEM来平衡positive 和negative的anchors,因为negative anchors的数量明显要多。同时对小人脸数据集做了Resize以增量训练。总的来说,感觉这是一个结合了现在很多的实验技巧的网络,最后的效果也证明比5点mtcnn有了提升。而且性能也很不错,在单CPU上也可轻松运行。

结果就是会比MTCNN要厉害~

发布于 2019-07-30

文章被以下专栏收录