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,如下图所示:
SPPNet论文解析

图1 裁减或变形操作示意图

但上述方法都存在一些问题,例如:

  • 裁减可能无法完整包含目标
  • 变形可能会引入不想要的形变

以上缺陷都可能会影响识别的准确率。

除此之外,现实生活中的各个目标的尺寸往往是变化的,单一尺度的图片可能不利于获取目标的多尺度特性。

三、Spatial Pyramid Pooling

为了解决以上两个问题:

  1. 输入图片固定尺度、长宽比的要求
  2. 目标的多尺度特性
    本文提出了Spatial Pyramid Pooling,用于解决上述问题。

1. 问题背景

为了解决上述问题,首先需要分析一下问题产生的原因。
目前的DCNN中主要包含两个部分:

  1. 全卷积网络
    DCNN中全卷积网络中的主要作用是特征提取,主要操作是卷积,卷积操作以滑窗形式运行,本身并不需要固定输入尺寸
  2. 全连接网络
    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

  1. Feature Map
    目前的DCNN中全卷积网络FCN主要用于特征提取,而FCN由于卷积的滑窗以及共享权重特性,实际上FCN提取得到的feature map中,不仅包含了响应的强度信息,还包含了响应的位置信息,参考如下图:
    SPPNet论文解析
图2 Feature Map响应示意图

这也是Spatial Pyramid Pooling中的Spatial一词的由来之一,后续会做进一步解释。

  1. SPP Layer位置
    SPPNet论文解析
图3 之前DCNN Pipeline与SPPNet Pipeline的对比示意图

上图是之前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域上

    SPPNet论文解析

    图4 推荐框映射示意图

    如上图所示,左边有张汽车原图以及一个对应的红色推荐框,汽车原图经过FCN进行特征提取,得到右边的feature map。此时,我们需要利用Spatial Pyramid Pooling将推荐框转换为固定长度向量。为此,需要将原图上的红色推荐框映射到feature map的虚线框上。SPPNet在Appendix中有详述,也是考虑到了一个Align的问题,具体实现时为:

    1. 首先在FCN中的所有的layer对应的padding都需要设置为 p/2\lfloor p/2 \rfloor
    2. 在原图中的位置(x,y)(x,y)将会映射到feature map的(x,y)(x', y')位置上,x=x/S+1x' = \lfloor x/ S \rfloor + 1,其中S表示FCN的整体的stride

    更详细的解释可以参考这篇博客
    这里的取整操作实际上会引入一定的位置误差,恺明大佬应该也是意识到了这个问题,随后在Mask R-CNN中提出了ROI-Align,也是比较好地解决了这个问题。

  • 得到映射后的所有推荐框后,对每个推荐框应用Spatial Pyramid Pooling,提取固定长度的特征向量表示
  • 最后将得到的特征向量送入FC层中,完成分类或是检测任务
  1. Spatial Pyramid Pooling结构
    下图是SPP的结构示意图:
    SPPNet论文解析
图5 SPP结构示意图

SPP通过在局部空间块上进行pooling,从而保留了空间信息。

  • 局部空间块的大小与输入图像的尺寸成比例关系==>局部空间块的数目固定

将CNN卷积层中的最后一个pooling层替换为SPP,从而可以产生一个固定大小的特征向量,这个向量的维度为kMkM,其中k代表最后卷积层输出的filter的数目,M则是SPP采用的局部空间块的个数。
具体为:在SPP Layer中,输入feature map size为 aaa * a,当前金字塔层级llnnn * n个局部空间块,SPP的具体实现采用滑窗的方式进行实现,窗口的size为win=a/nwin=\lceil a/n \rceil,stride为str=a/nstr=\lfloor a/n \rfloor,其中..\lceil . \rceil \lfloor . \rfloor分别代表上取整和下取整。
对每个金字塔层级都进行同样的处理,最终将各个金字塔的输出进行concatenate,送入后续全连接分类网络。
简单理解起来就是:每个金字塔层级都采用一个不定size和stride的pooling层来实现,例如对于上图蓝色的金字塔层级来说,其pooling的size为a/4a / 4,stride也为a/4a / 4,其他层级类似。
自适应size和stride的pooling使得输出的特征向量维度固定,而不同数目的空间块也带来了不同尺度信息的融合,从而一定程度上缓解了目标多尺度的问题。

四、SPPNet目标检测算法流程

由于SPP结构天然的优势性,SPPNet采取了与以往DCNN完全不同的训练和测试过程:训练时多尺度输入,测试时单尺度输入
对于R-CNN来说,其训练过程大致如下:

  1. 使用Selective Search为每张图片产生2000个候选框
  2. 每个候选框变形为固定尺寸,例如227 * 227
  3. 一个预训练的CNN网络为每个变形后的候选框提取特征
  4. 基于上述特征,二元SVM分类器完成对每个候选框的分类,从而完成检测任务

SPPNet则是从feature map的区域中提取框特征,仅仅需要在整张图片上运行一次CNN得到feature map即可,速度提升一个量级。

  1. 使用Selective Search为每张图片产生约2000个候选框
  2. resize每张图片,使得其min(w,h)=smin(w,h)=s,这里的s有多种数值,详情见论文
  3. 使用CNN网络在整张图片上提取feature map
  4. 使用SPP对每个候选框对应的feature map进行池化,为每个候选框产生一个12800-d(256 * 50)维的向量表示
  5. 将向量表示送入全连接网络中,进一步提取特征
  6. 将提取得到的特征送入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