yolov5 VS yoloX VS yolov8

YOLOv5-6.0版本的Backbone主要分为Conv模块CSPDarkNet53SPPF模块

一、yolov5

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

  1. CSP组件 (5.0版本)

yolov5 VS yoloX VS yolov8_第1张图片
  1. C3组件 (6.0版本)

yolov5 VS yoloX VS yolov8_第2张图片
  • 相对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_第3张图片

就是C3

yolov5 VS yoloX VS yolov8_第4张图片

三、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_第5张图片

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

实验对比

1、yolov5-6.1 (baseline)

yolov5 VS yoloX VS yolov8_第6张图片
yolov5 VS yoloX VS yolov8_第7张图片

2

yolov5 VS yoloX VS yolov8_第8张图片

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

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

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

yolov5 VS yoloX VS yolov8_第9张图片
yolov5 VS yoloX VS yolov8_第10张图片

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

yolov5 VS yoloX VS yolov8_第11张图片
yolov5 VS yoloX VS yolov8_第12张图片

3.1 ghost

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

yolov5 VS yoloX VS yolov8_第13张图片
yolov5 VS yoloX VS yolov8_第14张图片

Slim Neck

yolov5 VS yoloX VS yolov8_第15张图片

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

yolov5 VS yoloX VS yolov8_第16张图片
yolov5 VS yoloX VS yolov8_第17张图片

3下一步 调整卷积

解耦头

单独测试C2f模块

这个dwconv主要是为了降低卷积运算参数量。

注意! gsconv是slim中的 ghostconv才是原版

参考:

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

SPPF和SPP

你可能感兴趣的:(前端,人工智能,深度学习)