[\*v*/]人脸识别任务算法RetinaFace
RetinaFace: Single-stage Dense Face Localisation in the Wild
论文:https://arxiv.org/pdf/1905.00641.pdf
pytorch实现:https://github.com/biubug6/Pytorch_Retinaface
C++实现:https://github.com/Charrin/RetinaFace-Cpp
RetinaFace是Insight Face在2019年提出的最新one-stage人脸检测模型,原模型使用了deformable 、convolution和dense regression loss, 在 WiderFace 数据集上达到SOTA。截止2019年8月,原始模型尚未全部开源,目前开源的简化版是基于传统物体检测网络RetinaNet的改进版,添加了SSH网络的检测模块,提升检测精度,作者提供了三种基础网络,基于ResNet的ResNet50和ResNet152版本能提供更好的精度,以及基于mobilenet(0.25)的轻量版本mnet,检测速度更快。
RetinaFace结构
简化版mnet结构
RetinaFace的mnet本质是基于RetinaNet的结构,采用了特征金字塔的技术,实现了多尺度信息的融合,对检测小物体有重要的作用,笔者在这里突然有联想到SSD不就是利用金字塔结构的技术来弥补YOLO对小物体检测效果不好的缺点吗,果然要想兼顾大目标和小目标看来最好是使用金字塔结构来进行多尺度特征融合。RetinaNet的结构如下:
简化版的mnet与RetinaNet采用了相同的proposal策略,即保留了在feature pyramid net的3层特征图每一层检测框分别proposal,生成3个不同尺度上的检测框,每个尺度上又引入了不同尺寸的anchor大小,保证可以检测到不同大小的物体。
简化版mnet与RetinaNet的区别除了在于主干网络的选择上替换了ResNet使用了Mobilenet做到了模型的轻量化,最大的区别在于检测模块的设计。mnet使用了SSH检测网络的检测模块,SSH检测模块由SSH上下文模块组成
上下文模块的作用是扩张预检测区域的上下文信息。上下文模块和conv结合组成了一个检测模块,该检测模块如图:
上图为SSH网络的检测模块,将一个上下文模块与conv叠加后生成分类头和回归头得到网络的输出。
mnet网络在使用SSH检测模块的同时实现了多任务学习,即在分类和回归的基础上加入了目标点(landmark点)的回归。官方的网络结构采用了5个目标点的学习,后续也可以修改为更多目标点,比如AFLW中的21个目标点以及常用的68或者106个目标点。
上图是原版RetinaFace论文中的检测分支图,注意在开源简化版的不包含self-supervision部分,但是有5个关键点的extra-supervision部分。
检测
RetinaFace的检测过程和所有的one-stage的检测器过程相似,在github原版的实现上主要在retinaface.py中的detect()中实现,实验中主要可调整的超参数包括threshold, nms_threshold,scale等。
- threshold : 分类概率的阈值,超过这个阈值的检测被判定为正例
- nms_threshold : 非极大值抑制(NMS)中的IOU阈值,即在NMS中与正例的IOU超过这个阈值的检测将被舍弃
- scale : 图像金字塔的缩放值,通过对原图进行由scale值指定的大小缩放得到网络图片的输入大小,注意在检测时网络的输入不必保持相同的大小
多任务学习
最终效果
Reference
[1] https://blog.csdn.net/wzjwj/article/details/94456036
[2] https://www.jianshu.com/p/d4534ac94a65
[3] https://blog.csdn.net/warrentdrew/article/details/98742948
[4] https://baijiahao.baidu.com/s?id=1645023042411162473&wfr=spider&for=pc
[5] https://arxiv.org/pdf/1905.00641.pdf