R-CNN中,通过在原图先抠取出很多的像素块,再分别单独进行特征抽取的方式来一个个生成proposal,很低效:
SPPNet则改成了直接先对整张图片进行特征抽取。再在这一大张feature map上,接上一个SPP layer:
和R-CNN一样,SPPNet的输入也包括两部分:
另外,SPPNet还设计了全新的SPP layer,通过“池化”方式来统一“proposal的size”。 而在R-CNN中,则是通过“warp”方式来统一“proposal的size”。
该layer详细结构如下图红框部分:
假设最后一个卷积层输出的feature map tensor的size为 W×H×CW×H×CW\times H\times C ,那么红框部分其实就是 滑窗size 为 W/4×H/4×CW/4×H/4×CW/4\times H/4\times C 的 average pooling:
将该size的滑窗滑过全feature map tensor所pooling得到的tensor,沿channel方向一根根抽取出来,头尾拼接:
再用 W/2×H/2×CW/2×H/2×CW/2\times H/2\times C 的滑窗 和 W×H×CW×H×CW\times H\times C 的滑窗 在同一张feature map tensor上进行average pooling 。
其中,后者 (红框部分) 相当于 global average pooling (全局平均池化) :
最后,三种size的average pooling会生成 16+4+1=2116+4+1=2116+4+1=21 根vector。 把这些vector头尾相接,并送入fc6层,即完成了SPP layer的使命:
SPP layer的设计有着“multi-scale”的影子,但在几个月后的Fast R-CNN中被弃用。也就意味着Fast R-CNN主动放弃了multi-scale。
SPPNet有两个最大的创新点:特征抽取共享化、SPP layer。
在VOC 2007上的结果:
SPPNet检测效果图:
SPPNet有两大划时代的贡献:
SPPNet是一个被人忽视的杰出贡献。具体来说:
SPP layer有着明显的缺陷。因为:
[1] Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition [2] 深度学习: global pooling (全局池化)