论文阅读: SPPNet

Introduction

R-CNN中,通过在原图先抠取出很多的像素块,再分别单独进行特征抽取的方式来一个个生成proposal,很低效:
论文阅读: SPPNet_第1张图片

SPPNet则改成了直接先对整张图片进行特征抽取。再在这一大张feature map上,接上一个SPP layer:
这里写图片描述

和R-CNN一样,SPPNet的输入也包括两部分:

  • 1batch的输入图像
  • selective search算法对应每个输入图像生成的一系列proposal

另外,SPPNet还设计了全新的SPP layer,通过“池化”方式来统一“proposal的size”。
而在R-CNN中,则是通过“warp”方式来统一“proposal的size”。

该layer详细结构如下图红框部分:
论文阅读: SPPNet_第2张图片

假设最后一个卷积层输出的feature map tensor的size为 W×H×C W × H × C ,那么红框部分其实就是 滑窗size W/4×H/4×C W / 4 × H / 4 × C 的 average pooling:
论文阅读: SPPNet_第3张图片

将该size的滑窗滑过全feature map tensor所pooling得到的tensor,沿channel方向一根根抽取出来,头尾拼接:
论文阅读: SPPNet_第4张图片

再用 W/2×H/2×C W / 2 × H / 2 × C 的滑窗 和 W×H×C W × H × C 的滑窗 在同一张feature map tensor上进行average pooling 。

其中,后者 (红框部分) 相当于 global average pooling (全局平均池化) :
论文阅读: SPPNet_第5张图片

最后,三种size的average pooling会生成 16+4+1=21 16 + 4 + 1 = 21 根vector。
把这些vector头尾相接,并送入fc6层,即完成了SPP layer的使命:
论文阅读: SPPNet_第6张图片

SPP layer的设计有着“multi-scale”的影子,但在几个月后的Fast R-CNN中被弃用。也就意味着Fast R-CNN主动放弃了multi-scale。

Innovation

SPPNet有两个最大的创新点:特征抽取共享化SPP layer

  • 特征抽取共享化 :大大简化了原本R-CNN设计中的巨大计算量,让原本需要分别单独进行特征抽取的各proposal可以放在一块,一起一次性完成特征抽取。后续所有的检测网络,无不继承了此思想。可以说,SPPNet推动了Detection的发展。

  • SPP layer :该layer可以 适应任意size和宽高比的输入图像

Result

在VOC 2007上的结果:
论文阅读: SPPNet_第7张图片

SPPNet检测效果图:
论文阅读: SPPNet_第8张图片

Thinking

SPPNet有两大划时代的贡献:

  • 特征抽取共享化;
  • 对RoI进行pooling。

SPPNet是一个被人忽视的杰出贡献。具体来说:

  • 第一次提出了网络前半部分的 特征抽取共享化 。使得特征抽取不再是瓶颈。几个月之后的 Fast R-CNN 正是吸收了这部分的核心精华并进行了进一步的改进。
  • 对RoI进行pooling,使得检测网络可以输入任意size的图片。因为从输入图片到fc之间契入了对RoI的pooling,使得fc的存在也无法写死输入图片的size。

SPP layer有着明显的缺陷。因为:

  • pooling后得到的一根根tensor并没有按原先的位置排放成阵列,而是直接头尾相接,从而放弃了重要的位置信息,对RoI的分类不利 (Fast R-CNN提出的RoIPooling改进了这点) 。
  • 其设计阻断了梯度下降的反向传播,使得下层的conv部分无法被从后往前update。该缺陷在Fast R-CNN中被修正。

[1] Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
[2] 深度学习: global pooling (全局池化)

你可能感兴趣的:(论文阅读,论文算法)