0%

S3FD

这篇文章是ECCV2017一篇比较经典的人脸检测的文章,是一篇很实用的针对小脸优化的文章。读下来,文章并没有提出特别牛逼的理论或者网络,而是在SSD的基础上,进行了针对小脸的一系列优化,最终实现了对小脸检测效果的提升,相比于提出高大上理论的论文,本篇论文中提出的方法更容易实用到实际项目中,产生收益,特别是针对小目标,文章中的方法值得借鉴,我喜欢这种文章。


论文名称:S3FD: Single Shot Scale-invariant Face Detector

作者:张士峰等

论文链接:https://arxiv.org/abs/1708.05237

代码链接:https://github.com/sfzhang15/SFD


创新点

文章的重心就是针对小脸效果的提升,首先文章分析了为什么像SSD、Faster R-CNN等网络对小脸的效果不是那么好,作者总结如下几点:

  1. 像SSD或者Faster R-CNN,检测的最浅的特征层的stride太大了,导致小脸到这层的特征特别小,甚至已经没有了,这就很难检测了。

  2. anchor尺寸比较大,而脸很小,导致跟小脸不匹配,回归效果不好。

  3. anchor的匹配策略导致部分脸匹配的anchor数量不足,由于提取的anchor的尺寸是离散的(16,32,128…),但是脸的大小是连续的,这就导致会存在部分脸由于与anchor的尺寸相差较大,导致没有足够的anchor和它进行匹配,进而导致检测效果不好。

基于此作者提出了几点改进:

  • 既然stride比较大,那么重新设计网络,调整检测层的stride.
  • 既然anchor的匹配策略不好,那么调整anchor的匹配策略。
  • 由于小脸在浅层检测,负样本较多会引入误检,所以这里作者设计了max-out background.

网络的速度在titan x上测试可以达到36fps

正文

正文部分详细介绍一下上面提到的作者的几点改进。

网络结构修改

1.png

S3FD网络结构图

2.png

SSD网络结构图

网络结构基本与SSD没有什么差异。只是最后面比SSD少了两层卷积,SSD最后特征图大小是1x1的,但是同样的,跟SSD相同,S3FD也是在6个feature上面进行预测,只不过选择的特征层不一样了,对比上面两个结构图可以看出差异部分。

anchor的设计

下面介绍一下anchor的设置,由于人脸基本是方形的,所以anchor的默认设置就是1:1的。这里作者另外提出了一个equal-proportion interval principle,等间距采样原则。

  • equal-proportion interval principle,等间距采样原则

意思就是说,anchor的大小和anchor的stride是成比例的,这里作者采用的是4,这就保证了采样的密度是一样的,所以不同的脸可以匹配的anchor的数量也就一致了。为什么一致呢?因为匹配是计算IOU嘛,所以密度都一样,数量也就一样了,这里作者还给了一张示意图。

4.png

等间距采样原则

匹配策略的设计

接下来就到了那个问题,anchor的尺度是离散的,但是人脸的尺度是连续的,这样偏离anchor较远的人脸的匹配数量就会较少,如下图花圈所示,影响召回效果,这怎么办呢?

5.png

作者采用了如下策略解决:

  • 将IOU的阈值降低,IOU阈值大于0.35的anchor都算作正样本。
  • 对于仍然没有足够匹配anchor的人脸怎么办呢?首先选取那些IOU大于0.1的anchor,然后排序,选取top-N的anchor作为匹配,而N的选取可以参考上一条的平均值。

max-out background

由于在较浅层检测小尺寸目标,带来的最直接问题就是,在浅层会产生较多的负样本,下表分析了不同层产生的anchor的数量,可见conv3_3产生的anchor数量占到了全部的75%以上,也就带来了非常多的负样本。

6.png

那么怎么去平衡正负样本呢?

最简单的方法当然是采用类似SSD的方法hard negative,对loss进行排序,选取loss较大的anchor

但是对于小脸来讲这样做是不够的,因为conv3_3的负样本的数量比较大,如果只采用har negative ,显然这层依然会存在较多的负样本,依然较容易会产生较多的误检,所以为了在一定程度减少这层的负样本数量,并且还能提取较好的负样本,这里作者采用了max-out background方法。

分析为什么不干掉过多的负样本会产生较多的误检,究其原因,或许是将较多的负样本都预测成背景这一个类别,太简单粗暴了,所以这里作者采用的方法是对每个anchor预测多个背景类别,然后选取其中最大的那个值作为背景的概率,这就相当于将原本的二分类(脸,背景)变成了多分类(脸,背景1,背景2…背景n),对背景进行了一定的划分,这样其实就起到了一定的类别均衡的作用,这样背景被正确分类的概率也就提高了,也就可以减少一定的误检了,如下图所示。

7.png

这步处理conv3_3,后面使用hard negative就好了。

实验部分

实验部分,作者主要跟SSD-face ,RPN-face做对比,下表中F代表使用本文结构,S代表使用本文的anchor匹配策略,M代表使用max-out background label.其实每个操作都带来了一定的提升。修改了结构之后,对于hard-face提升尤其明显,提升了差不多9个点,可见stride太大对于小脸的影响确实是显著的。

8.png

其他实验不详述了,读者可以自行阅读论文。

总结

总的来看,这是一篇实用性很强的文章,不论是人脸还是其他领域,都很值得借鉴。