赞
踩
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快乐两倍多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。