Retinaface论文翻译及理解

 Retinaface论æç¿»è¯åç解

摘要

虽然在不受控条件下的人脸检测已经取得了非常显著的进展,在自然环境下准确有效的人脸检测依然具有挑战。本文提出了一种单级(single-stage)人脸检测器:RetinaFace. 通过联合外监督(extra-supervised)和自监督(self-supervised)的多任务学习,RetinaFace对各种尺度条件下的人脸可以做到像素级别的定位。本文作了以下几个贡献:

1、 我们手工标注了WIDER FACE数据集上的五点,在外监督信号的辅助下获得了难人脸检测的显著提升。(https://zhuanlan.zhihu.com/p/101600780

2、添加了一个自监督网格编码分支,用于预测一个逐像素的3D人脸信息。该分支与已存在的监督分支并行。

3、在WIDER FACE测试集上,RetinaFace(AP = 91.4%)比最好的模型AP高出1.1%

4、在IJB-C测试集上,RetinaFace使当前最好的ArcFace在人脸认证(face verification)上进一步提升(TAR=89.59 FAR=1e-6)

5、通过利用轻量级的骨架网络,RetinaFace可以在单一CPU上对一张VGA分辨率的图像实时运行

标注和代码获取地址

Deep Insightinsightface/tree/master/RetinaFace

本节概念:TAR True Accept Rate 正确接受率; FAR False Accept Rate 错误接受率 ;

VGA分辨率:图像大小640x480 HD图像:1920x1080 4K图像:4096x2160


1 介绍

自动人脸定位是人脸图像分析如人脸属性(表情,年龄,ID识别)的先决步骤。人脸识别传统的窄定义为:在没有任何尺度和位置先验信息的条件下估计人脸的包围框。然而在本文中,人脸定位是一个更宽泛的定义,包括人脸检测,人脸对齐,像素级别的人脸分解以及3D密度回归。那种密集的人脸定位可以为所有不同尺度的人脸提供准确的人脸位置信息。

与通用的目标检测方法不同的是,人脸检测的特征宽高比变化很小(1:1到1:1.5),但是尺度变化非常大(从几个像素到几千个像素)。最近最好的方法关注于单级设计,在特征金字塔上进行密集的人脸位置和尺度采样,相比两级级联方法,这种设计获得了不错的性能和速度提升。依据这种路线,我们提升的单级人脸检测框架,并且通过利用强监督和自监督型号的多任务损失,提出了当前最好的密集人脸定位方法。思想如图1:

图 1:单级逐像素人脸定位方法利用外监督和自监督的多任务学习同时包含人脸框分类及回归分支。每个positive anchor输出:人脸得分,人脸框,5个人脸关键点,投射的图像平面上的3D人脸顶点

特别的,人脸定位训练过程包含分类和人脸框回归损失。在一个联合级联框架中将人脸检测和对齐结合,获得的人脸形状可以为人脸分类提供更好的特征。基于这种思想,MTCNN和STN同时检测人脸和五个关键点。基于训练数据的限制,JDA,MTCNN ,STN并没有验证小人脸是否可以从5个关键点的外监督中受益。本文想要回答的一个问题是,是否可以通过5个关键点重建的外监督信号将WIDER FACE难测试集当前最好的性能90.3%向前推进。

在Mask R-CNN中,通过增加目标淹没的分支并与检测框识别和回归分支并行,检测性能显著提升。这证实了密集像素级别的标注对于提升检测性能也有用。然而,WIDER FACE中具有挑战的人脸无法获取密集的人脸标注。既然监督信号不易获取,那么问题就变成了我们是否可以利用无监督的方法进一步提升人脸检测呢。

FAN提出一个anchor级别的注意力图来提升遮挡人脸检测。然而,提出的注意力图比较粗糙且不包含语义信息。最近,自监督3D形变模型获得了不错的自然条件下的3D人脸。特别的,Mesh Decoder利用在形状和纹理上的图卷积获得了超实时的速度。然而,将mesh decoder应用到单级检测器上的最大挑战是:(1)相机参数很难准确估计(2)联合潜在形状和纹理估计是从一个简单的特征向量预测的(特征金字塔上的1x1卷积)而不是通过RoI池化特征,这样就存在特征漂移的风险。本文通过对于一个像素级3D人脸形状的自监督学习与存在的监督分支并行,利用网络编码(mesh decoder)分支。

总之,主要贡献:

  1. 基于单级设计,提出一个新的像素级人脸定位方法RetinaFace,利用多任务学习策略同事预测人脸评分,人脸框,5个段建店以及对应于每个人脸像素的3D位置。
  2. 在WIDER FACE难子集上,RetinaFace的AP=91.4%,比最好的两级级联方法ISRN提升1.1%
  3. 在IJB-C测试集上,RetinaFace将ArcFace在人脸认证(face verification)上进一步提升(TAR=89.59%FAR=1e-6)。这表示更好的人脸定位可以显著提升人脸识别
  4. 通过利用轻量级的骨架网络,RetinaFace可以在单一CPU上对一张VGA分辨率的图像实时运行
  5. 标注和源码

 

2. 相关工作

图像金字塔vs特征金字塔:滑动窗策略可以追溯到几十年前。里程碑式的工作是Viola-Jones提出级联链来拒绝图像金字塔中的错误人脸并达到实时,引领尺度不变形人脸检测框架框架的广泛引用。尽管在图像金字塔上的滑动窗是主要的检测方式,随着特征金字塔的出现,在多个尺度特征图上的滑动anchor被快速应用于人脸检测。

两级vs单级:当前人脸检测方法继承了一些通用检测方法的成果,主要分为两类:两阶方法如Faster RCNN和单阶方法如SSD和RetinaNet。两阶方法应用一个“proposal and refinement”机制提取高精度定位。而单阶方法密集采样人脸位置和尺度,导致训练过程中极度不平衡的正样本和负样本。为了处理这种不平衡,采样和re-weighting方法被广泛使用。相比两阶方法,单阶方法更高效并且有更高的召回率,但是有获取更高误报率的风险,影响定位精度。

上下文建模:为了增强模型对小人脸的上下文推理能力,SSH和PyramidBox在特征金字塔上采用了上下文模块来增强欧几里得网格中获取的感受野。为了增强CNN的非严格变换模拟能力,形变卷积网络(DCN)利用一个新的形变层来模拟几何形变。WIDER Face挑战2018的冠军方案说明对于人脸检测来说,严格(扩大)和非严格(变形)上下文建模是互补并且正交。

多任务学习:联合人脸检测和对齐被广泛应用以提供更适用于提取人脸特征的人脸形状。在Mask R-CNN中,检测性能通过增加一个预测目标掩模的并行分支,检测性能得到显著提升。Densepose利用Mask-RCNN的架构,来获取每个选择区域的密集标签和位置。尽管如此,密集回归标签是通过监督学习训练的。此外,dense分支是一个很小的FCN,应用于每一个RoI上来预测像素到像素的密集映射。

3. RetinaFace

3.1 多任务损失

对于每一个训练anchor i,我们最小化多任务损失:

(1)人脸分类损失[公式] ,pi表示预测anchor i为人脸的概率,pi*表示真值,正样本anchor为1,负样本anchor为0.分类损失Lcls是softmax损失,对于二分类(是人脸/不是人脸);(2)人脸框回归损失 [公式] ,其中[公式] 表示与正样本anchor对应的预测框的位置和真实标注框的位置。归一化box回归目标并使用 [公式] 其中R表示smooth_L1鲁棒性回归函数(参见fast Rcnn)。(3)人脸关键点回归函数 [公式]

分别表示正样本人脸anchor5关键点的预测和真值。与box回归一致,人脸5关键点会与同样使用目标归一化。(3)密集回归损失 [公式] 参见公式3。 [公式] 的值分别设置为0。25,0.1,0.01,意味着提升了来自监督信号的更好人脸框和五点位置的重要性。

3.2 密集回归分支

网格编码(Mesh Decoder)直接利用网格编码器(网格卷积和网格上采样),也就是基于快速局部谱滤波器(fast localised spectral filtering)的图卷积方法。为了获得更快的速度,我们联合形状和上下文解码。

下面 将简单解释图卷积的概念并且说明他们可以被用于快速解码的原因。如图3(a)所示,一个2D卷积操作是一个欧几里得网格感受野中的“核加权近邻求和”(kernel-wighted neighbour sum)。类似的,图卷积利用了图3(b)中的类似感念。然而,图近邻距离的计算方法是通过连接两个顶点的边的最小数量。定义一个人脸网格 [公式] V是人脸顶点集合,包含形状和纹理信息。 [公式] 是一个稀疏临接矩阵用于编码两个顶点之间的连接状态。图拉普拉斯定义为 [公式]

核 [公式] 的图卷积可以用切比雪夫K阶多项式展开来表示:

[公式][公式]处的值。整体的计算过程非常高效,因为包含了K个离散矩阵向量相乘和一个密集矩阵乘法 [公式]

图3a 2D卷积

图3b 图卷积

可微渲染器(Differentable Renderer)在预测了形状和纹理参数 [公式] 后,利用一个高效可微3D网格渲染器来投影彩色网格 [公式] 到一个2D图像平面上,利用相机参数 [公式] 也就是相机位置,相机形状和焦距以及光照参数 [公式] (光源位置,颜色值,环境光颜色)

密集回归损失一旦得到了渲染2D人脸 [公式] 我们比较渲染得到人脸与原始2D人脸的像素差异:W H表示anchor区域I i j *的宽和高

4 实验

4.1 数据集

WIDER FACE数据集包含32,203个图像和393,703个人脸框,尺度, 姿态,表情,遮挡和光照变化都很大。WIDER FACE数据集被分为训练40% 验证10% 和测试50%三个子集,通过在61个场景分类中随机采样。基于EdgeBox的检测率,通过递增合并难样本,困难程度分为3级:容易,中性和困难。

额外标注

如图4和表1,我们定义的5个人脸质量级别,依据人脸关键点标注困难程度并且标注5个关键点(眼睛中心,鼻尖,嘴角)。我们总共标注了84.6k个训练集人脸和18.5k个验证集人脸。

图4

 

表1

4.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,则计算多任务损失。我们在不同的特征图之间 [公式] 利用一个共享损失头(1x1卷积).对于网格编码,我们利用一个预训练模型【70】,计算开销很小。

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

表2

在训练阶段,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.

测试细节 在WIDER FACE上测试,利用了flip和多尺度(500,800,1100,1400,1700)策略。使用IoU 阈值0.4,预测人脸框的集合使用投票策略。

4.3 消融实验

为了获得更好的理解,做了扩展实验i检验标注五点和密集回归分支对人脸检测性能的影响。除了在简单,中性和容易的数据集上使用标准的AP测量策略(IoU-0.5),我们也利用 难验证子集,测试更严格的AP在IoU=0.5:0.05:0.95.

如表格3所示,评价了几个WIDER FACE验证集上的配置并关注难验证集 子集的AP 和mAP。通过使用FPN、上下文信息、形变卷积等策略,得到了一个很好的baseline。通过增加5点分支,在难样本上显著提升,说明5点对 人脸检测的提升很明显。对比而言,密集回归分支提升了简单和中性人脸的检测,但是对困难人脸的提升不大。把5点分支和密集分支一起使用,性能依然有提升。

表3

4.4 人脸框准确率

分别在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%困难。

如图6所示,展示了密集人脸情况下的检出质量,在0.5以上的人脸检出900个,总共是1151人脸。除了人脸框准确之外,5点定位在不同的姿态遮挡分辨率下也都很鲁棒。尽管在严重遮挡的情况下密集人脸定位依然有失败的案例,但在一些清晰的大人脸上效果很好,甚至都可以看到一个表情变化。

图6

4.5 五点定位准确率

为了评价五点定位准确率,我们在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%。

 

4.6 密集人脸关键点准确性

除了人脸框和5点,Retinaface还输入密集人脸关键点,并且是自监督训练。在AFLW2000-3D数据集上评价密集人脸关键点定位(1)2D投影下的68人脸关键点(2)所有关键点的3D坐标。平均误差通过人脸框大小归一化。图8a和图8b是当前最好方法的CED曲线。尽管自监督和有监督方法的性能差异还比较大,但是RetinaFace相比较而言是最好的方法。特别的,可以看出:(1)五点回归可以避免密集回归分支的训练困难并且可以显著提升密集回归的效果。(2)使用单级特征来预测密集人脸比使用RoI特征(如网格编码)要困难的多。如图8c所示,RetinaFace可以很容易的处理人脸姿态变化但是在复杂场景下就比较困难。这表示没有对齐以及过于压缩的特征表示(1x1x256)会妨碍单级框架获取高精度的密集回归输出。尽管如此,回归分支中投影出来的回归区域依然有助于人类检测结果的提升。

图8(c) Result Analysis (Upper: Mesh Decoder; Lower: RetinaFace)

4.7人脸识别准确率

本文展示了我们的人脸检测方法是如何提升Arcface人脸识别方法准确率的。本文分别比较了使用MTCNN和Retinaface来检测和对齐所有的训练数据(MS1M)以及测试数据(LFW,CFP-FP,AGEDB-30,IJBC),保留原Arcface中使用的Resnet100基础网络以及损失函数。比较解过如表4所示,基于CFP-FP,证明Retinaface可以提升Arcface的验证正确率从98.37%到99.49%。这个结果展示了正脸-侧脸的人脸认证已经达到了正脸-正脸的人脸认证水平。(99.86%在LFW上)

表4

如图9所示展示了在FAR=1e-6时IJB-C数据中的ROC曲线。我们使用了两个tricks(镜像测试以及人脸检测评分去加权模板中的样本)来提升人脸认证准确率。使用retinaface代替mtcnn,TAR从88.29%提升到了89.59%。这表示(1)人脸检测和对齐对人脸识别影响很大(2)Retinaface相比MTCNN更加强壮。

图9

4.8 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预训练初始化后再训练时固定下来以获得更高的准确率。

表格5展示了不同输入尺寸下两个模型的耗时。其中,密集回归分支的时间没有统计进去。使用TVM来加速模型预测,在NVIDIA Tesla P40 GPU,Intel i7-6700k cpu和ARM-RK3399.

表5

5 总结

研究了在任意尺度图像下同时进行密集回归和对齐的问题,提出了第一个单级解决方案(RetinaFace)。我们的方法称为当前最好的检测方法,结合最好的人脸识别方法识别准确率也进一步提升。

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于 Pytorch-RetinaFace 的代码讲解,我可以给您提供以下信息: 1. RetinaFace 模型介绍 RetinaFace 是一个用于人脸检测和人脸识别的深度学习模型,其核心思想是在多个尺度下进行特征提取,并利用类似于 Anchor 的方式进行边框预测。RetinaFace 模型的核心网络结构为 ResNet-50,通过 ResNet-50 提取特征,再分别在不同的特征图上进行预测,从而提高检测的准确率和速度。 2. Pytorch-RetinaFace 代码结构 Pytorch-RetinaFace 的代码结构主要包含以下几个文件: - data/ 目录:包含了数据集相关的代码和数据集文件; - models/ 目录:包含了 RetinaFace 模型的代码和模型文件; - layers/ 目录:包含了 RetinaFace 模型中用到的自定义层代码; - utils/ 目录:包含了一些工具类和函数; - train.py:训练脚本; - test.py:测试脚本; - demo.py:演示脚本。 3. RetinaFace 模型训练 RetinaFace 模型的训练主要包含以下几个步骤: - 数据集准备:将数据集按照指定格式进行划分和预处理; - 模型构建:使用 Pytorch 搭建 RetinaFace 模型,并定义损失函数和优化器; - 模型训练:使用训练集对模型进行训练,并在验证集上进行验证和调参; - 模型保存:将训练好的模型保存到指定的路径。 4. RetinaFace 模型测试 RetinaFace 模型的测试主要包含以下几个步骤: - 加载模型:使用 Pytorch 加载训练好的模型; - 图像预处理:将待检测的图像进行预处理,包括大小调整和归一化等; - 特征提取:使用 ResNet-50 提取图像的特征; - 预测边框:在不同的特征图上进行边框预测,并进行 NMS 处理; - 绘制结果:将预测出的边框和置信度绘制在原图上。 以上就是关于 Pytorch-RetinaFace 代码的讲解,希望能够对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值