Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

背景

        普遍的deep convolutional neural networks (CNNs)的输入需要固定大小,不管输入图像的sacle如何,都需要统一成固定的尺寸输入网络中。固定尺寸的方法常常采用crop或warp,如下图所示。crop常常不能包含整个图像的信息,warp常会导致图像形态扭曲,预定义的scale不能满足目标的scale变化(不同的目标的scale可能不同),这些做法可能会降低任意尺寸/比例的图像或子图像的识别精度,因此 SPPNet(Spatial Pyramid Pooling)是针对这一要求应运而生。

创新点

       (1) 提出了一种新的池化方法—-空间金字塔池化SPP:可以接受任意尺寸的输入图片,并生成固定长度的特征向量;可以进行多尺度的联合训练, 提升模型精度;这种池化方法是比较general的, 可以提升不同模型架构的性能(分类任务)。
       (2) 将SPP用于目标检测, 并且提出了先求卷积特征图谱, 后取区域的的策略:大大提升了模型训练和预测的速度(在预测阶段, 比RCNN快24~102倍, 同时取得了更好的精度)。
       在特征图谱上使用检测方法不是首次提出, 而SPP的贡献在于结合了deep CNN结构强大的特征提取能力和SPP的灵活性, 使得精度和速度同时提高。相比于RCNN, SPPNet使用了EdgeBoxes( 0.2s/img0.2s/img )的方法来进行候选区域推荐, 而不是Selective Search( 1∼2s/img1∼2s/img )。 SPPNet在ILSVRC2014的目标检测任务上取得第二名, 在图片分类任务上取得第三名。

The Spatial Pyramid Pooling Layer

        为了让网络的输入可以是任意的大小,本文在最后一层卷积特征图的基础上进一步进行处理,将最后一层尺化层pool5用空间金字塔层(spatial pyramid pooling layer)代替,提出了spatial pyramid pooling layer,如下图所示。SPP是BOW的扩展,将图像从精细空间划分到粗糙空间,之后将局部特征聚集。在CNN成为主流之前,SPP在检测和分类的应用比较广泛。

        空间金字塔池化(spatial pyramid pooling)的网络结构如下图所示,SPP的详细结构如下图黑色方框部分所示。从图中可以看出,输入图像经过多个卷积层后,将最后一个卷积层(即第5个卷积层)得到的feature map(任意大小,说明输入图像可以是任意的scale)输入SPP层变成固定长度的特征向量,然后再将固定长度的特征向量输入到全连接层,进而用softmax对图像进行分类。

       那么SPP层是如何将不同scale的feature map变成固定长度的vector呢?如上图所示, 有三种不同的spatial bins。假设最后一层卷积层得到的feature map的size是W*H*C,要想得到上图黑色方框中最左边的4*4大小网格的spatial bin,则需要将W*H*C大小的feature map分成16块,每块的大小为\lceil \frac{W}{4} *\frac{H}{4} \rceil (向上取整),分别计算每块中的最大值(这个操作相当于用\lceil \frac{W}{4} *\frac{H}{4} \rceil 大小的窗口,步长s=\lfloor \frac{W}{4} *\frac{H}{4}\rfloor (向下取整)对它进行max pooling),得到4*4*C大小的feature map,然后将每一个通道中的feature map抽取出来,头尾拼接,展成16维大小的feature vector,得到16*C(上图中的C为256)的feature vector;同理,要想得到上图黑色方框中最左边的2*2大小网格的spatial bin,则需要将W*H*C大小的feature map分成4块,每块的大小为\frac{W}{2} *\frac{H}{2} ,分别计算每块中的最大值(这个操作相当于用\lceil \frac{W}{2} *\frac{H}{2} \rceil 大小的窗口,s=\lfloor \frac{W}{2} *\frac{H}{2}\rfloor 对它进行max pooling操作),得到2*2*C大小的feature map,然后将每一个通道中的feature map抽取出来,头尾拼接,展成4维大小的feature vector,得到4*C大小的feature vector;最右边的1*1大小网格的spatial bin相当于用W*H大小的尺化窗口对feature map进行global max pooling(全局最大尺化),得到的1*C大小的feature vector。最后将经过三种size的average pooling生成的feature vector进行首尾拼接,生成(16+4+1)*C=21*C大小的feature vector送入全连接层,至此SPP的工作完成。
        从上述操作中可以看出,不管输入图像的size如何,只要经过SPP层,就可以变成一个固定长度的feature vector。

训练过程

Single-size training
     
 从对原始图像crop大小为224×224的图像作为网络的输入,SPP layer的结构为3-level pyramid即有3个spatial bins(3×3,2×2,1×1)。在网络中输入单一尺寸进行训练的目的验证是一张图像的多级尺化特征有助于提高网络的精度。(在实际实现中, 使用sliding window pooling的方式来实现spp的, 对于单一尺寸的输入, 可以提前计算好需要的windows size, 编码时直接常量定义相关pooling即可。)
Multi-size training
       在上面Single-size training输入图片224*224的基础上,对其resize为180*180大小的图片,两者只在分辨率上不同。为了减少训练不同size网络的间接成本,作者定义了两个固定输入大小的网络,一个是输入大小为180*180,一个是输入大小是240*240,这两个网络结构一样,参数是共享的, SPP的结构都是3-level pyramid(3×3,2×2,1×1),只是输入大小和SPP的windows size不同。对于两个网络,spp的参数设置是根据图片的尺寸来调节的, 因为要得到固定长度的特征向量, 所以如果图片尺寸较大,那么最后一层卷积层的特征图谱也就较大, 那么就需要比较大的sliding windows size 来实现spp。作者会先训练一个网络, 在一个epoch完成后,会转向训练另一个网络,随着epoch的变化,两个网络交叉训练。为了能一次性训练不同尺寸图片, 采用了这种迭代训练的方式(反正 pooling层是没有参数的 , 只不过是定义时需要指定window size)。进行多尺度训练的目的是为了协同不同尺度下的图片特征提取,同时利用已有的优化技术(GPU在单一尺寸上训练速度较快)。
注意: 以上策略仅仅在training阶段使用,测试阶段的输入图像可以是[180,224]范围内的任意大小的图像。
       训练的大致步骤为:
       a、水平翻转和颜色改变来增强数据,调整图像大小以使较小一边的尺寸为256,并从整个图像的中心或四个角中crop出224×224大小的图像。
       b、输入图像到网络中进行微调,对conv5的feature map采用EdgeBoxes方法选出目标候选框,输入到SPP layer中得到固定长度的feature vector;将fixed-feature vector输入到fc6-fc7层中,得到4096维的特征;将4096维的特征输入到SVM中进行训练分类。
       c、运用极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框;
       d、进行回归操作,最终得到每个类别的修正后的得分最高的region proposal。
       e、将得分最高的region proposal的feature map位置映射回原图像的位置。
注意:b步骤中的微调只针对网络中的最后两个全连接层进行,前5层的参数用的是预训练模型的参数,在网络中没有进行微调。

解释分析

SPP的优点

a、不管input size如何,SPP都可以生成一个fixed-length输出。
b、SPP可以使用多级空间信息,多级空间的尺化操作让SPP对空间大小的变化具有强的鲁棒性,例如输入目标的scale可以变化,SPP在同一目标下的不同scale中都可以提取到有用的特征。
c、SPP可以将输入的信息在不同尺化窗口下得到的feature map汇集。

why do CNNs require a fixed input size?

       因为CNNs由两部分组成,分别是卷积层和全连接层。卷积层的输入不需要固定大小,因为它是以滑动窗口的方式运行,输出表示激活的空间排列的feature map,如下图所示,它可以生成任意尺寸的feature map;卷积核的参数个数就是卷积核大小,前层的图像大小不管怎么变化,卷积核的参数数量也不会改变。而全连接层需要有一个预先定义好的输入数据的大小,全连接的参数是随前层大小的变化而变的,如果输入图片大小不一样,那么全连接层之前的feature map也不一样,那全连接层的参数数量就不能确定;全连接层的计算其实相当于输入的特征图数据矩阵和全连接层权值矩阵进行内积,在配置一个网络时,全连接层的参数维度是固定的,所以两个矩阵要能够进行内积,则输入的特征图的数据矩阵维数也需要固定。

候选区域到feature map的映射做法详解

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

如何映射?
       
左上角的点(x,y)映射到 feature map上的(x′,y′) : 使得(x′,y′)在原始图上感受野(上图绿色框)的中心点与(x,y)尽可能接近。

对应点之间的映射公式是什么?

      把前面每层都填充 padding/2,得到的简化公式 p_{i} =s_{i}* p_{i} +1;需要把上面公式进行级联得到p_{0} =S* p_{i+1},其中 (S=\prod\nolimits_{0}^is_{i} );对于feature map 上的(x′,y′) 它在原始图的对应点为 (x,y)=(Sx′,Sy′),论文中的最后做法:把原始图片中的ROI映射为 feature map中的映射区域(上图橙色区域)
左上角取: x′=⌊x/S⌋+1; y′=⌊y/S⌋+1
右下角取: x′=⌈x/S⌉−1 ; y′=⌈y/S⌉−1

为什么SPPnet不能更新spatial pyramid pooling层前面的卷积层,而只能更新后面的全连接层? 

       这里不太明白。有网友解释说卷积特征是线下计算的,从而无法在微调阶段反向传播误差;另一种解释是,反向传播需要计算每一个RoI感受野的卷积层梯度,通常所有RoI会覆盖整个图像,如果用RoI-centric sampling方式会由于计算too much整幅图像梯度而变得又慢又耗内存。

RCNN与SPPNet的区别

R-CNN模型候选区域在CNN重复计算

R-CNN和SPPNet的实现过程

总结

       SPPNet网络后面和R-CNN类似,训练SVM分类器和位置回归等。SPPNet在R-CNN的基础上提出了改进,通过候选区域和feature map的映射,配合SPP层的使用,从而达到了CNN层的共享计算,减少了运算时间。后面的Fast RCNN也是受SPPNet的启发,再一次刷新物体检测的state-of-the-art。

参考资料

[1406.4729] Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

https://blog.csdn.net/forever__1234/article/details/79910175

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容