1. 核心思想
Retinaface是Insightface团队在2019年提出的新人脸检测模型,该模型在 WiderFace 数据集上刷新了AP。源代码开源于insightface,原模型使用mxnet框架进行搭建,目前社区也有其他框架复现的版本,最让人熟知的莫过于pytorch版的retinaface。Retinaface是基于检测网络RetinaNet的改进版(没错,和centerface基于centernet类似),添加了SSH网络的三层级联检测模块,提升检测精度。作者提供了两种网络的复现版本(mobilenet and resnet),基于MobileNet的构建版旨在提供更加快速的检测,基于ResNet的构建版则更重于精度的指标。
具体来说,有以下五个方面做出了贡献。
- 在WIDER FACE数据集上手动标注了五个面部关键点,在外监督信号的辅助下获得了难人脸检测的显著提升。
- 添加了一个自监督网格编码分支,用于预测一个逐像素的3D人脸信息,并使该分支与已存在的监督分支并行。
- 在WIDER FACE硬测试集上。RetinaFace比最先进的平均精度(AP)高出1.1%(达到AP等于91.4%)
- 在IJB-C测试集上,RetinaFace使当时最好的人脸特征提取模型ArcFace在人脸认证(face verification)的性能上进一步得到提升(TAR=89.59 FAR=1e-6)。
- 采用轻量级的骨干网络,RetinaFace可以在单个CPU上实时运行。
2. 详细过程
2.1 介绍
与通用的目标检测方法不同的是,人脸检测的特征宽高比变化很小(1:1到1:1.5),但是尺度变化非常大(一张图包含多张人脸,从几个像素到几千个像素)。最近最好的方法关注于单级设计,在特征金字塔上进行密集的人脸位置和尺度采样,相比双级级联方法,这种设计获得了不错的性能和速度提升。依据这种路线,我们提升的单级人脸检测框架,并且通过利用强监督和自监督型号的多任务损失,提出了当前最好的密集人脸定位方法。
2.2 网络结构
特征金字塔 原始RetinaFace应用特征金字塔从P2到P6,其中P2到P5是从Resnet残差级(C2到C5)计算而来。P6将C5通过一个3x3,s=2的卷积得到。C1到C5来自于在ImageNet-11k数据集上预训练的ResNet-152分类框架而P6通过Xavier随机初始化。
上下文模块 受启发于SSH和PyramidBox,我们也把独立上下文模块应用于5个特征金字塔上用于提高感受野和加强严格上下文建模能力。从WIDER Face Challenge2018中总结经验,我们将所有侧连的3x3卷积层和上下文模块都替换为了DCN,可以进一步加强非严格上下文建模能力。
损失头(Loss Head) 对于所有的负样本anchors,仅仅使用了分类损失。对于正样本anchors,则计算多任务损失。
Anchor设置 如表2所示,在从P2到P6的特征金字塔上使用特定尺度anchor。P2用于抓取小脸,通过使用更小的anchor,当然,计算代价会变大同事误报会增多。设置尺度步长为 21/3 ,宽高比1:1。输入图像640x640,anchor从16x16到406x406在特征金字塔上。总共有102,300个anchors,75%来自P2层。给大家解释一下这个102300怎么来的:(160*160+80*80+40*40+20*20+10*10)*3 = 102300。
在训练阶段,ground-truth的IOU大于0.5的anchor被任务是正样本,小于0.3的anchor认为是背景。anchors中有大于99%的都是负样本,使用标准OHEM避免正负样本的不均衡。通过loss值选择负样本,正负样本比例1:3
数据增强 WIDER FACE有20%的小脸,从原始图像随机crop 方形patch并缩放至640*640来生成更大的人脸。方形patch的截取大小是随机选择[0.3,1]被的原始图像短边长度。在crop边界上的人脸,保留中心在crop patch内的人脸框。除了随机crop,我们通过水平旋转一半的图像以及对另一半颜色扰动。
训练细节 使用SGD优化器训练RetinaFace(momentum=0.9,weight decay = 0.0005,batchsize=8x4),Nvidia Tesla P40(24G) GPUs.起始学习率0.001,5个epoch后变为0.01,然后在第55和第68个epoch时除以10.
3. 评估
评价了几个WIDER FACE验证集上的配置并关注难验证集 子集的AP 和mAP。通过使用FPN、上下文信息、形变卷积等策略,得到了一个很好的baseline。通过增加5点分支,在难样本上显著提升,说明5点对 人脸检测的提升很明显。对比而言,密集回归分支提升了简单和中性人脸的检测,但是对困难人脸的提升不大。把5点分支和密集分支一起使用,性能依然有提升。
3.1 人脸框准确率
分别在WIDER FACE验证集和测试集上评价了算法模型。将Retina与当前最好的24个人脸检测算法比较(i.e. Multiscale Cascade CNN [60], Two-stage CNN [60], ACFWIDER[58], Faceness-WIDER [59], Multitask Cascade CNN [66], CMS-RCNN [72], LDCF+ [37],HR [23], Face R-CNN [54], ScaleFace [61], SSH [36], SFD [68], Face RFCN[57], MSCNN [4], FAN [56], Zhu et al. [71], Pyramid-Box [49], FDNet [63], SRN [8], FANet [65], DSFD [27],DFS [50], VIM-FD [69], ISRN [67])..RetinaFace在AP上比以上算法都好。在验证集上,96.9%easy96.1%medium以及91.8%Hard,在测试集上,96.3%容易95.6中性91.4%困难。
如图所示,展示了密集人脸情况下的检出质量,在0.5以上的人脸检出900个,总共是1151人脸。除了人脸框准确之外,5点定位在不同的姿态遮挡分辨率下也都很鲁棒。尽管在严重遮挡的情况下密集人脸定位依然有失败的案例,但在一些清晰的大人脸上效果很好,甚至都可以看到一个表情变化。
3.2 五点定位准确率
为了评价五点定位准确率,我们在AFLW数据集上(24386人脸)和WIDER FACE验证集(18.5k人脸)比较了MTCNN和RetinaFace。使用人脸框大小归一化距离。如图7a所示,给出在AFLW上每个点的平均误差。RetinaFace将归一化平均误差 NME从MTCNN的2.72%下降为2.21%。在图7b中,展示了在WIDER FACE 验证集上的累积误差分布CED。与MTCNN相比,在NME阈值为10%时的漏报率由26.31%降到9.37%。
3.3 人脸识别准确率
本文展示了我们的人脸检测方法是如何提升Arcface人脸识别方法准确率的。本文分别比较了使用MTCNN和Retinaface来检测和对齐所有的训练数据(MS1M)以及测试数据(LFW,CFP-FP,AGEDB-30,IJBC),保留原Arcface中使用的Resnet100基础网络以及损失函数。比较解过如表4所示,基于CFP-FP,证明Retinaface可以提升Arcface的验证正确率从98.37%到99.49%。这个结果展示了正脸-侧脸的人脸认证已经达到了正脸-正脸的人脸认证水平。(99.86%在LFW上)
如图9所示展示了在FAR=1e-6时IJB-C数据中的ROC曲线。我们使用了两个tricks(镜像测试以及人脸检测评分去加权模板中的样本)来提升人脸认证准确率。使用retinaface代替mtcnn,TAR从88.29%提升到了89.59%。这表示(1)人脸检测和对齐对人脸识别影响很大(2)Retinaface相比MTCNN更加强壮。
此外,我们利用RepVGGBlock分别优化inter_conv,cls_conv/reg_conv层。实验结果表明用RepVGGBlock实现inter_conv层会带来性能上的下降,而RepVGGBlock实现的cls_conv/reg_conv层与原始卷积层在stack较大时效果相当,在stack比较小时,RepVGGBlock能起到优化作用。
3.4 inference效率
在测试时,retianface灵活而高效的进行人脸定位。除了权值较多的模型(ResNet-152,262M,AP=91.8%在WIDER FACE难样本集合上),我们也开发了一个轻量级的模型(MobileNet-0.25,1M,AP=78.2%在WIDER FACE难样本集合上)来加速预测。
对于轻量级网络,我们可以通过一个步长为4,7x7的卷积,快速地减少数据大小,像文献【36】那样在P3,P4,P5后面添加密集anchors,并删除了形变层。此外,前两个卷积层使用imagenet预训练初始化后再训练时固定下来以获得更高的准确率。
表格展示了不同输入尺寸下两个模型的耗时。其中,密集回归分支的时间没有统计进去。使用TVM来加速模型预测,在NVIDIA Tesla P40 GPU,Intel i7-6700k cpu和ARM-RK3399。