[卷积神经网络]YoloV9

一、概述

代码路径为:

YoloV9https://github.com/WongKinYiu/yolov9

YoloV9的作者在论文中指出:现在的深度学习方法大多都在寻找一个合适的目标函数,但实际上输入数据在进行特征提取和空间变换的时候会丢失大量信息 。针对这个问题,本文提出了一个可编程梯度信息(PGI),目标是提供完整的输入信息给目标函数,从而获得更可靠的权值来更新网络。

从上面的图片可以看出,传统骨干网络提供给目标函数的数据多多少少都存在丢失的情况。为了解决这个问题,通过辅助的可逆分支 生成可靠的梯度,使深度特征仍然可以保持执行目标任务的关键特征。基于上述理论,本文设计了一种基于梯度路径规划的轻量级网络结构:广义高效层聚合网络(GELAN)。

二、模型

1.可编程梯度信息(PGI)

本文提出了一种辅助监督框架,称为可编程梯度信息 (PGI),如上图(d)所示。PGI主要由三个部分组成:①主分支 (main branch);②辅助可逆分支 (auxiliary reversible branch);③多层次辅助信息(multi-level auxiliary information)。由于推理过程中,模型会仅使用主分支,因此并不需要付出额外的推理成本。

另外,上图所示的其他方法为:(a)路径聚合网络 (PAN);(b)可逆列 (RevCol);(c)常规深度监督(c)。

2.GELAN

GELAN(广义有效聚合网络)通过结合CSPNet和ELAN两种网络的结构,使用梯度路径规划设计。

如上图所示,通过模仿CSPNet,将ELAN扩展到GELAN中去。

三、实验

实验基于MS COCO 2017数据集进行,与几种经典算法进行比较。均以M型为例

|----------|--------|----------|------------|
| | 参数量(M) | 浮点计算量(G) | mAP@.50(%) |
| YoloV5-m | 21.2 | 49.0 | 45.4 |
| YoloV7-m | 36.9 | 104.7 | 51.2 |
| YoloV8-m | 25.9 | 78.9 | 50.2 |
| YoloV9-m | 20.0 | 76.3 | 51.4 |

可见,在精度相当的情况下,YoloV9比较显著的缩小了参数量(-49%)和浮点计算量(-43%),同时,相较于YoloV8拥有更高的精度。

四、模块解析

1.RepNCSPELAN4

python 复制代码
class RepNCSPELAN4(nn.Module):
    # csp-elan
    def __init__(self, c1, c2, c5=1):  # c5 = repeat
        super().__init__()
        c3 = int(c2 / 2)
        c4 = int(c3 / 2)
        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))

2.SPPELAN金字塔池化

python 复制代码
class SP(nn.Module):
    def __init__(self, k=3, s=1):
        super(SP, self).__init__()
        self.m = nn.MaxPool2d(kernel_size=k, stride=s, padding=k // 2)
 
    def forward(self, x):
        return self.m(x)
 
 
class SPPELAN(nn.Module):
    # spp-elan
    def __init__(self, c1, c2, c3):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        self.c = c3
        self.cv1 = Conv(c1, c3, 1, 1)
        self.cv2 = SP(5)
        self.cv3 = SP(5)
        self.cv4 = SP(5)
        self.cv5 = Conv(4*c3, c2, 1, 1)
 
    def forward(self, x):
        y = [self.cv1(x)]
        y.extend(m(y[-1]) for m in [self.cv2, self.cv3, self.cv4])
        return self.cv5(torch.cat(y, 1))
相关推荐
SQDN10 分钟前
Chatbox 1.22.1 获取不到模型?先验 /models,再对齐精确 model ID
人工智能·测试工具·机器学习·chatgpt·json
颜酱11 分钟前
08 | 把维度值同步到 Elasticsearch(生成阶段)
人工智能·python·langchain
小马哥crazymxm12 分钟前
Arxiv论文周选 (2026-W28)
论文阅读·人工智能·科技
ASKED_201913 分钟前
一文阐述国内网络环境下使用NIM方法
人工智能·系统架构
GlobalHRTalk14 分钟前
埃及名义雇主EOR业务概述与市场发展优势分析
大数据·运维·人工智能
董员外17 分钟前
RAG 系统进化论(二):Naive RAG,检索增强生成的最小闭环
前端·人工智能·后端
Zeeland18 分钟前
Agent 能完成一个任务,但它能持续追一个三个月的目标吗?
人工智能·github·openai
Sunlly19 分钟前
一次消息如何变成多步行动:拆开 OpenClaw 的 Agent Loop
人工智能
黄华SJ520it26 分钟前
甄味康商城系统开发|大健康新零售解决方案
人工智能·零售·系统开发
掘金一周35 分钟前
看看大家每月的成本有多少 | 沸点周刊 7.30
前端·人工智能·后端