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:
BN:
其中,bn.mean为均值(对应nn.BatchNorm2d中的running_mean),bn.var为方差(对应nn.BatchNorm2d中的running_var),和分别对应nn.BatchNorm2d中的weight和bias,对应nn.BatchNorm2d中的eps。
推理阶段,可将Conv和BN进行相应的合并计算,同时需要将参数进行重新的映射。具体如下。
如上,其中组成了新的weight,组成了新的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)就已经比较简单明了了。