概述
本文介绍1篇人脸检测方面的工作,这是2017年的工作。S3FD是SSD类的检测器,为人脸检测做了相应优化和修改。即使放在今年(2019),这个工作的结果也都是SOTA级的存在。
前段时间写了文章总结FaceBoxes,那篇文章和本文的主角S3FD是同一个实验室出品的,都来自中国,并且在榜单中都取得了当时最好的成绩。
动机
论文一般都要先写出当前存在的问题,然后才好展开具体的方法。本文的动机就是解决人脸检测中存在的几点不足,可以用一张图片来表示:
-
问题一:铺设锚框的特征图相对原图的步长太大(8/或16),这样小脸基本就剩不下多少特征了。可以想象,8x8以下的人脸基本就没有对应的特征了。具体见上图(a)
-
问题二:对小脸来说,anchor尺寸和有效感知野不匹配,anchor都是偏大的。理论感知野一般会很大,但是能影响输出结果的有效感知野会小得多。具体见上图(b),白色部分才是有效感知野。
-
问题三:anchor的匹配策略问题。anchor的边长是离散的(比如本文的anchor尺寸是16, 32, 64, 128, 256, 512 ),而图片中的人脸尺寸是连续的,使用IOU进行匹配的时候,就会发现人脸尺寸远离anchor尺寸的时候,平均能匹配到的anchor个数特别少。比如上图(c)中,和anchor尺寸一致的人脸能得到很多匹配的anchor框,而和anchor尺寸相差较多的人脸,平均能匹配到的anchor框数远小于平均值,对于图上的tiny face和outer face来说,它们能匹配的anchor数不足2甚至1,这些人脸的召回率就会很低。
-
问题四:为了检测小脸,需要在较底层的特征图上密集的铺设anchor框,总的来看大部分anchor框都来自第一层底层特征,但是这些anchor框大部分都是负样本,只有少数是正样本,整体来看正负样本很不均衡,见上图(d)。(虽然本网路强制正负样本比例1比3,也只能一定程度缓解)。
总的来说,本文针对小脸的检测做出了很多改进,并且兼顾了人脸检测的其它方面。
网络结构
本网络的主干网络来自VGG,输入640x640保留pool5和以前的部分,后续部分堆积下采样和卷积。最终共六个特征图参与最终的预测,预测的时候采用3x3卷积核生成坐标回归和结果分类。
网络结构上来看,基本是一个SSD的样子。参与预测的六个特征图步长从4到128(这就是一个特征金字塔),对应的anchor尺寸从16到512。
最终共六个特征图参与最终的预测。每个参与预测的特征后跟一个p×3×3×q的卷积,其中p是输入特征的额通道数,q是输出特征的通道数, 卷积核大小是3x3。
对每个anchor来说,我们要预测4个坐标偏移量和Ns个分类分数,最底层的特征层conv3_3来说Ns=Nm+1(其中Nm是max-out背景标签数,代码中取Nm=3), 对其它5层特征图来说Ns=2。
损失函数采用联合损失函数,分类部分采用softmax loss,坐标回归部分采用smooth L1 loss。
解决问题的思路
问题一的解决办法:多个特征图用于预测
为了解决小脸的特征信息过少的问题,本文在步长为4的特征图开始预测(而不是8或16),共用到了6个特征图进行预测,详细信息参见上面的网络结构。这样小脸在第一个预测特征图处还能剩下很多信息,改善了小脸的召回率。
问题二的解决办法:精心设计anchor框大小
前面说了有效感知野会比理论感知野小得多,所以要小心设置各个特征图的anchor尺寸大小,使之和有效感知野匹配起来。具体每一层的大小见上面的Table_1。
同时,anchor的设置还遵循了等稠密度间隔原则。稠密度具体的计算可参考我前面写的FaceBoxes的论文笔记博客。
问题三的解决办法
问题三的原因是anchor的边长是离散的,而图片中的人脸尺寸是连续的。人脸尺寸远离anchor尺寸的时候,平均能匹配到的anchor个数特别少,一定程度上被网络忽略了。
作者有两个基本的观察:
- 平均匹配到3个anchor框还不足以为人脸召回得到较高的分数
- 匹配到的anchor框数和anchor的尺寸高度相关
因此,为了解决这个问题,论文把anchor的匹配策略分为两个阶段:
stage 1:将IOU匹配的阈值从0.5设置为0.35,增加平均匹配到的anchor数量
stage 2:经过上一个阶段,tiny face和outer face可能仍然没有匹配到足够的anchor数量,所以直接把阈值降为0.1,取前N个匹配结果,N是第一阶段平均的匹配数量。
该策略对各个尺度的人脸平均匹配的anchor个数的改善见下图(a)。
我的一个疑问:这里主要是指训练阶段的匹配策略吧,主要为了让各个anchor学习和它们的尺寸相差较大或者相距较远的人脸。推理的时候不知道怎么用的匹配策略。
问题四的解决办法
问题四的根本原因是正负样本不均衡。这也是没办法的事,想检测小脸就要在较底层的特征图上密集铺设anchor框,这样一来小的anchor框就会占比较大,比如对于S3FD来说,第一个检测层的anchor框数量占了75%, 而这些anchor框里天生就是大部分为负样本,这样在所有anchor中负样本必定占有较大比例,导致检测结果中有较高的假阳性率。
为了解决这个问题,本文在最底层的conv3_3特征图预测上采用了更加复杂的分类策略:max-out 背景标签。
其它几个特征图用于分类的时候都是2分类,这里认为的把背景设为Nm种,得到Nm个背景的预测分数和一个人脸的预测分数,Nm个背景分类中取最大值和人脸做softmax,无形中分为人脸的概率就大大增加了(我感觉这里类似一个权重降权的操作)。具体见Fig 4(b)。
总结
问题一的解决方案应该来自SSD,问题二的解决方案主要是一篇计算有效感知野的论文和作者之前的FaceBoxes这篇论文, 后面两个解决方案没看出来是哪来的。
总之,作者的几个idea都很简洁,但是整体效果非常好。为作者点100个赞。
最终结果
谦虚点说当时就是傲视群雄。当然,两年后的今天已经有不少框架超过这个了。
在WIDER FACE的hard验证集上,S3FD优势巨大。
论文
S3FD: Single Shot Scale-invariant Face Detector
代码
S3FD官方代码(caffe):sfzhang15/SFD
sciencefans/RSA-for-object-detection
参考资料
这就是神经网络 16:深度学习-人脸检测-FaceBoxes
[WIDER FACE官网:WIDER FACE: A Face Detection Benchmark