天天看点

SPP-Net论文详解

自R-CNN出来以后受到了广大的关注和研究,并设法将其优化,解决R-CNN的一些缺点,于是SPP-Net 就出来了。

SPP-Net总体框架图如下

SPP-Net论文详解

该文章主要改进了以下两点:

1、CNN需要固定输入图像的尺寸,导致不必要的精度损失

2、R-CNN对候选区域进行重复卷积计算,造成计算冗余

1、为什么CNNs要固定输入图像的尺寸?

深度卷积神经网络的基础结构分为:卷积层(conv layers)->池化层(pooling layers)->全连接层(fc layers)。我们在设计网络的时候,全连接层的输入维数必须提前固定。从全连接层往前推的话,就必须保持第一层卷积的输入尺寸是固定的,例如227 * 227(ImageNet)、32 * 32(LenNet)等。这也就要求我们在检测图片时,需要将图片经过crop(裁剪)、warp(拉伸)等操作把图片变换成固定尺寸,才能输入神经网络。这些操作在一定程度上会导致图片信息的丢失或者变形。对此SPP-Net提出的解决方案是在最后一层卷积层后用空间金字塔池化层(Spatial Pyramid Pooling)代替普通池化层。

SPP-Net论文详解

如下图所示

第一行中的图像即为要求固定尺寸输入的CNN对图像的处理方式

第二行为要求固定尺寸输入的CNN (如R-CNN)的处理流程,先将图片按照类似第一行中的方式进行处理,然后输入卷积以及全连接层,最后输出结果

第三行为SPP-Net的处理方式,不固定图像的大小,直接输入给卷积层处理,卷积出来的特征并不是直接输入给全连接层,而是先给SPP层处理,然后得到一个固定长度的输出传给全连接层,最后输出结果。

SPP-Net论文详解

2、R-CNN为什么会有计算冗余?

如下图所示

R-CNN对于一张图片,先使用segment seletive方法提取出约2000个候选区域,然后将这两千个候选区域分别送入网络中,即一张图片要经历2000次前向传播,这样会造成大量冗余。

SPP-Net则提出了一种从候选区域到全图的特征(feature map)之间的对应映射关系,通过此种映射关系可以直接获取到候选区域的特征向量,不需要重复使用CNN提取特征,从而大幅度缩短训练时间。每张图片只需进行一次前向传播即可。

SPP-Net论文详解

SPP-Net的改进方法如下:

一、空间金字塔池化(Spatial Pyramid Pooling)实现原理

空间金字塔池化并非作者原创,它是一种词袋(Bag of Words,BoW)模型的拓展,该模型在计算机视觉领域已经是非常成功的方法了,它将图像切分成粗糙到精细各种级别,然后整合其中的局部特征。

SPP-Net论文详解

论文中举例:把卷积操作之后的特征图(feature maps),以不同大小的块(池化框)来提取特征,分别是4 * 4,2 * 2,1 * 1,将这三张网格组合,就可以得到16+4+1=21种不同的块(Spatial Bins),我们从这21个块中,每个块提取出一个特征(提取方式有平均池化、最大池化等),这样就得到了固定的21维特征向量。以不同的大小格子的组合方式来池化的过程就是空间金字塔池化。这么一来,我们只要设计m个n * n大小的网格就可以生成任意维数的特征向量,而不需要在意经过多层卷积操作后的特征图的大小是多少,这也意味着我们不需要在意网络输入的图片尺寸。

具体的:

对于SPP层的输入:

如下图灰色框所示

最后一层卷积输出的特征(我们称为feature map),feature map为下图的黑色部分表示,SPP层的输入为与候选区域对应的在feature map上的一块区域,可以理解为一张图有约2000个候选区域,而对一张图做完卷积后得到feature map,在这个feature map上也有约2000个与候选区域对应的区域(这里的对应关系下面会详细讲解)

SPP-Net论文详解

对于SPP层的输出:

SPP layer分成1x1,2x2,4x4三个pooling结构(如上图中间格子部分),对每个输入(这里每个输入大小是不一样的)都作max pooling(论文使用的),出来的特征再连接到一起,就是(16+4+1)x256的特征向量。这样就实现了不管图像中候选区域尺寸如何,SPP层的输出永远是(16+4+1)x256特征向量。

二、候选区域在原图与feature map之间的映射关系

SPP-Net的做法是首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。然后把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中通过映射关系找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后再进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。

而问题的关键在于特征图(feature maps)的大小是根据图片的大小与卷积层的卷积核大小(kernel size)与步长(stride)决定的,如何在特征图上找到原图上对应的候选区域,即两者之间的映射关系是怎么样的。

这部分的计算其实就是感受野大小的计算。

在CNN中感受野(receptive fields)是指某一层输出结果中一个元素所对应的上一层的区域大小,如下图所示。

SPP-Net论文详解

我们利用吴恩达老师在课上的定义

SPP-Net论文详解

输入的尺寸大小与输出的尺寸大小有如下关系:

SPP-Net论文详解
SPP-Net论文详解

上面是区域尺寸大小的对应关系,下面看一下坐标点之间的对应关系

SPP-Net论文详解
SPP-Net论文详解

SPP-Net对上面的坐标对应关系作了一定的简化,简化过程如下:

  • 令每一层的padding都为
    SPP-Net论文详解
  • 当 k_i 为奇数
    SPP-Net论文详解
    所以
    SPP-Net论文详解
  • 当k_i 为偶数
    SPP-Net论文详解
    所以
    SPP-Net论文详解

SPP-Net论文详解

是坐标值,不可能取小数 所以基本上可以认为

SPP-Net论文详解

。公式得到了化简:感受野中心点的坐标

SPP-Net论文详解

只跟前一层

SPP-Net论文详解

有关。

那么对于下图的做法,就是SPP-net的映射方法,SPP-Net 是把原始ROI的左上角和右下角 映射到 feature map上的两个对应点。 有了feature map上的两队角点就确定了 对应的 feature map 区域(下图中橙色)。

SPP-Net论文详解

从原图坐标

SPP-Net论文详解

到特征图中坐标

SPP-Net论文详解

的映射关系为

  • 前面每层都填充padding/2 得到的简化公式 :
    SPP-Net论文详解
  • 需要把上面公式进行级联得到
    SPP-Net论文详解
    其中
    SPP-Net论文详解
  • 对于feature map 上的
    SPP-Net论文详解
    它在原始图的对应点为
    SPP-Net论文详解
  • 论文中的最后做法:把原始图片中的ROI映射为 feature map中的映射区域(上图橙色区域)其中 左上角取:
    SPP-Net论文详解
    右下角的点取:界取
    SPP-Net论文详解
    SPP-Net论文详解
    值:
    SPP-Net论文详解

本文参考了https://www.jianshu.com/p/07a573035e43并对其做了适当的修改。

继续阅读