SPPnet笔记

2022-07-01 12:51:03 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

Motivation

R-CNN等神经网络都要求输入图片是固定尺寸,比如R-CNN要求输入图片是224×224,这样就限制了其他长宽比和其他尺寸的输入图片。不同长宽比和不同尺寸的输入图片是有意义的,首先,图片数据都不是同一尺寸的,他们大小不一,长宽比不同。第二,调整图片的长宽比可以有助于识别图中物体,调整图片的尺寸可以帮助学习器学习太大或太小的物体。

在R-CNN中,输入的图片是裁剪的区域,或者把区域缩放成目标大小,如下图所示:

裁剪区域可能只包含物体的部分区域(如左上图),缩放区域导致物体变形(如右上图),这些都可能会影响识别和检测。

Innovation

卷积网络要求固定尺寸输入图片的原因在于全连接层要求固定输入,卷积层和池化层并没有这种要求。作者结合图像处理的图像金字塔算法,提出了空间金字塔池化层,使得神经网络能够接收任何尺寸的输入图片。空间金字塔池化层把任意大小的feature map转换成固定长度的特征向量,从而能够传输给全连接层。

下图是空间金字塔池化网络的结构:

上部分是传统网络的结构,下部分是空间金字塔池化网络结构,可以看到空间金字塔池化层可以避免裁剪和缩放输入图片。

Adavantage

  • SPP可以生成一个固定长度的输出,忽视输入大小,而滑动窗体池化层不能。
  • SPP使用多级别空间bins,而滑动窗体池化使用一个窗体大小。多级别池化对物体变形有很好的鲁棒性。
  • 因为输入尺寸的灵活性,SPP可以池化不同尺寸提取的特征。

Spatial Pyramid Pooling Layer

空间金字塔池化层结构:

空间金字塔池化层位于卷积层与全连接层之间,替代原来最后一个池化层。空间金字塔池化层可以有几个等级,上图有{1, 2, 4}个等级,分别把feature map分成1,4,16个bin,每个bin进行池化,作者使用最大池化。上图的池化操作产生21个bin,把这21个bin输出拼接在一起,然后输出21×256大小的特征(256是feature map的通道数)。

设最后卷积层输出的feature map为 a × a a times a a×a,一个金字塔等级为n,有 n × n n times n n×n个bin,那么这等级的池化窗口大小为 ⌈ a / n ⌉ lceil a/n rceil ⌈a/n⌉,步长为 ⌊ a / n ⌋ lfloor a/n rfloor ⌊a/n⌋。

下图一个具体的池化例子:

上部分表示不同级别金字塔的池化操作,下部分表示之后全连接层。

Multi-size training

作者使用caffe训练SPPnet网络,但是caffe不支持多尺寸图片输入,为了实现多尺寸训练,作者实现两个网络,一个网络输入224×224大小的图片,另一个网络输入180*180大小的图片。这两个网络共享参数。训练时,在一个网络中训练一个epoch,然后切换到另外一个网络训练一个epoch。

Object Detection

把空间金字塔池化层加入到R-CNN中,使得R-CNN能够接收任意输入图片。为了加快R-CNN的运行,输入网络的是整张图片,计算出最后的feature map。然后从feature map中提取候选区域的特征向量进行分类和定位,如下图所示。

这里有一个问题,就是如何确定原图的候选区域位置映射到卷积后feature map的位置。假设卷积和池化操作padding的大小为 ⌊ p / 2 ⌋ lfloor p/2 rfloor ⌊p/2⌋,其中p为过滤器的大小。原图中点 ( x , y ) (x, y) (x,y)经过映射后在feature map的位置为 ( x ′ , y ′ ) (x', y') (x′,y′),映射关系为 ( x , y ) = ( S x ′ , S y ′ ) (x, y) = (Sx', Sy') (x,y)=(Sx′,Sy′)。这里S是所有步长的乘积(所有卷积和池化的步长)。假设某个候选区域在原图的左上角坐标为 ( x , y ) (x, y) (x,y),在feature map中的坐标为 ( ⌊ x / S ⌋ 1 , ⌊ y / S ⌋ 1 ) (lfloor x/S rfloor 1, lfloor y/S rfloor 1) (⌊x/S⌋ 1,⌊y/S⌋ 1)。假设某个候选区域在原图的右下角坐标为 ( x , y ) (x, y) (x,y),在feature map中的坐标为 ( ⌈ x / S ⌉ − 1 , ⌈ y / S ⌉ − 1 ) (lceil x/S rceil – 1, lceil y/S rceil – 1) (⌈x/S⌉−1,⌈y/S⌉−1)。如果padding大小不是 ⌊ p / 2 ⌋ lfloor p/2 rfloor ⌊p/2⌋,还需要计算偏移量。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131382.html原文链接:https://javaforall.cn

0 人点赞