当前位置:   article > 正文

SPP和SPPF的比较_spp与sppf

spp与sppf

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

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

做个实验对比一下:

  1. import time
  2. import torch
  3. import torch.nn as nn
  4. class SPP(nn.Module):
  5. def __init__(self):
  6. super().__init__()
  7. self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
  8. self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
  9. self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)
  10. def forward(self, x):
  11. o1 = self.maxpool1(x)
  12. o2 = self.maxpool2(x)
  13. o3 = self.maxpool3(x)
  14. return torch.cat([x, o1, o2, o3], dim=1)
  15. class SPPF(nn.Module):
  16. def __init__(self):
  17. super().__init__()
  18. self.maxpool = nn.MaxPool2d(5, 1, padding=2)
  19. def forward(self, x):
  20. o1 = self.maxpool(x)
  21. o2 = self.maxpool(o1)
  22. o3 = self.maxpool(o2)
  23. return torch.cat([x, o1, o2, o3], dim=1)
  24. def main():
  25. input_tensor = torch.rand(8, 32, 16, 16)
  26. spp = SPP()
  27. sppf = SPPF()
  28. output1 = spp(input_tensor)
  29. output2 = sppf(input_tensor)
  30. print(torch.equal(output1, output2))
  31. t_start = time.time()
  32. for _ in range(100):
  33. spp(input_tensor)
  34. print(f"spp time : {time.time()- t_start}")
  35. t_start = time.time()
  36. for _ in range(100):
  37. sppf(input_tensor)
  38. print(f"sppf time : {time.time()- t_start}")
  39. if __name__== '__main__':
  40. main()

最终输出为:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/333098
推荐阅读
相关标签
  

闽ICP备14008679号