SPP-net文章的详细解释

文章“用于视觉识别的深对流网络中的空间金字塔池”是RCNN的改进(参见R-CNN文章以获得关于RCNN的详细解释)。首先,SPP-net的总体框架图如下。

本文主要改进两点:

1.CNN需要固定输入图像的大小,这导致了不必要的准确性损失。

2.R-CNN对候选区域进行重复卷积计算,导致计算冗余。

1.CNN为什么固定输入图像的大小?

CNN主要由卷积层和全连接层两部分组成。卷积层以滑动窗口模式操作,并输出表示每个响应激活的空间分布的特征图。实际上,卷积层不需要固定大小的输入图像,可以生成任意大小的特征图。另一方面,完全连接的层需要具有固定大小/长度的输入。因此,固定输入大小的约束仅来自于存在于网络更深阶段的全连接层。

解决方案(比较R-CNN、SPP-net):

如下图所示

第一行的图像是CNN要求固定大小输入的图像处理方式。

第二种行为需要固定大小输入CNN(比如R-CNN)的处理流程。首先对图片进行类似第一行的处理,然后输入卷积和全连接层,最后输出结果。

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

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

如下图所示

对于一张图片,R-CNN首先通过分段选择法提取出2000个左右的候选区域,然后将这2000个候选区域分别发送给网络,即一张图片要经历2000次正向传播,会造成很多冗余。

另一方面,SPP-net提出了候选区域与整个图的特征图之间的对应映射关系。通过这种映射关系,可以直接获得候选区域的特征向量,不需要反复使用CNN进行特征提取,大大缩短了训练时间。每个图像只需要向前传播一次。

下面我们来详细解释一下改进后的方法:

1.SPP图层(空间金字塔池)

首先要明确的是这一层的位置,这一层是加在最后一个卷积层和全连通层之间的,目的是向需要固定输入的全连通层输出固定长度的特征。

SPP层的结构如下图所示。

SPP层的输入:

如下图灰色框所示。

上一层卷积输出的特征(我们称之为特征图),下图黑色部分表示,SPP层的输入是候选区域对应的特征图上的一个区域。

上面这句话可能有点迂回。我们可以理解为一张图片有2000个左右的候选区域,一张图片卷积后得到一张特征图,在这张特征图上也有2000个左右的区域对应着这些候选区域(下面会详细说明这里的对应关系)。

SPP层的输出:

SPP层分为三个池结构(1x1,2x2,4x4),将每个输入(其中每个输入大小不同)作为最大池(本文使用),然后将特征连接在一起,即(16+4+1)。

无论输入图像的大小如何,特征都固定为(16+4+1)x256。这样,SPP层的输出总是(16+4+1)x256特征向量,与图像中候选区域的大小无关。

2.候选区域与原始图像和特征图之间的映射关系。

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

在CNN中,感受野是指某一层输出结果中某一元素对应的上层的面积大小,如下图所示。

首先,定义几个参数。参数的定义参考了吴恩达在库塞拉的解释中对符号的定义,然后解释如何计算。

输入尺寸与输出尺寸有以下关系:

以上是面积大小的对应关系。我们来看看坐标点之间的对应关系。

SPP-net对上述坐标对应关系进行简化,简化过程如下:

是坐标值,不可能带小数,基本可以考虑。公式简化了:感受野中心点的坐标只与上一层有关。

那么,下图所示的方法就是SPP-net的映射方法,将原始ROI的左上角和右下角映射到特征图上对应的两个点。有了特征图上的两个角,就确定了对应的特征图区域(下图橙色)。

从原始坐标到特征图中坐标的映射关系如下

SPPNet的核心思想到此结束。SPPNet网络的背面和R-CNN类似。详细解释请参考R-CNN的文章。文章还利用这些思想做了图像分类的实验。有兴趣可以仔细阅读原文的分类部分。

参考: