SPP和SPPF的比较

SPP的结构是将输入并行通过多个不同大小的MaxPool层,然后做进一步融合,能在一定程度上解决多尺度问题。

而SPPF结构则是讲输入串行通过多个5*5的MaxPool层,这里需要注意两个5*5的MaxPool层和一个9*9的MaxPool的计算结果是一样的,而串行三个5*5的MaxPool层和一个13*13的MaxPool层计算结果是一样的。

做个实验对比一下:

复制代码
import time
import torch
import torch.nn as nn

class SPP(nn.Module):
    def __init__(self):
        super().__init__()
        self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
        self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
        self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)

    def forward(self, x):
        o1 = self.maxpool1(x)
        o2 = self.maxpool2(x)
        o3 = self.maxpool3(x)
        return torch.cat([x, o1, o2, o3], dim=1)
    
class SPPF(nn.Module):
    def __init__(self):
        super().__init__()
        self.maxpool = nn.MaxPool2d(5, 1, padding=2)

    def forward(self, x):
        o1 = self.maxpool(x)
        o2 = self.maxpool(o1)
        o3 = self.maxpool(o2)
        return torch.cat([x, o1, o2, o3], dim=1)
    
def main():
    input_tensor = torch.rand(8, 32, 16, 16)
    spp = SPP()
    sppf = SPPF()
    output1 = spp(input_tensor)
    output2 = sppf(input_tensor)

    print(torch.equal(output1, output2))

    t_start = time.time()
    for _ in range(100):
        spp(input_tensor)
    print(f"spp time : {time.time()- t_start}")

    t_start = time.time()
    for _ in range(100):
        sppf(input_tensor)
    print(f"sppf time : {time.time()- t_start}")

if __name__== '__main__':
    main()

最终输出为:

通过对比发现,两者的计算结果是一模一样的,但是计算时间SPPF比SPP快乐两倍多。

相关推荐
Sam09272 分钟前
AI Agent 沙箱怎么做:从文件、网络、工具到权限边界的工程实践
人工智能·ai
大嘴皮猴儿6 分钟前
跨境电商运营笔记:我是如何用工具解决多语言素材问题的
大数据·人工智能·新媒体运营·自动翻译·教育电商
JS菌9 分钟前
Skills 动态加载系统:让 AI Agent 按需获取领域知识
前端·人工智能·后端
赤龙ERP9 分钟前
赤龙一周观察 · 6月第2周
大数据·人工智能·ai·erp
qq_2915792513 分钟前
霍客引擎与电商图片AI:智能视觉营销的新范式
人工智能
JGDT_14 分钟前
ERP重塑与未来趋势:SAP的实践及大一统格局(上)
大数据·人工智能·安全·架构·开源
洛星核17 分钟前
CrewAI 安装、使用方法详细全解
人工智能·github·人机交互·ai编程·agi·智能体
chen_zn9518 分钟前
RLinf复现RECAP(一):从轨迹回报到优势标签
人工智能·强化学习·具身智能·vla
Xiaofeng369328 分钟前
GPT-4o国内注册保姆级教程(2026最新版):开发者高效访问与避坑实战
人工智能·chatgpt