发布时间:2023-04-28 文章分类:WEB开发, 电脑百科 投稿人:王小丽 字号: 默认 | | 超大 打印

YOLOv5-6.0版本的Backbone主要分为Conv模块CSPDarkNet53(C3)SPPF模块

一、yolov5

CSPNet被提出的主要目的是为了保证在模型检测和识别精度没有下降的情况下,减少计算量,提高推理速度。它的主要思想是通过分割梯度流,使梯度流通过不同的网络路径传播。通过拼接和过渡等操作,从而实现更丰富的梯度组合信息。

  1. CSP组件 (5.0版本)

yolov5 VS yoloX VS yolov8
  1. C3组件 (6.0版本)

yolov5 VS yoloX VS yolov8
  • 相对CSP,C3结构经过残差模组Resunit后少了一个卷积层, 直接连到了Concat,正好只有3个CBS,或者说只有3个卷积,可能才叫C3(CSP有4个),并且C3中的残差模组,有的地方也叫BottleNeck1(CSP中的残差模组也叫BottleNeck)

  • 通过C3替换CSP,可以起到精简网络结构,减少计算量,降低模型推理时间的作用。作者在项目的updated result里有说明,这样操作在YOLOV5X上模型参数量可以从89M下降到87.7M,推理时间从6.9ms下降到6.0ms,mAP从49.2提升到50.1。

  • C3模块不会改变通道数

class C3(nn.Module):
# CSP Bottleneck with 3 convolutions
def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
super().__init__()
c_ = int(c2 * e)  # hidden channels
self.cv1 = Conv(c1, c_, 1, 1)
self.cv2 = Conv(c1, c_, 1, 1)
self.cv3 = Conv(2 * c_, c2, 1)  # optional act=FReLU(c2)
self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))
def forward(self, x):
return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))

二、yolox

yolov5 VS yoloX VS yolov8

就是C3

yolov5 VS yoloX VS yolov8

三、yolov8

“依旧是CSP的思想,不过C3模块被替换成了C2f模块,实现了进一步的轻量化”

这里的轻量化有歧义,模型参数确实变多了

选用梯度流更丰富的C2f结构替换了YOLOv5中的C3结构,为了轻量化也缩减了骨干网络中最大stage的blocks数,同时不同缩放因子N/S/M/L/X的模型不再是共用一套模型参数,M/L/X大模型还缩减了最后一个stage的输出通道数,进一步减少参数量和计算量。

详细看yolov8s.yaml

梯度流分支的概念:

可以是任何之前你学习过的模块,比如,美团提出的YOLOv6中就是用来重参模块RepVGGBlock来替换BottleNeck Block来作为主要的梯度流分支,而百度提出的PP-YOLOE则是使用了RepResNet-Block来替换BottleNeck Block来作为主要的梯度流分支。而YOLOv7则是使用了ELAN Block来替换BottleNeck Block来作为主要的梯度流分支。

yolov5 VS yoloX VS yolov8

C2f模块就是参考了C3模块以及ELAN的思想进行的设计,让YOLOv8可以在保证轻量化的同时获得更加丰富的梯度流信息

实验对比

主题: 1、测试c2f 2、以及GSconv和GhostConv 轻量化

统一配置 data是 helmet.yaml 数据集用的7581 cfg在下面每个子标题中都有

1、yolov5-6.1 (baseline) cfg:yolov5s_hat.yaml 在这个配置文件中学习了各个参数的使用

yolov5 VS yoloX VS yolov8
yolov5 VS yoloX VS yolov8

2

真相大白 迪菲赫尔曼是把yolov8s的backbone换了过来, 相比yolov5s的6.1 除了c2f 还有些微不同 即实验2.1

但是消融实验为了对比c3和c2f 要严格控制变量 即实验2.2

2.1 baseline+c2f 按照csdn的来 他改了c2f还有别的东西 cfg:yolov5s_hat_c2f.yaml

yolov5 VS yoloX VS yolov8
yolov5 VS yoloX VS yolov8

2.2 baseline+c2f (只改了c2f cfg:yolov5s_hat_c2f2.yaml 严格控制变量

yolov5 VS yoloX VS yolov8
yolov5 VS yoloX VS yolov8

3.1 ghost

在最新版本的YOLOv5-6.1源码中,作者已经加入了Ghost模块,并在models/hub/文件夹下,给出了yolov5s-ghost.yaml文件,因此直接使用即可。

cfg:yolov5s_hat_ghost.yaml

yolov5 VS yoloX VS yolov8
yolov5 VS yoloX VS yolov8
yolov5 VS yoloX VS yolov8

3.2 #backbone和原版一致 neck加入了GhostConv和c3Ghost

cfg:yolov5s_hat_ghost_slimneck.yaml

yolov5 VS yoloX VS yolov8
yolov5 VS yoloX VS yolov8

3.3 已删除 因为当初的VoVGSCSP有问题

3.4

cfg:slimneck-yolov5s_test2

yolov5 VS yoloX VS yolov8

exp9

3.5 cfg: yolov5s_hat_ghost_test2.yaml 和3.4参数居然一样

yolov5 VS yoloX VS yolov8
yolov5 VS yoloX VS yolov8

3.4和3.5是为了对比gsconv和ghostconv

3.6 cfg:lintest1.yaml c3但是gs cheap (是我自己尝试的cheap

yolov5 VS yoloX VS yolov8
yolov5 VS yoloX VS yolov8

3.7cfg: lintest2.yaml c3但是gs 详情去看common中的源码

yolov5 VS yoloX VS yolov8
yolov5 VS yoloX VS yolov8

和3.6对比 发现 对精度几乎不变

3.8 cfg:lintest3 GSConv VoVGSCSP 作者官方

yolov5 VS yoloX VS yolov8
yolov5 VS yoloX VS yolov8

3.9 cfg: lintest4 GSConv VoVGSCSPC 作者官方

yolov5 VS yoloX VS yolov8
yolov5 VS yoloX VS yolov8

3.10 cfg: lin-attention-test1.yaml 在3.9的基础上加入了3ca

yolov5 VS yoloX VS yolov8

没训练完 效果不咋地 下降了

参考:

YOLOv5-v6.0学习笔记 - 古月居 (guyuehome.com)

yolov5原理 (dgrt.cn)

如何看待YOLOv8,YOLOv5作者开源新作,它来了!? - 知乎 (zhihu.com)

(75条消息) YOLO v8详解_樱花的浪漫的博客-CSDN博客

(75条消息) YOLOv5/v7 引入 YOLOv8 的 C2f 模块_迪菲赫尔曼的博客-CSDN博客

(76条消息) 【YOLOV5-5.x 源码解读】yolov5s.yaml_满船清梦压星河HK的博客-CSDN博客_yolov5s.yaml

个人收藏夹 gsconv_slimneck