SPPNet论文解析
文章目录
本篇博客将要解析的论文是Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition,论文地址为:https://arxiv.org/abs/1406.4729
一、介绍
本文是Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun等人于2014年发表的一篇文章,该论文提出了SPPNet模型,该模型在取得与R-CNN模型相近的准确率的情况下,大幅提高了目标检测算法的速度,论文的核心贡献之一——Spatial Pyramid Pooling作为后续Fast R-CNN中ROI-Pooling的前身,也成为后续众多目标检测算法的标配。
本文一作Kaiming He,就是大名鼎鼎的何恺明,一名年轻有为的Computer Vision学术界大佬,此处贴上恺明大佬的个人网站以及Google Scholar链接。瞻仰!!!
二、拟解决的关键问题
目前的DCNN都需要输入为一个固定尺寸、固定长宽比的图片,例如224 * 224,但这种要求是非常不自然的,数据集中收集的图片大都是从网络中爬取得到的,尺寸、长宽比都不仅相同,甚至变化很大,为了满足DCNN的要求,目前主要的方法是裁减crop或者是变形wrap,如下图所示:
但上述方法都存在一些问题,例如:
- 裁减可能无法完整包含目标
- 变形可能会引入不想要的形变
以上缺陷都可能会影响识别的准确率。
除此之外,现实生活中的各个目标的尺寸往往是变化的,单一尺度的图片可能不利于获取目标的多尺度特性。
三、Spatial Pyramid Pooling
为了解决以上两个问题:
- 输入图片固定尺度、长宽比的要求
- 目标的多尺度特性
本文提出了Spatial Pyramid Pooling,用于解决上述问题。
1. 问题背景
为了解决上述问题,首先需要分析一下问题产生的原因。
目前的DCNN中主要包含两个部分:
- 全卷积网络
DCNN中全卷积网络中的主要作用是特征提取,主要操作是卷积,卷积操作以滑窗形式运行,本身并不需要固定输入尺寸 - 全连接网络
DCNN深层的全连接层通常作为分类器或者是回归器,对提取的特征进行进一步操作,主要操作是矩阵的乘法,而由于网络定义的问题,对提取的特征的维度有一定要求。因此全连接层才是固定输入要求的来源。
既然如此,我们是否可以对DCNN中的全卷积网络提取得到的特征进行一定的操作,使得其输出的维度为固定呢?这样一来,便可以弥补全卷积层和全连接层维度要求之间的Gap。
那么该如何实现呢?
对于全卷积网络FCN来说,输入图片的尺度不同,输出图片的尺度也相应不同,主要原因在于FCN的stride(输入图片的尺度与输出图片的尺度的比值)一般是固定的,而FCN的stride就是来源于卷积核的stride以及pooling层的stride,由于各个卷积核的stride和pooling层的stride固定,因此,FCN的整体stride也固定。换言之,对于一个卷积或者是池化操作来说,如果它的核的大小和步长是随着图片大小而变化的,并且经过一定设计,那么输出的feature map的尺度就可能是固定的,并且设计不同,输出的固定尺度也就会不同。
基于以上思路,Spatial Pyramid Pooling被提出。
2. Spatial Pyramid Pooling Layer
- Feature Map
目前的DCNN中全卷积网络FCN主要用于特征提取,而FCN由于卷积的滑窗以及共享权重特性,实际上FCN提取得到的feature map中,不仅包含了响应的强度信息,还包含了响应的位置信息,参考如下图:
这也是Spatial Pyramid Pooling中的Spatial一词的由来之一,后续会做进一步解释。
- SPP Layer位置
上图是之前DCNN pipeline与SPPNet的pipeline对比示意图。
上面一行是之前DCNN的pipeline。在之前的DCNN中,例如R-CNN,为了弥补FCN和FC层之间的Gap,通常是在图片域上进行操作,也就是对得到的上千个推荐框对应的图片内容进行所谓的crop或者是warp,获取固定尺度和长宽比的输入推荐框后,再将其送入DCNN中,完成分类或者是检测任务。
该流程最大的问题在于,每张图片的推荐框的数目都很多,R-CNN需要对上千个推荐框运行检测网络,速度极慢。
而在SPPNet中,为了弥补FCN和FC层之间的Gap,则采用的是Spatial Pyramid Pooling操作,并且该操作是应用于卷积层得到的feature map上。也就是说:
- 不同尺度、不同长宽比的图片送入全卷积网络FCN中提取特征,得到一张feature map
- 根据区域生成算法得到的推荐区域框,将该框由原来的图像域映射到feature map域上
图4 推荐框映射示意图 如上图所示,左边有张汽车原图以及一个对应的红色推荐框,汽车原图经过FCN进行特征提取,得到右边的feature map。此时,我们需要利用Spatial Pyramid Pooling将推荐框转换为固定长度向量。为此,需要将原图上的红色推荐框映射到feature map的虚线框上。SPPNet在Appendix中有详述,也是考虑到了一个Align的问题,具体实现时为:
- 首先在FCN中的所有的layer对应的padding都需要设置为
- 在原图中的位置将会映射到feature map的位置上,,其中S表示FCN的整体的stride
更详细的解释可以参考这篇博客。
这里的取整操作实际上会引入一定的位置误差,恺明大佬应该也是意识到了这个问题,随后在Mask R-CNN中提出了ROI-Align,也是比较好地解决了这个问题。 - 得到映射后的所有推荐框后,对每个推荐框应用Spatial Pyramid Pooling,提取固定长度的特征向量表示
- 最后将得到的特征向量送入FC层中,完成分类或是检测任务
- Spatial Pyramid Pooling结构
下图是SPP的结构示意图:
SPP通过在局部空间块上进行pooling,从而保留了空间信息。
- 局部空间块的大小与输入图像的尺寸成比例关系==>局部空间块的数目固定
将CNN卷积层中的最后一个pooling层替换为SPP,从而可以产生一个固定大小的特征向量,这个向量的维度为,其中k代表最后卷积层输出的filter的数目,M则是SPP采用的局部空间块的个数。
具体为:在SPP Layer中,输入feature map size为 ,当前金字塔层级有个局部空间块,SPP的具体实现采用滑窗的方式进行实现,窗口的size为,stride为,其中分别代表上取整和下取整。
对每个金字塔层级都进行同样的处理,最终将各个金字塔的输出进行concatenate,送入后续全连接分类网络。
简单理解起来就是:每个金字塔层级都采用一个不定size和stride的pooling层来实现,例如对于上图蓝色的金字塔层级来说,其pooling的size为,stride也为,其他层级类似。
自适应size和stride的pooling使得输出的特征向量维度固定,而不同数目的空间块也带来了不同尺度信息的融合,从而一定程度上缓解了目标多尺度的问题。
四、SPPNet目标检测算法流程
由于SPP结构天然的优势性,SPPNet采取了与以往DCNN完全不同的训练和测试过程:训练时多尺度输入,测试时单尺度输入。
对于R-CNN来说,其训练过程大致如下:
- 使用Selective Search为每张图片产生2000个候选框
- 每个候选框变形为固定尺寸,例如227 * 227
- 一个预训练的CNN网络为每个变形后的候选框提取特征
- 基于上述特征,二元SVM分类器完成对每个候选框的分类,从而完成检测任务
SPPNet则是从feature map的区域中提取框特征,仅仅需要在整张图片上运行一次CNN得到feature map即可,速度提升一个量级。
- 使用Selective Search为每张图片产生约2000个候选框
- resize每张图片,使得其,这里的s有多种数值,详情见论文
- 使用CNN网络在整张图片上提取feature map
- 使用SPP对每个候选框对应的feature map进行池化,为每个候选框产生一个12800-d(256 * 50)维的向量表示
- 将向量表示送入全连接网络中,进一步提取特征
- 将提取得到的特征送入SVM中进行训练和分类
具体的训练设置基本和R-CNN类似,包括正负例的选择、NMS之类的。
五、总结
SPPNet名称上虽然没有R-CNN系列的身影,但实际上其是R-CNN家族中非常重要的一篇论文,其为R-CNN引入了在feature map上运行检测器的思想以及ROI-Pooling的前身Spatial Pyramid Pooling。
最后附上一下参考博客。
六、参考文献
[1]http://www.dengfanxin.cn/?p=403
[2]https://zhuanlan.zhihu.com/p/54222673