From ABC
在了解SPP和SPPF时,我大致看了一下SPP/SPPF的整体结构,基本都是1X1卷积和MaxPool结构进行结合,这里我对为什么使用maxpool而不是比如avgpool。
这里查找了一些博客包括对chatgpt进行询问。大致总结一下1. maxpool更倾向于特征选择,选择特征中更显著/更重要的信息。2. avgpooling更倾向于完整信息的传递与参数减少上。SPP/SPPF的输入是尺度最小的feature map,在这里应该是更倾向于对这个特征图进行特征选择,保留可能的检测区域。 有更懂的老哥可以在评论详细讨论一下
SPP
SPP的结构如下,经过CBS(Conv,BN,SiLU)的feature map独立地输入到每个最大池化层,这里各个最大池化的kernel_size和padding是不同的。
对于maxpool(卷积层类似),为了保持输出的feature map尺寸不变,最简单的办法是stride=1,2p+1 = k(p为padding尺寸,k为kernel_size尺寸)(根据输入输出的公式进行计算)
o
u
t
=
⌊
i
n
+
2
p
−
k
s
⌋
+
1
out = \lfloor \frac{in+2p-k}{s} \rfloor +1
out=⌊sin+2p−k⌋+1
比如在SPP中每个maxpool的[kernel_size,stride,padding]尺寸为[5,1,2],[9,1,4],[13,1,6]。
对于第一个maxpool其感受野大小为(k-1)s+1=5,第二个maxpool的感受野大小为9,第三个maxpool的感受野为13。
SPPF
在SPPF中是统一使用了一个[5,1,2]的maxpool代替了SPP中的三个不同的kernel_size的maxpool,不同的是上一个maxpool的输出作为下一个maxpool的输入。
对于第一个maxpool其感受野大小为(k-1)s+1=5,第二个maxpool的感受野大小为5+(k-1)s=9,第三个maxpool的感受野为9+(k-1)s=13。与SPP是相同的。图来源于深入浅出之SPP、SPPF、SPPCSPC与ASPP模块(YOLO)-CSDN博客
SPP的最大池化与SPPF最大池化的时间效率对比
SPPF相比SPP在不减小感受野的情况下,速度要快很多
import time
import torch
import torch.nn as nn
class SPP_Maxpool(nn.Module):
def __init__(self):
super(SPP_Maxpool,self).__init__()
self.mp1 = nn.MaxPool2d(kernel_size=5,stride=1,padding=2)
self.mp2 = nn.MaxPool2d(kernel_size=9,stride=1,padding=4)
self.mp3 = nn.MaxPool2d(kernel_size=13,stride=1,padding=6)
def forward(self,x):
t1 = time.time()
y1 = self.mp1(x)
y2 = self.mp2(x)
y3 = self.mp3(x)
t2 = time.time()
return t2-t1
class SPPF_Maxpool(nn.Module):
def __init__(self):
super(SPPF_Maxpool,self).__init__()
self.mp = nn.MaxPool2d(kernel_size=5,stride=1,padding=2)
def forward(self,x):
t3 = time.time()
y = self.mp(self.mp(self.mp(x)))
t4 = time.time()
return t4-t3
spp = SPP_Maxpool()
sppf = SPPF_Maxpool()
x1 = torch.randint(1,10,(1,20,20),dtype=float)
t5 = 0
t6 = 0
epoches = 100000
for epoch in range(epoches):
t1_ = spp(x1)
t5+=t1_
t2_ = sppf(x1)
t6+=t2_
print(f"SPP_Maxpool cost time {(t5/epoches)*1000:.2f}ms")
print(f"SPPF_Maxpool cost time {(t6/epoches)*1000:.2f}ms")
-------------------------------------
Result
-------------------------------------
SPP_Maxpool cost time 0.24ms
SPPF_Maxpool cost time 0.11ms