论文地址:https://arxiv.org/pdf/1905.00641.pdf
源码地址(MXNet实现):https://github.com/deepinsight/insightface/tree/master/RetinaFace
基于caffe-c++的实现:https://github.com/wzj5133329/retinaface_caffe
1.介绍
RetinaFace是Insightface团队提出的one-stage人脸检测算法(开源代码与数据集,业界良心),在widerface 上有非常好的表现。
2.论文主要贡献
1)在one-stage检测网络设计的基础上,增加两条平行分支,一支预测五个关键点,一支预测每个人脸像素的三维位置和对应关系,这样网络总共就是四条平行分支,见图1.(由于我没用到人脸各个像素点的三维位置,所以下面只分析前三分支)
2)在widerface上,RetinaFace性能优于现有技术平均水平预测(AP)1:1% (AP = 91:4%(hard))
3)在IJB-C数据集上,RetinaFace有助于改进ArcFace验证精度,这表明更好的人脸定位可以显著提高人脸识别。
4)通过采用轻量级骨干网络,RetinaFace可以在单CPU核上实时运行,以实现vga分辨率的图像
5)代码开源并且将自己在widerface上标注的关键点数据开源(良心)
3.网络与常规one-stage检测网络比较(例yolo)
主要相同点:
都是在不同下采样层进行预测,且都采用固定的anchors,预测都是相对anchors偏移量
主要不同点:
RetinaFace多了关键点检测
RetinaFace网络大致架构
图1. RetinaFace
从该图可以看出RetinaFace是四条平行的分支,第一条预测是否是人脸,第二条预测人脸框的偏移量,第三条预测人脸关键点的偏移量,第四条因为我没需求,所以没看,这里不讨论
另外不知道是不是学的yolov3(猜的),也是采用了多阶段预测,就是在网络不同的下采样层做预测,类似这种
图2 RetinaFace最后的输出
从左到右下采样32、16、8倍,在论文里面,最开始应该是有5种下采样,
图3.论文中的anchor数目
这样五种下采样(4,8,16,32,64)feature_map为(160,160)(80,80),(40,40),(20,20),(10,10),每个feature_map中的点预测有三种anchors,那么总的anchors就是(160*160.*...10*10)*3=102300,但是在代码中只有stride为(32,16,8)的输出,且每个点只有两个anchors,所以640*640输入的图片 三个输出是【(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)】如图2
4.使用的loss
采用多任务Loss
再看看yolo损失函数,此损失函数实际是yolov1 ,v2的,
v3的损失函数作者并没有给出,根据代码解析出为:
5.个人看法
个人感觉retinaface最大的贡献就是其加入了关键点的分支,这样可以确保检测到的人脸质量,而且在损失函数也只是将其作为一个比较小的约束项,不怎么会影响分类以及人脸框的判断,但是一旦关键点太过偏离就会使loss相对变大(产生约束)
第一次写博客,可能会有很多问题,各位大佬轻喷^-^