SPP-Spatial Pyramid Pooling
Yolo4中使用了SPP作为Bag of specials的一部分。
Bag of specials:For those plugin modules and post-processing methods that only increase the inference cost by a small amount but can significantly improve the accuracy of object detection, we call them “bag of specials”
目的
一般来说CNN的输入图像尺寸要是固定的,因为整个网络的参数数量在。训练中是固定的,想要最后输出一个维度那么就要在开始也输入一个固定大小。
例如在Yolo3中训练图片经过预处理后都要resize到 416x416 的大小后再喂给网络。
按理说也没啥,反正在data augumentation 的时候图像肯定多多少少有些变形,也不在乎最后这resize一下,但是输入尺寸只能这么大总归不爽。因此SSP就可以保证输出维度固定的情况下输入尺寸多样化。
实现
传统CNN在conv layers 之前crop/warp改变图片尺寸, 现在SPP在 conv layers 之后用pooling的方式统一最后的输出,之后再给fc layers, 保证最终输出统一。
例如上图中黑色的一坨为从网络组中输出的feature maps。 目的是保证最后全链接层的输入的维度是 21x256: 蓝色(16x256)+绿色(4x256)+灰色(1x256)。因此需要对 feature map 用不同size, 和stride的卷积kernel进行pooling, 分别得到(4x4x256),(2x2x256),(1x1x256),之后flatten得到21x256 喂给fc layer,得到最终结果。
这个kernel size 计算:
| - | 蓝色 | 绿色 | 灰色 |
|---|---|---|---|
| feature map 尺寸 | 27x27x256 | 27x27x256 | 27x27x256 |
| ssp之后尺寸 | 4x4x256 | 2x2x256 | 1x1x256 |
| kernel size | ceiling(27/4)= 7 | ceiling(27/2) = 14 | ceiling(27/1) = 27 |
| stride | floor(27/4) = 6 | floor(27/2) = 13 | floor(27/1) = 27 |
最后4x4 + 2x2 + 1x1=21,就是要的维度
代码实现
TODO