目标检测算法——YOLOV9——算法详解

本文介绍了两项创新:PGI通过理论分析设计的可逆分支,以及GELAN在保持参数效率的同时提升模型轻量化。这些改进使得YOLOv9在目标检测任务上超越现有实时检测器。然而,实际实现与论文描述存在一些差距,建议谨慎看待目前的开源版本。
摘要由CSDN通过智能技术生成

一、主要贡献

        深度网络输入数据在逐层进行特征提取和空间变换时,会丢失大量的信息。针对 信息丢失问题,研究问题如下:
        1)从可逆功能的角度对现有深度神经网络架构进行了理论分析,解释了许多过去难以解释的现象,设计了PGI 辅助可逆分支,可以用于各种深度的网络,并取得了出色的结果。
        2)同时考虑了参数数量、计算复杂性、准确性和推理速度,设计的GELAN只使用传统卷积,以实现比基于最先进技术的深度卷积设计更高的参数使用率,同时显示出轻量、快速和准确的巨大优势。
        3)结合所提出的PGI和GELAN,设计了YOLOv9在MS COCO数据集上的目标检测性能在各个方面大大超过了现有的实时目标检测器。

PS

        截止20240416 的git 代码实现:
        1)作者仅仅开源了c和e模型的配置文件,而且只有两个head,共计6个输出头,和论文的9头几乎对不上。
        2)所谓的PGI作者解释的很学术范,实现就是复制一个backbone,然后结合辅助分支,感觉这个pgi的故事,其实就是两个不同大小的模型互相蒸馏,然后推理可以只保留某个(或大或小)的主分支。
        3)关于GELAN的创新,主要就是ELAN的拓展,允许把里面最简单的CNN,套娃换为CSPNet等。
        4)后文那个可视化(不同backbone的随机初始化权重得到的结果就能证明信息保留程度),我是真的没有看懂,首先网络都没有下采样,网络的结构是什么样的?其次我自己的拙见,也有人在issue中提问,这里的丢失信息和网络本来的拟合目标的能力有正相关吗?拟合过程本身也是一个统计并去冗余过程。
        综上,个人目前建议大概看看论文就好,还是让子弹飞一飞吧,这个V9的名字靠这两个创新点+真正实现对不上文章感觉。。。。

二、主要思路

PGI

        整个PGI的结构论文提到如下图d. 关于PGI讲的故事这里简单用作者在git issue的一张图吧,因为实现其实就是另一个并行backbone+辅助分支,所以感觉看看就好。

GELAN

        就是ELAN的扩展,允许讲conv 变为任意模块,并验证有效性。

三、具体细节

    正真实现的时候,官方放出来了c 和 e 的模型,都并不是论文中的3个head 9个输出,也在issue中被大家追问(手动狗头),下面是有人画出的c对应的网络图(原作者链接: Summary of YOLOv9 Architecture · Issue #355 · WongKinYiu/yolov9 · GitHub )。
    如何来看网络,其实主要参考三个文件:
    2)模型实现文件: yolov9/models/yolo.py at main · WongKinYiu/yolov9 · GitHub 这里作者也实现了不同的类对应不同的分支头数,但是目前开源的代码实现了TripleDetect类,但是没有使用。
    3)loss文件: yolov9/utils/loss_tal_dual.py at main · WongKinYiu/yolov9 · GitHub 这里作者实现了三个loss:loss_tal.py、loss_tal_dual.py、oss_tal_triple.py
    再围观看一下GELAN的代码
class RepNCSPELAN4(nn.Module):
    # csp-elan
    def __init__(self, c1, c2, c3, c4, c5=1):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        self.c = c3//2
        self.cv1 = Conv(c1, c3, 1, 1)
        self.cv2 = nn.Sequential(RepNCSP(c3//2, c4, c5), Conv(c4, c4, 3, 1))
        self.cv3 = nn.Sequential(RepNCSP(c4, c4, c5), Conv(c4, c4, 3, 1))
        self.cv4 = Conv(c3+(2*c4), c2, 1, 1)

    def forward(self, x):
        y = list(self.cv1(x).chunk(2, 1))
        y.extend((m(y[-1])) for m in [self.cv2, self.cv3])
        return self.cv4(torch.cat(y, 1))

    def forward_split(self, x):
        y = list(self.cv1(x).split((self.c, self.c), 1))
        y.extend(m(y[-1]) for m in [self.cv2, self.cv3])
        return self.cv4(torch.cat(y, 1))

1、input

640*640,正常的预处理。

2、backbone

主要就是多了一条(或两条分支)backhone。
backbone使用了’RepNCSPELAN4 ‘模块。

3、neck & head

主要是增加了辅助头。

4、loss function

loss为DFL Loss + CIoU Loss,匹配策略为TaskAlign样本匹配,和YOLOv8、YOLOE、YOLOv6等算法保持一致。

5、trics

推理时可以去掉分支,见参考链接部分。

6、inference

测试阶段(非训练阶段)过程

四、结果

    1、与sota比较

    它比较好,也有网友做了性能和推理速度比较,目前看确实还是有优势的,所以后续持续关注。

    2、消融实验

    GELAN
        PGI
    
    GELAN & PGI
    

    可视化
  

参考链接

  • 32
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
YOLOv8是一种基于深度学习的目标检测算法,是YOLO(You Only Look Once)系列的最新版本。它在YOLOv4的基础上进行了改进和优化,提供了更好的检测性能和速度。 YOLOv8的源码详解可以从以下几个方面进行说明: 1. 网络结构:YOLOv8使用了Darknet-53作为主干网络,由53个卷积层组成,用于提取图像特征。在主干网络后面连接了多个特征金字塔层(FPN),用于多尺度目标检测。 2. 检测头:YOLOv8使用了三个检测头,分别对应不同尺度的目标检测。每个检测头都由一个卷积层和一个全连接层组成,用于预测边界框的位置和类别。 3. 损失函数:YOLOv8使用了YOLO系列常用的损失函数——多尺度损失函数,包括定位损失、置信度损失和分类损失。通过最小化这些损失函数,可以使得模型在目标检测中表现更好。 4. 数据预处理:在源码中,会对输入图像进行一系列的预处理操作,包括图像缩放、填充、归一化等。这些操作可以使得输入图像符合模型的输入要求,并提高检测的准确性。 5. 推理过程:在源码中,会对输入图像进行前向传播,得到目标检测的结果。这一过程中,会经过网络的多个层级,使用卷积和池化等操作提取图像特征,并通过检测头预测边界框的位置和类别。 需要注意的是,YOLOv8的源码可能会有不同的实现版本,具体的细节和实现方式可能有所差异。如果你想详细了解YOLOv8的源码,建议查阅相关的论文和开源代码,以便更好地理解算法的实现原理和细节。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TigerZ*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值