YOLOv9(2):YOLOv9网络结构

本文详细介绍了YOLOv9的网络结构,包括Slice层的作用,重参化技术在YOLOv5中的应用,以及ELAN高效层聚合网络的概念。重点解析了YOLOv9中的RepConvN、RepNBottleneck等组件和CBLinear、CBFuse结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 前言

本文仅以官方提供的yolov9.yaml来进行简要讲解。

讲解之前,还是要做一些简单的铺垫。

Slice层不做任何的操作,纯粹是做一个占位层。这样一来,在parse_model时,ch[n]可表示第n层的输出通道。

Detect和DDetect主要区别还是是否使用分组卷积。

RepConv(Re-Paramterization)老生常谈了,重参化,优化推理效率。

2. 重参化(re-parameter)

在讲YOLOv9的网络结构之前,有必要引入一下“重参化(re-parameter)”技术。重参化技术并不是YOLOv9提出的,相反,已经是一个用的相当广泛的技术。细心地朋友可以发现,其实YOLOv5中已经在fuse_conv中体现了。

重参化是一种从网络推理效率和性能方面出发,优化得到的网络结构。其基本思想是在训练时使用多分支(如多个Conv层),增加梯度反馈路径。在推理时进行融合,减小计算量,提高推理效率。

以Conv+BN为例,我们都了解,卷积层(Conv)实际上是一个y = ax+b的过程。

训练阶段,基本的操作包含两个部分。

Conv:

x=conv.weight*x+conv.bias

BN:

x=bn.\gamma *\frac{x_{i}-bn.mean}{\sqrt{bn.var+bn.\xi }}+bn.\beta

其中,bn.mean为均值(对应nn.BatchNorm2d中的running_mean),bn.var为方差(对应nn.BatchNorm2d中的running_var),bn.\gammabn.\beta分别对应nn.BatchNorm2d中的weight和bias,bn.\varepsilon对应nn.BatchNorm2d中的eps。

推理阶段,可将Conv和BN进行相应的合并计算,同时需要将参数进行重新的映射。具体如下。

x=\frac{bn.\gamma *conv.weight}{\sqrt{bn.var+bn.\varepsilon }}*x+\frac{bn.\gamma *conv.bias}{\sqrt{bn.var+bn.\epsilon }}+bn.\beta

如上,其中\frac{bn.\gamma *conv.weight}{\sqrt{bn.var+bn.\varepsilon }}组成了新的weight,\frac{bn.\gamma *conv.bias}{\sqrt{bn.var+bn.\epsilon }}+bn.\beta组成了新的bias。

3. ELAN

ELAN(Efficient layer aggregation network)高效层聚合网络,具体的说是一种网络结构设计策略,最早在论文Designing Network Design Strategies Through Gradient Path Analysis(https://arxiv.org/abs/2211.04800)被提出。

简单讲,在论文中,作者认为神经网络结构设计主要分为两种,分别是依据数据路径设计和依据梯度路径设计。

ELAN则是依据梯度路径设计策略进行相关的设计和优化,更具体的讲,ELAN侧重于最大化梯度源,丰富梯度路径。

当然,大家不要将这一部分过分解读,其实在以往的ResNet,CSPNet中,已经在实践这一策略了。

具体大家可以多参考其他博主的资源,如下链接就已经解释的很详细了:https://zhuanlan.zhihu.com/p/598642990?utm_id=0

4. YOLOv9中的组件

(1) RepConvN

先从forward中观察总体的流程,也即训练过程中的操作。在训练过程中的流程如下。

推理时,执行fuse_convs,此时会将conv1、conv2和进行重参化(re-parameter),转换成一个conv操作。

(2) RepNBottleneck

(3) RepNCSP

(4) RepNCSPELAN4

从名字上可以看出,该模块式一个Rep + CSP + ELAN的组合网络。Rep优化计算,CSP丰富梯度,ELAN做高效的特征聚合。

CSP:丰富组合、减少冗余、降低计算量。

需要说明的一点是,以上几张图仅仅是做一个大体的展示,在实际使用过程中会存在各种通道或分辨率上的计算。

(5) CBLinear

(6) CBFuse

CBFuse的上一级输入是CBLinear。CUFuse的每一次调用都是输入Tensor的一部分,并不是整个Tensor的聚合。

5. YOLOv9的网络架构

经过以上组件的简单介绍,YOLOv9(yolov9.yaml)就已经比较简单明了了。

### YOLOv5 网络架构图 VISIO 文件获取与绘制 #### 获取 VISIO 文件 对于希望获得 YOLOv5 的 VISIO 结构图文件,可以通过特定资源链接直接下载已有的 VISIO 文件。例如,在夸克网盘上存在一份由他人分享的 `yolov5-visio` 结构图[^3]。 #### 使用 VISIO 绘制 YOLOv5 架构图的方法 为了帮助理解如何利用 Microsoft Visio 创建 YOLOv5 的网络结构图表,以下是具体的操作指南: #### 准备工作 确保安装有 Microsoft Visio 或其他兼容软件版本。如果尚未拥有该工具,则需先完成安装过程。 #### 添加形状库 启动应用程序之后,选择适合表示神经元节点和连接线的基础图形组件加入绘图页面。通常情况下,“基本流程图”类别下的矩形、椭圆以及箭头样式能够满足大部分需求。 #### 建立基础框架 按照官方文档描述中的模块划分原则构建整体布局轮廓。YOLOv5 主要分为输入层、骨干特征提取部分(Backbone)、颈部设计(Neck),最后到达输出检测头部(Head)。每一级之间通过下采样操作逐步缩小空间尺寸的同时增加通道数目的表达能力[^1]。 #### 定义各层次细节 针对上述提到的不同组成部分进一步细化内部单元构成情况。比如 Backbone 中包含了 Focus 层用于增强边缘信息捕捉效率;而 CSPDarknet 则作为主体骨架负责传递多尺度语义特性给后续处理阶段。 Neck 设计里引入 SPP 和 PANet 来加强全局感受野范围并促进低高层特征交互融合效果。至于 Head 方面则集成了三个不同分辨率级别的预测分支来实现目标定位框回归及分类任务[^2]。 #### 连接各个部件 运用直线或曲线形式将相邻两层间的关系直观呈现出来。注意保持线条简洁明了不交叉缠绕以免造成视觉混乱感影响阅读体验。 #### 调整优化排版美观度 适当调整对象间距大小使得整个画面比例协调统一。可以考虑添加文字标注说明重要参数设定值以便于读者快速掌握核心要点。 ```visio // 此处为Visio伪代码示意,并非实际可执行代码 Page.AddShape("Rectangle", "Input Layer") // 输入层 Page.AddConnector("Arrow", "Focus Layer") // Focus层指向下一个组件 ... ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值