您的位置:首页 > 其它

RCNN学习笔记(1):《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》论文笔记

2016-12-14 22:12 603 查看

Abstract

在现有的CNN中,对于结构已经确定的网络,需要输入一张固定大小的图片(e.g. 224×224)。那么检测各种大小的图片的时候,需要经过裁剪,或者缩放等一系列操作,这样往往会降低识别检测的精度。在这篇论文中,作者使用池化策略,“空间金字塔池化”,来消除上述影响。这个新的网络SPP-net,使得构建的网络,可以输入任意大小的图片,不需要经过裁剪缩放等操作。

这个新的网络在目标检测上很有效。使用这个网络只需要对全图计算一次feature maps ,然后对任意区域进行池化就可以得到训练检测器需要的固定尺寸。这个方法避免反复计算卷积特征,提升R-CNN检测的速度24-102倍。

____________________________________________________________________________________________________________________________________

1 Introduction

之前的技术使用CNN进行训练和测试,要求输入固定大小的图片,这些图片或者经过裁切(Crop)或者经过变形缩放(Warp),都在一定程度上导致图片信息的丢失和变形,限制了识别精确度。

为什么CNN网络需要将图片限制到固定的尺寸才能进行输入呢?

CNN由两部分组成:卷积层以及全连接层。

卷积层进行的操作是利用设置好大小和步长的​卷积核对图片进行滑动窗口操作,并且输出代表激活空间排列的特征图(Fig.2)。因此卷积层是不需要输入固定大小的图片的,而且还可以生成任意大小的特征图。

全连接操作中需要指定输入层神经元个数和输出层神经元个数,所以需要规定输入的feature的大小。因此,固定长度的约束仅限于全连接层。



在这种情况下,作者提出了一种解决方式,在原网络的卷积池化层与全连接层中间,加入一个新的层,能使任意大小的feature map转化为特定大小feature的层。从而实现整体网络输入任意尺度图片的要求。文中把这一个新的层称为SPP layer。

原有网络的结构与使用了SPP layer后网络(称为SPP-net)结构如下:



可以把SPP视为词袋模型的延伸,它将图像从精细空间划分到粗糙空间,并聚合其中的局部特征。在CNN流行之前,SPP在检测和分类的应用比较广泛。

对于深度CNN网络,SPP有几个显著的特性:

(1)任意尺寸输入,固定大小输出;

(2)层多 uses multi-level spatial bins,多级池化对于目标变形是鲁棒的;

(3)可对任意尺度提取的特征进行池化

____________________________________________________________________________________________________________________________________

2 Deep Networks with Spatial Pyramid Pooling

流行的7层CNN由5个卷积层(有些带pooling层)、2个全连接层组成。最后一层被称为是softmax层,有n个输出,这个n指的是类别的数目。

卷积层接受任意输入大小,并且产生可变大小的输出。但是分类器(SVM)或者全连接层需要的是固定大小的数组。而SPP通过在局部spatial bins池化能够维持空间信息,这些spatial bins大小与图像大小成比例,但是bins的数量是固定的。

SPP层的结构如下:



将最后一个(第五层)卷积层之后的池化层使用SPP代替。用spatial bins来对图片提取特征,对每个spatial bin采用max pooling,那么对于M个bin,输出的SPP为256M维向量(这里的256是上面Fig.3中conv5的卷积核的数量,每个格子都是256维的)

更深入的理解:

conv5层输入:一张任意大小的图片,假设其大小为(w,h)。
spp层输出:21个神经元。

也就是我们输入一张任意大小的特征图的时候,我们希望从conv5层的输出提取出21个特征。空间金字塔特征提取的过程如下:



输入一张图片的时候,我们利用不同大小的刻度,对一张图片进行了划分。上面示意图中,利用了三种不同大小的刻度,对一张输入的图片进行了划分,最后总共可以得到16+4+1=21个块,我们即将从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。

卷积层输入的任意大小的图片,所以Conv5计算出的feature map也是任意大小的,现在经过SPP之后,就可以变成固定大小的输出了,以上图为例,一共可以输出21*256的特征,21表示Spatial bins的数量,256则表示卷积核的数量。

第一张图片,我们把一张完整的图片,分成了16个块,也就是每个块的大小就是(w/4,h/4);

第二张图片,划分了4个块,每个块的大小就是(w/2,h/2);

第三张图片,把一整张图片作为了一个块,也就是块的大小为(w,h)。

空间金字塔最大池化的过程,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出神经元。最后把一张任意大小的图片转换成了一个固定大小的21维特征(当然你可以设计其它维数的输出,增加金字塔的层数,或者改变划分网格的大小)。

上面的三种不同刻度的划分,每一种刻度我们称之为:金字塔的一层,每一个图片块大小我们称之为:spatial bin了。如果你希望,金字塔的某一层输出n*n个特征,那么你就要用spatial bin大小为:(w/n,h/n)进行池化了。

当我们有很多层网络并且网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络的倒数几层的时候,也就是我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的奥义(多尺度特征提取出固定大小的特征向量)

____________________________________________________________________________________________________________________________________

训练SPP网络

理论上说,SPP-net支持直接以多尺度的原始图片作为输入后直接BP即可。实际上,caffe等实现中,为了计算的方便,输入的是固定尺度的图片。所以为了使得在固定输出尺度的情况下也能够做到SPP-net的效果,就需要定义一个新的SSP-layer。

Single-Size Training.

对于给定尺寸的图片,作者预先计算出spp需要的bin的数目。

conv5出来的reponse map为a x a,设第l级金字塔有nx n 个bins,我们将这个池化级别作为滑动窗口池化。

窗口的大小


步长



为上限与下限操作。

那么下一层全连接层的输入则是这第L级金字塔中的输出。

以输入图像大小为224x224举例,这时候conv5出来的reponse map为13x13,下图的spp为一个三层池化金字塔。



Multi-size Training.

由于不受尺度的影响,可以进行多尺度训练,即先resize成几个固定的尺度,然后用SPP网络进行训练,学习。

假设有224x224和180x180两种大小的输入图像(其中180x180是由224x224缩放所得)。conv5的特征分别为224x224->13x13,180x180->10x10。相应的win和str都不同,但bin的数量是相同的都是(9+4+1)x256,后面连着全连接层。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: