YOLOv5-6.0版本的Backbone主要分为Conv模块、CSPDarkNet53(C3)和SPPF模块。
一、yolov5
CSPNet被提出的主要目的是为了保证在模型检测和识别精度没有下降的情况下,减少计算量,提高推理速度。它的主要思想是通过分割梯度流,使梯度流通过不同的网络路径传播。通过拼接和过渡等操作,从而实现更丰富的梯度组合信息。
-
CSP组件 (5.0版本)
-
C3组件 (6.0版本)
-
相对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
就是C3
三、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来作为主要的梯度流分支。
C2f模块就是参考了C3模块以及ELAN的思想进行的设计,让YOLOv8可以在保证轻量化的同时获得更加丰富的梯度流信息
实验对比
主题: 1、测试c2f 2、以及GSconv和GhostConv 轻量化
统一配置 data是 helmet.yaml 数据集用的7581 cfg在下面每个子标题中都有
1、yolov5-6.1 (baseline) cfg:yolov5s_hat.yaml 在这个配置文件中学习了各个参数的使用
2
真相大白 迪菲赫尔曼是把yolov8s的backbone换了过来, 相比yolov5s的6.1 除了c2f 还有些微不同 即实验2.1
但是消融实验为了对比c3和c2f 要严格控制变量 即实验2.2
2.1 baseline+c2f 按照csdn的来 他改了c2f还有别的东西 cfg:yolov5s_hat_c2f.yaml
2.2 baseline+c2f (只改了c2f cfg:yolov5s_hat_c2f2.yaml 严格控制变量
3.1 ghost
在最新版本的YOLOv5-6.1源码中,作者已经加入了Ghost模块,并在models/hub/文件夹下,给出了yolov5s-ghost.yaml文件,因此直接使用即可。
cfg:yolov5s_hat_ghost.yaml
3.2 #backbone和原版一致 neck加入了GhostConv和c3Ghost
cfg:yolov5s_hat_ghost_slimneck.yaml
3.3 已删除 因为当初的VoVGSCSP有问题
3.4
cfg:slimneck-yolov5s_test2
exp9
3.5 cfg: yolov5s_hat_ghost_test2.yaml 和3.4参数居然一样
3.4和3.5是为了对比gsconv和ghostconv
3.6 cfg:lintest1.yaml c3但是gs cheap (是我自己尝试的cheap
3.7cfg: lintest2.yaml c3但是gs 详情去看common中的源码
和3.6对比 发现 对精度几乎不变
3.8 cfg:lintest3 GSConv VoVGSCSP 作者官方
3.9 cfg: lintest4 GSConv VoVGSCSPC 作者官方
3.10 cfg: lin-attention-test1.yaml 在3.9的基础上加入了3ca
没训练完 效果不咋地 下降了
参考:
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