Eryck Zhou

A super simple BLOG for Artifical Intelligence.

从零复现YOLOv4系列二:SPP(Spatial Pyramid Pooling)

28 February 2023

Photo by unsplash-logoPatryk Wojcieszak

Paper: YOLOv4: Optimal Speed and Accuracy of Object Detection

1. What

一种用于提取特征的模块,它可以在不同尺度的感受野中进行池化操作,从而在保留空间信息的同时,减少了特征图的尺寸,减少了计算量

2. How

SPP 模块的基本思想是在不同大小的池化窗口中对输入特征图进行池化,然后将这些池化结果串联起来,作为下一层网络的输入。这样做的好处是可以在不同尺度上提取特征,从而提高模型的识别能力。

计算过程如下:

  1. 对输入特征图进行三个不同尺度的池化操作,分别使用大小为$5\times5$、$9\times9$和$13\times13$的池化窗口进行池化,得到三个大小不同的特征图。
  2. 将这三个特征图的尺寸调整为相同大小,并将它们沿着通道方向进行串联
  3. 将串联后的特征图作为 SPP 模块的输出。
class SpatialPyramidPooling(nn.Module):
    def __init__(self, pool_sizes = [5, 9, 13]):
        super(SpatialPyramidPooling, self).__init__()
        self.maxpools = nn.ModuleList([
            nn.MaxPool2d(pool_size, 1, pool_size // 2) for pool_size in pool_sizes
        ])

    def forward(self, x):
        features = [maxpool(x) for maxpool in self.maxpools[::-1]]  # ❗️[::-1] 13 -> 9 -> 5
        features = torch.cat(features + [x], dim = 1)

        return features