当前位置:   article > 正文

YOLOv5、YOLOv8改进: GSConv+Slim Neck_vovgscsp\vovgscspc和gsconv

vovgscsp\vovgscspc和gsconv

论文题目:Slim-neck by GSConv: A better design paradigm of detector architectures for autonomous vehicles

论文:https://arxiv.org/abs/2206.02424

代码:https://github.com/AlanLi1997/Slim-neck-by-GSConv

计算机视觉领域,目标检测是一项复杂而具有挑战性的任务,特别是在车载边缘计算平台上,实时性要求较高,而且传统的大型模型往往难以满足这一需求。另一方面,基于大量深度可分离卷积层构建的轻量级模型可能无法保持足够的准确性。为了解决这些问题,本文提出了一种名为GSConv的新方法,以在降低模型复杂性的同时保持准确性。GSConv不仅可以平衡模型的速度和准确性,还引入了一种名为Slim-Neck的设计范式,以在计算成本方面实现更高的效益。实验结果表明,与原始网络相比,本文方法在性能上取得了显著的提升,例如在Tesla T4上以约100FPS的速度获得了70.9%的mAP0.5,显示了其在目标检测领域的优越性。

目标检测在无人驾驶汽车中具有重要的意义,它是使车辆能够感知周围环境的基本能力。当前,基于深度学习的目标检测算法在这一领域中占据主导地位。这些算法在检测阶段通常可分为两种类型:一阶段检测和两阶段检测。两阶段检测器在小目标的检测方面表现更佳,通过稀疏检测的原理能够实现更高的平均精度(mAP),但其速度较慢。而一阶段检测器虽然在小目标的检测和定位方面不如两阶段检测器准确,但其速度更快,这在工业应用中具有重要意义。

尽管人们常常认为模型的非线性能力与神经元的数量成正比,但这并不是完整的理解。事实上,生物大脑在信息处理方面具有强大的能力和低能耗,远超计算机。因此,简单地不断增加模型参数的数量并不能直接带来强大的性能。在目前阶段,采用轻量级设计可以有效地降低计算成本。这一设计思路主要通过使用深度可分离卷积(DSC)操作来减少参数数量和浮点运算数(FLOPs),从而取得显著效果。

1.

 

 

2 Slim-Neck

采用 GSConv 方法的 Slim-Neck 可缓解 DSC 缺陷对模型的负面影响,并充分利用深度可分离卷积 DSC 的优势。

 Slim-Neck结合Yolov5

 

---------------------------------------分割线----------------------------------------------

下面介绍一下如何在自己的网络中改进

 

GSConv+Slim Neck  加入common.py

 

  1. ###################### slim-neck-by-gsconv #### start ###############################
  2. class GSConv(nn.Module):
  3. # GSConv https://github.com/AlanLi1997/slim-neck-by-gsconv
  4. def __init__(self, c1, c2, k=1, s=1, g=1, act=True):
  5. super().__init__()
  6. c_ = c2 // 2
  7. self.cv1 = Conv(c1, c_, k, s, None, g, 1, act)
  8. self.cv2 = Conv(c_, c_, 5, 1, None, c_, 1 , act)
  9. def forward(self, x):
  10. x1 = self.cv1(x)
  11. x2 = torch.cat((x1, self.cv2(x1)), 1)
  12. # shuffle
  13. # y = x2.reshape(x2.shape[0], 2, x2.shape[1] // 2, x2.shape[2], x2.shape[3])
  14. # y = y.permute(0, 2, 1, 3, 4)
  15. # return y.reshape(y.shape[0], -1, y.shape[3], y.shape[4])
  16. b, n, h, w = x2.data.size()
  17. b_n = b * n // 2
  18. y = x2.reshape(b_n, 2, h * w)
  19. y = y.permute(1, 0, 2)
  20. y = y.reshape(2, -1, n // 2, h, w)
  21. return torch.cat((y[0], y[1]), 1)
  22. class GSConvns(GSConv):
  23. # GSConv with a normative-shuffle https://github.com/AlanLi1997/slim-neck-by-gsconv
  24. def __init__(self, c1, c2, k=1, s=1, g=1, act=True):
  25. super().__init__(c1, c2, k=1, s=1, g=1, act=True)
  26. c_ = c2 // 2
  27. self.shuf = nn.Conv2d(c_ * 2, c2, 1, 1, 0, bias=False)
  28. def forward(self, x):
  29. x1 = self.cv1(x)
  30. x2 = torch.cat((x1, self.cv2(x1)), 1)
  31. # normative-shuffle, TRT supported
  32. return nn.ReLU(self.shuf(x2))
  33. class GSBottleneck(nn.Module):
  34. # GS Bottleneck https://github.com/AlanLi1997/slim-neck-by-gsconv
  35. def __init__(self, c1, c2, k=3, s=1, e=0.5):
  36. super().__init__()
  37. c_ = int(c2*e)
  38. # for lighting
  39. self.conv_lighting = nn.Sequential(
  40. GSConv(c1, c_, 1, 1),
  41. GSConv(c_, c2, 3, 1, act=False))
  42. self.shortcut = Conv(c1, c2, 1, 1, act=False)
  43. def forward(self, x):
  44. return self.conv_lighting(x) + self.shortcut(x)
  45. class DWConv(Conv):
  46. # Depth-wise convolution class
  47. def __init__(self, c1, c2, k=1, s=1, act=True): # ch_in, ch_out, kernel, stride, padding, groups
  48. super().__init__(c1, c2, k, s, g=math.gcd(c1, c2), act=act)
  49. class GSBottleneckC(GSBottleneck):
  50. # cheap GS Bottleneck https://github.com/AlanLi1997/slim-neck-by-gsconv
  51. def __init__(self, c1, c2, k=3, s=1):
  52. super().__init__(c1, c2, k, s)
  53. self.shortcut = DWConv(c1, c2, k, s, act=False)
  54. class VoVGSCSP(nn.Module):
  55. # VoVGSCSP module with GSBottleneck
  56. def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
  57. super().__init__()
  58. c_ = int(c2 * e) # hidden channels
  59. self.cv1 = Conv(c1, c_, 1, 1)
  60. self.cv2 = Conv(c1, c_, 1, 1)
  61. # self.gc1 = GSConv(c_, c_, 1, 1)
  62. # self.gc2 = GSConv(c_, c_, 1, 1)
  63. # self.gsb = GSBottleneck(c_, c_, 1, 1)
  64. self.gsb = nn.Sequential(*(GSBottleneck(c_, c_, e=1.0) for _ in range(n)))
  65. self.res = Conv(c_, c_, 3, 1, act=False)
  66. self.cv3 = Conv(2 * c_, c2, 1) #
  67. def forward(self, x):
  68. x1 = self.gsb(self.cv1(x))
  69. y = self.cv2(x)
  70. return self.cv3(torch.cat((y, x1), dim=1))
  71. class VoVGSCSPC(VoVGSCSP):
  72. # cheap VoVGSCSP module with GSBottleneck
  73. def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
  74. super().__init__(c1, c2)
  75. c_ = int(c2 * 0.5) # hidden channels
  76. self.gsb = GSBottleneckC(c_, c_, 1, 1)
  77. ###################### slim-neck-by-gsconv #### end ###############################

 

  GSConv+Slim Neck  加入yolo.py

 

  1. args = [c1, c2, *args[1:]]
  2. if m in {BottleneckCSP, C3, C3TR, CNeB, C3Ghost, C3x, C2f, VoVGSCSP, VoVGSCSPC}:
  3. args.insert(2, n) # number of repeats
  4. n = 1

 

  1. if m in {
  2. Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, MixConv2d, Focus, CrossConv,
  3. BottleneckCSP, C3, C3TR, C3SPP, C3Ghost, CNeB, nn.ConvTranspose2d, DWConvTranspose2d, C3x, C2f,CARAFE, GSConv, VoVGSCSP, VoVGSCSPC}:

 

配置 yaml文件

GSConv-yolov5s.yaml

  1. # YOLOv5 声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
    推荐阅读
    相关标签