查看原文
其他

【源头活水】FaceBoxes阅读笔记

“问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精选论文阅读笔记,开辟“源头活水”专栏,帮助你广泛而深入的阅读科研文献,敬请关注。

作者:知乎—化星为辰

地址:https://zhuanlan.zhihu.com/p/358094282

FaceBoxes: A CPU Real-time Face Detector with High Accuracy

本文更加偏向于一个技术报告,先说存在的问题,再写这个问题的解决方案,方法有一定的创新性,但是方法的motivation解释的感觉并不有力,让我感觉到可能是在实验中使用很多尝试得到了一个还不错的结果,再去对这个尝试做出解释,虽然这样也并不问题,但还是感觉如果可以对方法的由来或者说使用这个方法的动机做更自然的阐述,在论文而言会有更好的效果。同时,本文叙述的十分详细,技术细节十分完整,并且有代码的开源,从这个角度来说,是一篇很扎实的工作。


01

Abstract
本文解决的主要问题是做一个在CPU上又快又好的人脸检测器。在本文之前的一些工作,用传统方法的快,但是在精读上不如人意;用深度学习方法的精读高,但是在速度上又并不突出。本文想解决这个问题,并主要做了三点贡献:
Rapidly Digested Convolutional Layers (RDCL) 这个用来加速的
Multiple Scale Convolutional Layers (MSCL) 这个用来提点的
anchor densification strategy 这个也用来提点的
基于这三个贡献(模块),FaceBoxes可以在CPU(E5-2660v3@2.60)上达到20FPS的inference速度。同时,精度也不差。

02

Introduction
引言这边我会去除套话说重点,作者首先提出了两个问题:
  • The large visual variation of faces in the cluttered backgrounds requires face detectors to accurately address a complicated face and non-face classification problem;
人脸检测任务中,背景变化较大。
  • The large search space of possible face positions and face sizes further imposes a time efficiency requirement.
大的搜索空间(脸可能存在的区域和脸的尺寸不同)提出时间-效率的需求。
这两点是冲突的。(翻译一下:第一点就是说人脸检测需要高精度来应对很多复杂的场景,第二点就是说多尺寸和不定位置的人脸让检测变得很慢)一般来说速度和精度是不能都好的,作者提出了“痛点”想解决这个问题。
后面作者提了传统方法速度快,但是精度菜;以前深度学习的方法精度好,但是速度不行。Cascaded CNN在一定程度上解决了这个问题,但是也有以下问题存在:
1. 速度跟图片中脸的数量有关,波动大。
2. 需要分开优化。
3. 对于VGA-resolution的images,不够快。
那作者想提出的方法自然是稳定速度的,同时end-to-end的方法


03

Related work
因为重点不是综述,而且本文的related work写的有点流水账,所以不做解释。
手工设计的方法
基于CNN的方法

04

FaceBoxes(Method)
这里是重点,本文主要提出了三个方法/策略/模块。我们一个个来看:

Rapidly Digested Convolutional Layers (RDCL)

Shrinking the spatial size of input
减少输入的空间尺寸,该点主要提出的手段是通过较大的步长来达到,快速的把input的size压到原来的1/32。如图所示,前面卷积池化卷积池化迅速的把input的size减小了。
Choosing suitable kernel size
通常来说,卷积核越小速度越快,感受野越小,卷积核越大速度越慢,感受野越大。在这个模块中,卷积核先大(7)后小(5),保证感受野的同时,加快了速度。(感觉这个地方有点经验,并没有说为什么这么设计,也没有给出对比实验)
Reducing the number of output channels
在这个模块中,作者使用了C.ReLU,这个东西是在ICML16里面提出来的一个模块,简单的说就是作者得出relu之后的东西有负相关,所以可以凭借这个减少通道数量,但是要注意的是,这里的减少通道数量,并不是减少输出的通道数量,而是减少了之前的通道数量,因为C.ReLU在输出的时候通道数量是会翻倍的,可以参考以下代码:
python class CRelu(nn.Module):def init(self, in_channels, out_channels, kwargs): super(CRelu, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, bias=False, kwargs) self.bn = nn.BatchNorm2d(out_channels, eps=1e-5)def forward(self, x): x = self.conv(x) x = self.bn(x) x = torch.cat([x, -x], 1) x = F.relu(x, inplace=True) return x
总体来说,这个模块在尽量保证感受野的情况下快速的把input的size减小了,并且使用了C.ReLU这样的策略,使之前的通道数也有所下降,这个模块是这个方法保证速度的根本。

Multiple Scale Convolutional Layers (MSCL)

作者首先喷了RPN的两个点
Firstly, the anchors in the RPN are only associated with the last convolutional layer whose feature and resolution are too weak to handle faces of various sizes.
RPN的anchor来自最后一个卷积层,特征和分辨率有点弱,不够处理有不同尺寸的脸部。
Secondly, an anchor-associated layer is responsible for detecting faces within a corresponding range of scales, but it only has a single receptive field that can not match different scales of faces.
只有一个接收域,无法匹配不同比例的面部。(其实这个地方说的是多尺度的问题,之前上面那个图的感受野是七个,我一开始没有看的很明白,然后看了一下Inception modules的图就明白了。这个地方是实际是说Inception有四个通道,导致尺度不一样,三个这个模块下来就有七个不同的感受野。)
针对这个问题,作者提出MSCL来解决这个问题。
  • Multi-scale design along the dimension of network depth.
    深度上做多尺度,就是拿不同层的feature map出来,图里拿了三个层出来。
  • Multi-scale design along the dimension of network width.
    宽度上做多尺度,就是Inception这个模块,模块如图所示。

anchor densification strategy

因为人脸大多是一个方形,所以作者使用了1:1的anchor,作者提出了一个概念,叫做稠密度的概念,简单来说一个anchor尺度的稠密度就是一个feature map上的一个点有上有多少个该scale的anchor,那不同scale和步长都会不一样,所以作者在这里让不同scale的anchor的稠密度相等,某种意义上来说小的anchor会变多,这对于检测小的脸会更友好。变多的方式如图所示:


05

Experiment
实验部分我重点说一下策略,结果部分我忽略了,结果都还挺好。

数据增强策略:

  • 色彩失真

  • 随机裁剪

  • resize到1024*1024

  • 50%的水平翻转

  • Face-box 筛子,保留脸部中心在图片上的图片,去除face box 小于20px的框。(实际代码实现中,有一点不同是,随机裁剪之后会先被补成正方形,在resize到1024*1024,否则人脸就会被扭曲了)

损失函数:

  • 跟RPN一样, 2-class softmax loss for 分类 and the smooth L1 loss for 回归

Hard negative mining

  • 置信度排一排,从大到小,选一份positive三分negative做优化,目的是更快的优化和更稳定的训练。

others 很细节的问题 我直接复制了

  • All the parameters are randomly initialized with the “xavier” method. We fine- tune the resulting model using SGD with 0.9 momentum, 0.0005 weight decay and batch size 32. The maximum number of iterations is 120k and we use 10−3 learning rate for the first 80k iterations, then continue training for 20k iterations with 10−4 and 10−5, respectively. Our method is implemented in the Caffe library.


06

Conclusion

作者的结论几乎是又快又好,我的结论如下:

诚然,从速度和精度上,对比18年以前的工作,本文都做的很不错了。

存在的问题:

1、从结果上看,对侧脸,半边脸,被遮挡脸的识别表现的并不好。

2、从技术上看,数据增强部分我觉得可以优化一下,这个数据增强的策略对于异常处理并不友好(例如侧脸和半边脸)

3、从背景上看,人脸检测任务之后可能需要对更坏的场景做一些探索,比如光照或者是较暗的场景。(与文章无关)

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“源头活水”历史文章


更多源头活水专栏文章,

请点击文章底部“阅读原文”查看



分享、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存