yolov5从V1.0到V6.2网络变化梳理

最近在学yolov5的网络结构,发现不同的人描述yolov5的网络结构并不同,有的说是C3模块有的说是BottleneckCSP,这给我一个小白带来了很大困扰。查询了很多文章终于在一篇文章中有博主提到,yolov5新版本用C3代替了BottleneckCSP。所以为了搞清楚yolov5的具体网络结构,在这里把所有的版本结构记录下来,以便之后的学习理解与查看。

在这里插入图片描述

v1.0版本如下
backbone主要模块:Focus、Conv、BottleneckCSP、SPP
head主要模块:BottleneckCSP、Conv、nn.Upsample、Concat、nn.Conv2d

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, BottleneckCSP, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, BottleneckCSP, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, BottleneckCSP, [512]],
   [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
  ]

# YOLOv5 head
head:
  [[-1, 3, BottleneckCSP, [1024, False]],  # 9

   [-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, BottleneckCSP, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, BottleneckCSP, [256, False]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]],  # 18 (P3/8-small)

   [-2, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, BottleneckCSP, [512, False]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]],  # 22 (P4/16-medium)

   [-2, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, BottleneckCSP, [1024, False]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]],  # 26 (P5/32-large)

   [[], 1, Detect, [nc, anchors]],  # Detect(P5, P4, P3)
  ]

v2.0版本如下
backbone主要模块:Focus、Conv、BottleneckCSP、SPP
head主要模块:BottleneckCSP、Conv、nn.Upsample、Concat
v2.0与V1.0相比最大的区别就是少了nn.Conv2d模块,并且Detect指定为17, 20, 23层输出

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, BottleneckCSP, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, BottleneckCSP, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, BottleneckCSP, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, BottleneckCSP, [1024, False]],  # 9
  ]

# YOLOv5 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, BottleneckCSP, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, BottleneckCSP, [256, False]],  # 17

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, BottleneckCSP, [512, False]],  # 20

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, BottleneckCSP, [1024, False]],  # 23

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

V3.0与V3.1和V2.0相同,这里不放代码;

V4.0版本开始,作者开始用C3代替了BottleneckCSP,而其他的结构不变。C3结构作用基本相同均为BottleneckCSP架构,只是在修正单元的选择上有所不同,其包含了3个标准卷积层以及多个Bottleneck模块(数量由配置文件.yaml的n和depth_multiple参数乘积决定)

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, C3, [1024, False]],  # 9
  ]

# YOLOv5 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

一张图快速了解C3与BottleneckCSP区别(从别人那扒的,嘘):
在这里插入图片描述
V5.0版本也没有改变网络结构,这里不放代码;

v6.0版本将第0层的Focus替换成Conv,将SPP替换成SPPF;
ps:SPPF比SPP快了一倍时间yolov5 github上有代码验证,这里只放结果。
在这里插入图片描述

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

V6.1和V6.2版本与V6.0相同,这里不放代码;

总结
V1.0版本backbone主要模块:Focus、Conv、BottleneckCSP、SPP;head主要模块:BottleneckCSP、Conv、nn.Upsample、Concat、nn.Conv2d。
V2.0版本在V1.0版本基础上删去nn.Conv2d,并且Detect指定为17, 20, 23层输出。
V4.0版本用C3代替了BottleneckCSP,而其他的结构不变。
V6.0版本将第0层的Focus替换成Conv,将SPP替换成SPPF;

最后放一张V6.1版本网络结构图:(来自github官方)
在这里插入图片描述

引指出,可以通过从yolov5s.yaml复制yolov5llw.yaml并修改nc参数来实现训练.py的功能调试。而引用提到,如果没有配置文件,默认使用yolov5s.yml的配置文件,不同的yml文件只有depth_multiple和width_multiple不同,整体网络架构是一样的。速度方面,yolov5n>yolov5s>yolov5m>yolov5l>yolov5x;准确度方面,yolov5x>yolov5l>yolov5m>yolov5s>yolov5n。引用则指出,关于Yolov5的原理资料较多,而代码解释相对较少。下面是对Yolov5 v6.2的简要解释: Yolov5 v6.2是一种目标检测模型,它采用了一种基于深度学习的方法来识别和定位图像中的多个目标。该模型的基本原理是将输入图像通过卷积神经网络进行特征提取,然后利用一系列的卷积层和全连接层来预测每个目标的类别和位置。 具体来说,Yolov5 v6.2模型由主干网络和检测头组成。主干网络通常采用特殊设计的卷积层,用于提取图像特征。在Yolov5 v6.2中,主干网络使用了多个卷积层和池化层,以及一些特殊的卷积操作,如SPP(空间金字塔池化)和PAN(特征金字塔网络)。这些操作可以帮助提取不同尺度的特征,并提高模型对目标的感知能力。 检测头是Yolov5 v6.2模型的关键部分,它负责将主干网络提取的特征映射转换为目标的类别和位置预测。在Yolov5 v6.2中,检测头通常由一些卷积层和全连接层组成,用于对特征进行进一步处理和预测。通过对每个检测头输出进行解码和后处理,可以得到最终的目标检测结果。 总的来说,Yolov5 v6.2是一种高效准确的目标检测模型,具有较快的速度和较高的准确度。通过合理调整网络结构和参数,可以根据任务需求选择适合的模型版本。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [视觉学习笔记6——YOLOv5(v6.2)部署与代码理解](https://blog.csdn.net/qq_45848817/article/details/126342364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Yolov5 代码从入门到畅通(v6.2) 附代码注释](https://blog.csdn.net/weixin_47872288/article/details/127705212)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值