论文地址:RetinaFace:Single-stage Dense Face Localisation in the Wildhttps://arxiv.org/pdf/1905.00641.pdf代码地址:

Pytorch_RetinaFacehttps://github.com/biubug6/Pytorch_Retinaface

目录

1、Abstact

2、Background&Related Works

3、RetinaFace

3.1、Multi-task Loss

3.2、Dense Regression Branch

4、Experiments

4.1、dataset

4.2、Implementation details

4.3、Ablation Study

4.4、Face box Accuracy

4.5、Five Facial Landmark Accuracy

4.6、Dense Facial Landmark Accuracy

4.7、Face Recognition Accuracy

4.8、Inference Efficiency

5、Conclusions


1、Abstact

本文提出了一种单级人脸检测器,利用联合额外监督和自监督多任务学习,对不同尺度的人脸进行像素级人脸定位。

主要以下几点贡献:

(1)在WIDER FACE数据集上手动标注了五个人脸标记,在这个额外监督信号的帮助下人脸检测得到显著提升;

(2)添加了一个自监督网格解码器分支,用于预测与现有监督分支并行的像素级3D形状人脸信息;

(3)在WIDER FACE的hard测试集上,RetinaFace的AP比最先进的AP提升了1.1%;

(4)在IJB-C测试集上,RetinaFace支持最先进的方法(ArcFace)以改进其面部验证结果(对于FAR=1e-6,TAR=89.59%);

(5)采用轻量级骨干网络(mobilenet),RetinaFace可以在单个CPU内核上实时运行VGA分辨率的图像;

2、Background&Related Works

人脸检测的改进受到目标检测的启发取得了显著的提升,人脸检测具有更小的比率变化(1:1到1:1.5),并且更大的尺度变化(从几个像素到数千像素);

单阶段设计方法在特征金字塔上广泛采集面部位置和比例,和两阶段设计方法相比性能和速度都显著提升。

本文是一种单阶段人脸检测框架,并通过强监督和自监督信号的多任务损失,提出了一种先进的稠密人脸定位方法。具体框架如图1所示:

图1.总流程

如图1所示,总共有三个分支:Existing branch(1)、Extra-supervision(2)和self-supervision(3),这三者都是并行的,对于每个阳性的锚框,在(1)中会输出面部的得分和面部的边界框,在(2)中会得到五个面部标记信息(眼睛、鼻子和嘴角,这些需要10个数值表示,对应图中的10),在(3)中得到每个人脸像素的三维位置和对应关系。

人脸检测有点类似于目标检测,训练过程包括分类(二分类)和回归损失(主要是优化对应的anchor坐标[x,y,w,h])。

特征金字塔:生成不同尺寸的图片,每张图片生成不同的特征,分别进行预测,最后统计所有尺寸的预测结果。

详细介绍可以到这里查看:

什么是FPN?https://zhuanlan.zhihu.com/p/397293649

单阶段和两阶段:

和目标检测中一样,两阶段方法采用“proposal和refinement”,具有较高的定位精度,但是比较费时;单阶段方法对人脸的位置和尺度进行密集采样,在训练过程中会出现正负样本不均衡的情况,一般会采用抽样和重新加权的方法处理这种不平衡。单阶段的效率更高,召回率更高;

Context Modelling:上下文建模

主要是为了增强模型捕捉微小人脸的上下文推理能力。在两阶段检测器中,通常通过扩大候选方案周围的窗口来合并上下文。SSH通过简单的卷积层来模拟这种策略,SSH具体流程如下图所示:

对于SSH中的Detection Module:可以看作是3×3、5×5、7×7的卷积过程,然后再concat在一起Detection Module的输出通道数(即Figure 4中的“X”)对于M1设置为128,对于模块M2和M3设置为256。

Multi-task Learning:

结合人脸检测和人脸对齐被广泛使用,因为对齐的人脸形状可以为人脸检测提供更好的特征。

3、RetinaFace

3.1、Multi-task Loss

对于每个输入的训练锚框i,其中分类损失表示阳性标签(人脸),表示阴性标签;分别用1和0表示;

边界框回归损失,其中表示阳性标签和真实边界框的坐标,表示中心点的坐标(x,y)和对应的宽和高;然后采用smooth-L1进行损失函数优化;

表示面部标志回归损失,其中表示预测的五个面部标志信息和于阳性锚框的groudtruth;

表示密集回归损失,而表示权重因子,分别设置为0.25、0.1和0.01。主要增加模型的训练侧重点。

3.2、Dense Regression Branch

mesh Decoder:(网状卷积和网状上采样),一种基于快速局部化频谱滤波的图卷积方法。

都是核加权邻域和

4、Experiments

4.1、dataset

采用WIDER FACE数据集,包括32203张图像和393703个人脸边界框组成,在尺度、姿势、表情、遮挡和光照方面具有很高的可变性:通过从61个场景类别中随机抽样,将数据集分为40%的train、10%的val和50%的test。并且基于EdgeBox的检测率定义了三个难度级别(简单、中等和困难)。

这个数据集在官方的github代码中有提供下载链接;推荐使用下面这个:

RetinaFace_Pytorchhttps://github.com/biubug6/Pytorch_Retinaface额外的标注信息:定义了人脸图像的质量五个级别:(眼睛中心,鼻尖和嘴角)

4.2、Implementation details

特征金字塔:

(1)RetinaFace采用P2到P6的特征金字塔级别,其中P2到P5通过使用自上而下和横向连接从相应的ResNet残差阶段(C2到C5)的输出结果。其中P6通过3×3卷积计算,C5中的步长为2。C1到C5是ImageNet-11k数据集上预先训练的ResNet-152分类网络,而P6使用“Xavier”方法随机初始化。

(2)从backbone各层抽取特征图,用于生成特征图金字塔,代码中分别选择layer2,3,4的特征图,对应原图分别下降了8倍、16倍、32倍,分别对应上图的P3到P5,并没有实现P2的4倍。

(3)特征图金字塔的生成,下图的圆圈加号包含:卷积、上采样、逐元素求和、卷积融合。

Context Module:

受到SSH和PyramidBox的启发,在五个特征金字塔级别上应用独立的上下文模块,以增加感受野区域和增强刚性上下文建模能力。同时采用可变形卷积网络(DCN)替换横向连接和上下文模块内的所有3×3卷积层,进一步增强了非刚性上下文建模能力。

Loss head:

对于阴性锚框,只采用分类损失。对于阳性锚框,采用多任务损失。

对于不同的特征图采用一个共享的损失头(1×1的卷积)。

而对于mesh decoder而言,采用预先训练的模型,主要是节省训练开销。

Anchor Settings:

在从P2到P6的特征金字塔级别上使用特定比例的锚框。在P2中通过平铺小锚框来捕获微小的人脸,但是需要更多的计算时间;

比例设置为:,纵横比设置为:1:1。当输入图像大小为640×640时,锚框可以覆盖特征金字塔级别上16×16到406×406比例。总共有102300个锚框,其中75%来自P。详细信息如下表所示:

在训练过程中,当IOU大于0.5时,锚框和真实边框匹配,当IOU小于0.3时,锚框和背景匹配。由于大多数(99%)的锚框在匹配步骤中为负,因此采用OHEM来缓解正和负训练样本之间的显著不平衡。主要就是根据损失值对负锚框进行排序,然后选择top ones的锚框,以便负样本和正样本之间的比例为(3:1,在Faster RCNN中也是如此)

Data augmentation:

在WIDER FACE的数据集中大概有20%的小的人脸,文中的处理方式是从原始图像中随机裁剪方形的块,并将这些块调整为640×640,以生成较大的训练人脸。其中裁剪的随机大小在原始图像短边的[0.3,1]之间。

如果人脸框的中心位于裁剪区域内,则保持人脸框的重复部分。

然后通过概率为0.5的随机水平翻转和光测量颜色失真(photo-metric color distortion)来增加训练数据;

Training Details:

使用SGD Optimizer(动量为0.9,权重衰减为0.0005,batchsize为8×4)在四个NVIDIA Tesla P40(24GB)GPU上训练RetinaFace。学习率从10−3开始,5个epochs后上升到10−2,然后在55和68个epochs时除以10。整个训练在第80个epoch结束。

Testing Details:

采用翻转和多尺度(图像的短边位于[500,800,1100,1400,1700])。Box voting使用0.4的IoU阈值应用于预测人脸边框的集合。

4.3、Ablation Study

4.4、Face box Accuracy

和24种最先进的人脸检测算法进行比较;

下图为RetinaFace的测试结果,1151张人脸中检测出900张(IOU=0.5);

除了精确的边界框外,RetinaFace预测的五个人脸标志点在姿态、遮挡和分辨率的变化下也具有很强的鲁棒性。尽管在重度遮挡下存在一些密集人脸定位失败的情况,但在一些清晰和大型人脸上的密集回归结果是良好的,甚至显示出表情变化。

 4.5、Five Facial Landmark Accuracy

4.6、Dense Facial Landmark Accuracy

4.7、Face Recognition Accuracy

上表表示人脸检测和对齐对深度人脸识别的影响。

上图表明人脸识别和对齐显著提升人脸识别的表现,并且RetinaFace表现更好。

4.8、Inference Efficiency

采用轻量级别模型MobileNet来加速推理;

对于轻量级模型,通过在输入图像上使用7×7卷积(步幅=4),在P3、P4和P5上平铺密集锚定,快速减小数据大小,并移除可变形层(deformable layers);

此外前两个卷积层的参数是采用ImageNet上预先训练好的权重参数并且实现了更高的准确率;

5、Conclusions

本文研究了图像中任意尺度人脸的同时密集定位和人脸对齐这一具有挑战性的问题,并且提出了一个单阶段解决方法;并且本文的方法性能优于最先进的方法。当RetinaFace与最先进的人脸识别实践相结合时,可以明显提升准确率。

RetinaFace:单阶段人脸检测方法相关推荐

  1. 日本东北大学改进单阶段人脸检测—兼具速度与精度优势

    点击我爱计算机视觉标星,更快获取CVML新技术 近日来自日本东北大学与Laboro.AI公司的研究人员公开一篇改进的单阶段人脸检测算法论文,其不仅保持了速度的优势而且在主流的人脸数据集上达到与双阶段人 ...

  2. 单阶段目标检测方法SSD介绍与分析

    SSD目标检测算法,完整详细讲解 SSD(single shot multi-box detector) 1. 简介 2. 模型结构 backbone neck head SSD(single sho ...

  3. OpenCV-Python实战(14)——人脸检测详解(仅需6行代码学会4种人脸检测方法)

    OpenCV-Python实战(14)--人脸检测详解(仅需6行代码学会4种人脸检测方法) 0. 前言 1. 人脸处理简介 2. 安装人脸处理相关库 2.1 安装 dlib 2.2 安装 face_r ...

  4. matlab中facedetector,Matlab人脸检测方法(Face Parts Detection)详解

    今天同学让我帮忙制作一个人脸表情识别的样本库,其中主要是对人脸进行裁剪,这里用到了一个相对较新的Matlab人脸检测方法Face Parts Detection,网上百度了一下发现关于Matlab人脸 ...

  5. 单阶段目标检测重要论文总结

    文章目录 一.Yolov1 1.论文简介 2.检测原理 3.结构设计 4.疑难问题 5.论文总结 二.Yolov2 1.论文简介 2.更好.更快.更强 1)为什么更好? 2)为什么更快? 3)为什么更 ...

  6. 单阶段目标检测算法之YOLOv1详解

    官方网站C语言版本:https://pjreddie.com/darknet/yolov1/ tensorflow版本的代码下载: https://github.com/hizhangp/yolo_t ...

  7. 人脸检测方法研究记录

    --------------------- 本文来自 HamTam12 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/sinat_14916279/article/d ...

  8. 计算机视觉:单阶段目标检测模型YOLO-V3

    计算机视觉:单阶段目标检测模型YOLO-V3 单阶段目标检测模型YOLO-V3 YOLO-V3 模型设计思想 产生候选区域 生成锚框 生成预测框 对候选区域进行标注 标注锚框是否包含物体 标注预测框的 ...

  9. 关于人脸检测方法的比较

    通过阅读文献总结了一下不同人脸检测方法的优缺点. 首先人脸检测方法大致分为三类吧, 1)基于特征的人脸检测 整体轮廓法 肤色检测法 器官分布法 2)模板匹配法的人脸检测 镶嵌图法(又称马赛克法) 预定 ...

最新文章

  1. 微信小程序用户未授权bug解决方法,微信小程序获取用户信息失败解决方法
  2. 解决访问http://localhost:8080/需要用户和密码的问题
  3. boost::signals2::slot相关的测试程序
  4. Nginx的http块自定义服务日志
  5. Tomcat中实现websocket和browser端访问
  6. SQLServer LIKE 通配符
  7. n个整数,其中有两个数是重复的,要求找出这两个重复的整数
  8. python的json dump_python中json.dump和json.dumps的区别
  9. 22个ES6面试、复习干货知识点汇总
  10. X86汇编语言从实模式到保护模式01:处理器、内存和指令
  11. 入门mysql执行计划
  12. 文件服务器代码大全,文件服务器 代码
  13. 网页的406报错问题
  14. 价值 1500 美元的 iPhone 值得买吗
  15. 红米note3android耗电,红米Note3全网 flyme6 完美精简 省电优化 DPI设置 流畅实用-刷机之家...
  16. 全面认识思科系列交换机型号
  17. 栈和队列的定义、特点和用途
  18. 搭建树莓派 4B + intel movidius 神经元计算棒2代深度学习环境
  19. C语言练习题之标准电话号码(MOOC)
  20. 硬盘错误计数 计算机内存不足,硬盘问题!Ultra DMA CRC错误计数 电脑死机

热门文章

  1. 浏览器启动页被劫持篡改问题解决
  2. 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》.(吴亚峰).[PDF]ckook
  3. strip().split()怎么用
  4. Mysql创建一张表并且添加一万条数据
  5. python简单工厂模式_python版简单工厂模式
  6. coreldraw课表设计作品_张张经典,精选50款俄罗斯设计师LOGO设计作品
  7. Key to Oral English Breakthrough: Imitate and Repeat
  8. 干货 | 20道常见面试电路题,看你能答对几道?
  9. 海外市场如何做品牌推广?
  10. I2C虚拟项目笔记(一)-virtual sequence