Object detection 之 SPP
Spatial Pyramid Pooling in Deep convolutional Networks for Visual Recognition
用于视觉识别的卷积神经网络空间金字塔池化
1 引入SPP的原因
之前的CNN网络都要求输入图片的大小是固定的,比如AlexNet要求227x227、VGG要求224x224。这样的话,对于任意一张图片,需要进行剪裁crop或者拉伸warp才能满足网络的输入要求。从下图的车辆和灯塔可以看到,剪裁会丢失部分有用的信息,而拉伸则会曲解图片原来的信息,这些都造成了输入的‘变形’。
那么为什么不设计一种可以接受所有各种图片尺寸的网络呢?
作者发现了,对于任意尺寸的图片,卷积层conv都可以进行操作,只是最后得到的feature maps的尺寸会因为输入的不同而不同。但是,对于全连接层,不同的输入是不可以接受的。
因此,作者想到在卷积层和全连接层中间加一个SPP层,用来将卷积层不同的输出特征图变成全连接层都能接受的输入大小。
2 什么是SPP
卷积层可以根据不同的输入图片得到不同的输出特征图,但是分类器(SVM或者softmax层)却只能接受固定的输入。Bag-of-Words(BoW)方法将特征图进行池化、组合形成分类器支持的输入向量形式。SPP空间金字塔池化方法通过在空间池化网格中进行池化,相比BoW方法注重图片空间信息的平衡。
具体的做法是:将卷积网络的最后一个池化层用SPP池化代替,提前设计不同的池化网格SPP spatial local bins。对于卷积层的输出filter numbers x size x size,不同经过不同的bins输出是filtersxnxn,n可以提前设计。
如上图中,卷积层最后的输出是256x?x?,经过SPP后有256x1x1+256x2x2+256x4x4。这样经过卷积层后的特征图尺寸是固定,可以直接连接全连接层。
作者还给出了一个n=1,2,3的SPP示意图,自己可以根据这个推推,感受一下SPP。
对于不同的输入图片,得到的最后一层的特征图尺寸是不同的,所以需要根据特征图尺寸计算SPP里每一个bin的win_size和stride。
3 SPP在分类任务上的应用
将SPP用在ZF-5、Convnet*-5、 Overfeat-5、 Overfeat-7这四个baseline网络上,实验对比发现:
加入single size SPP能提高0.5%~1%左右,加入multi size SPP能提高1%~到2%。
作者总结的几个提高精度的方式
- Multi-level Pooling Improves Accuracy
- Multi-size Training Improves Accuracy
- Full-image Representations Improve Accuracy
4 SPP在目标检测任务上的应用
作者主要将SPP和R-CNN进行了对比,从耗时上碾压了R-CNN。
##参考文献
SPP的论文好长,好多细节仅靠一次阅读无法全部把握,训练部分、特征图映射部分需要多看几次才能理解。
RCNN学习笔记(3):Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition(SPP-net)
SPP空间金字塔池化(Spatial Pyramid Pooling)