SPP与SPPF对比与效率分析

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+2pk+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

参考文档

深入浅出之SPP、SPPF、SPPCSPC与ASPP模块(YOLO)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值