论文:https://arxiv.org/pdf/1905.00641.pdf
代码:https://github.com/deepinsight/insightface/tree/master/RetinaFace
Pytorch复现:https://github.com/biubug6/Pytorch_Retinaface
RetinaFace于19年5月份出现,当时取得了state-of-the-art,可以说是目前开源的最强人脸检测算法。
一、论文简介
RetinaFace,它利用联合监督和自我监督的多任务学习,在各种人脸尺度上执行像素方面的人脸定位。
(1)在WIDER FACE数据集上手动注释五个面部标志,并在这个额外的监督信号的帮助下观察硬面检测的重要改进。
(2)进一步增加了一个自监督网格解码器分支,用于与现有的受控分支并行地预测像素三维形状的面部信息。
(3)在WIDER FACE硬测试装置上,RetinaFace的性能优于现有技术平均预测(AP)1.1%(达到AP等于91.4%)。
(4)在IJB-C测试集上,RetinaFace使最先进的方法(ArcFace)能够改善他们在面部验证中的结果(FAR = 1e-6的TAR = 89.59%)。
(5)通过采用轻量级骨干网络,RetinaFace可以在单个CPU内核上实时运行,以实现VGA分辨率的显示。
————————————
FAR(False Accept Rate)表示错误接受的比例
TAR(True Accept Rate)表示正确接受的比例
VGA分辨率 320*240,目前主要应用于手机及便携播放器上
————————————
创新点
1、整合:人脸检测、人脸对齐、像素级的人脸分析、3D密集通信回归。
2、通过利用强监督和自监督多任务损失函数来实现上述功能。
3、基于单阶段设计,提出了一种名为RetinaFace的新型像素智能人脸定位方法,该方法采用多任务学习策略同时预测人脸分数,面部框,五个点和三维位置。
4、Mesh Decoder使用图卷积神经网络进行加速
二、 网络结构
RetinaFace的想法如图1所示。
由上图可以看到,RetinaFace的detect head有四个并行的分支:人脸分类,框回归,关键点检测和人脸像素的三维位置和对应关系。
RetinaFace的大致结构如下图:
一共有四个模块,分别是Backbone,FPN,Context Module和Multi-task Loss。其中Multi-task Loss对应图1的四个并行分支Loss。
下面根据代码直观展示RetinaFace的整体结构,我借鉴大佬@茴香豆502的图片,如有侵权,请联系删除
三、Implementation details
3.1 FPN
RetinaFace采用从P2到P6的特征金字塔层,其中P2到P5通过使用自顶向下和横向连接计算相应的ResNet残差阶段(C2到C5)的输出。P6是在C5处通过一个步长2的3x3卷积计算得到到。C1-C5是在ImageNet-11k数据集上预先训练好的ResNet-152[21]分类网络,P6是用“Xavier”方法随机初始化的。
3.2 Context Module
RetinaFace在五个特征金字塔层应用单独的上下文模块来提高 感受野并增加刚性上下文建模的能力。从2018年 WIDER Face 冠军方案中受到的启发, 我们也在横向连接和使用可变形卷积网络(DCN)的上下文模块中替换所有 3x3的卷积,进一步加强非刚性的上下文建模能力。
SSH网络的检测模块,将一个上下文模块与conv叠加后生成分类头和回归头得到网络的输出。
上下文模块的作用是扩张预检测区域的上下文信息。
3.3 Multi-task Loss
对于任何训练的anchor i,RetinaFace的目标是最小化下面的多任务的 loss:
- Lcls:人脸分类loss,这里的pi是anchor i为人脸的预测概率,对于pi * 是1是positive anchor,0代表为negative anchor。分类loss Lcls采用softmax loss,即softmax loss在二分类的情况(人脸/非人脸)的应用。
- Lbox:人脸框回归loss,这里的ti={tx,ty,tw,th},ti * ={tx *,ty *,tw * ,th *}分别代表positive anchor相关的预测框和真实框(ground-truth box)的坐标。我们按照 Fast r-cnn的方法对回归框目标(中心坐标,宽和高)进行归一化,使用Lbox(ti,ti *)=R(ti-ti *),这里R 是 smooth-L1 Loss
- Lpts:人脸关键点回归loss,五点,这里li={l x1,l y1,…l x5,l y5},li *={l x1 *,l y1 *,…l x5 *,l y5 *}代表预测的五个人脸关键点和基准点(ground-truth)。五个人脸关键点的回归也采用了基于anchor中心的目标归一化。
Lpixel:自监督3D Mesh Renderer稠密人脸回归
loss调节参数 λ1-λ3 设置为0.25,0.1和0.01,这意味着在监督信号中,RetinaFace增加了边界框和关键点定位的重要性。
3.4 anchors设置
如上表所示,RetinaFace从P2到P6的特征金字塔级别上使用特定于比例的锚点,例如[56]。 在这里,P2旨在通过平铺小anchors来捕获微小的面部,但要花费更多的计算时间,并且要冒更多的误报风险。RetinaFace将scale step设置为2^(1/3),aspect ratio设置为1:1。输入图像大小为 640*640 , anchors可以 覆盖 从16x16 到 406x406的特征金字塔层。从五个下采样(4,8,16,32,64)的feature map平铺anchors,每个feature map中的点预测3个anchors,总共有(160 * 160 + 80 * 80+40 * 40+400+100) * 3 = 102300个anchors,其中75%来自P2。不过在代码中,只用了8,16,32这三个下采样层的输出feature map,且每个点只放两个anchors。
所以,对于640 * 640的输入,32,16,8的下采样输出,每个点的输出是【(1,4,20,20),(1,8,20,20),(1,20,20,20)】,【(1,4,40,40),(1,8,40,40),(1,20,40,40)】,【(1,4,80,80),(1,8,80,80),(1,20,80,80)】。
其中4,8,20分别代表一个点两个anchors的类别数(2 anchors * 2类),(2 anchors * 框的信息),(2 anchors * 5个关键点信息(一个点x,y))
3.5 数据增强
WIDER FACE训练集中大约 有 20% 的小人脸 , RetinaFace遵循 [68, 49 ) 并从原始图像随机crop方形patches并调整这些 patches到 640*640 产生更大的训练人脸。更具体地说,在原始图像的短边[0.3,1]之间随机裁剪正方形patches。对于crop边界上的人脸,如果人脸框的中心在crop patches内,则保持人脸框的重叠部分。除了随机裁剪,我们还通过0.5概率的随机水平翻转和光度颜色蒸馏来增加训练数据。
3.6 学习率调整
使用warmup learning 策略,学习速率从10e-3,在5个epoch后上升到10e-2,然后在第55和第68个epochs时除以10。训练过程在第80个epochs结束。
3.7 实验结果
RetinaFace与其他24个stage-of-the-art的人脸检测算法对比。RetinaFace在所有的验证集和测试集都达到的最好的AP,在验证集上的AP是96.9%(easy),96.1%(Medium)和91.8%(hard)。在测试集的AP是96.3%,95.6%,91.4%.相比与当前最好的方法(Improved selective refinement network for face detection)在困难的数据集(包含大量的小人脸)的AP对比(91.4% vs 90.3%)。
此外,使用轻量Mobilenet-0.25作为backbone,对于VGA可以在CPU上达到实时。
RetainFace在最大的人脸检测图片中可以检测到900个人脸,主要依靠联合额外监督信息和自监督多任务学习方法
参考1:https://blog.csdn.net/c2250645962/article/details/106331720
参考2:https://mp.weixin.qq.com/s?__biz=MzU4NTY4Mzg1Mw==&mid=2247486695&idx=2&sn=9b919fb315c729bd88efccdb19d4876c&chksm=fd878a05caf00313aa6b7ae53d15c53f35e46c68ef5cfdea08e9989186f9e65dec0186f440cd&scene=178#rd