- 论文:https://arxiv.org/pdf/2402.13616.pdf
- HuggingFace Demo:https://hf-mirror.com/spaces/kadirnar/Yolov9
- Github:https://github.com/WongKinYiu/yolov9
由台北中研院和台北科技大学等机构的研究团队推出的新的目标检测算法,一作Wang Chien-Yao也是Yolov4、Yolov7的作者之一,之前在Alexey Bochkvoskiy(Yolov4的第一作者)的团队中。
1 论文核心内容
YOLOv9是在YOLOv7的基础上进行的改进,指出现有方法存在如下的2个问题
- 现有方法都是关注如何设计一个更好的损失函数,而一个好的网络结构可以获取更多的信息以提升预测效果;
- 现有方案忽略了在一层一层的特征提取中会损失大量信息的问题;
针对以上两个问题,论文的解决方案(创新点)主要有以下2点:
- 提出了一个轻量级的网络结构:Generalized Efficient Layer Aggregation Netwwork(GELAN)
- 提出PGI(programmable gradient information):解决网络随着深度的增加,损失大量信息的问题。
1.1 GELAN
GELAN = RepCSPNet + ELAN
RepConv[1]^:通过结构参数化思想,让训练网络的多路结构在推理时转换为单路结构,以节省内存并提高前向处理速度。
source:Ding X et al.
将ELAN中的卷积组,替换成带有RepConv的CSPNet,相当于增加网络的宽度。这种增加网络宽度的方式看似可以增加梯度流,但是损失了卷积的连贯性,这对于板端部署来说是不友好的,会增加耗时。
1.2 PGI(programmable gradient information)
PGI:一种附属的监督框架(auxiliary supervision framework),用于在训练时提供更多的、更有效的监督信息,推理时该部分会被忽略。包含3个部分:
- 主分支:main branch,推理过程只用主分支,因此不会增加额外的计算;
- 附属可逆分支:auxiliary reversible branch,解决网络深度带来的信息丢失问题;
- 多级附属信息:multi-level auxiliary information,解决深度监督带来的错误累积问题,尤其是这种多预测分支的网络结构;
1.2.1 Auxiliary Reversible Branch
其实就是YOLOv7[2]里面辅助头的变种,YOLOv7中复用原网络提取的特征图:
source:Wang C Y et al.
YOLOv9直接从输入开始,搭建了跟主干网络类似的网络结构,使用辅助分支自己提取的特征来预测目标,从而计算辅助loss。在训练时相当于增加了一倍的权重,因此训练时间也会随着增加。
1.2.2 Multi-level Auxiliary Information
YOLOv7在计算辅助头时,使用的特征图是独立的,而YOLOv9是融合了多种特征图之后再计算辅助头的输出,详细见下一章的网络结构图。
2 网络结构详解
- GELAN就是中的RepNCSPELAN,将原始ELAN中的卷积组换成带有RepConv的CSPNet block;
- CBFuse就是文中提到的Multi-level Auxiliary Information,将不同的层的特征图通过上采样到同一尺寸后再相加,再输出预测结果;
- 网络的输出与YOLOv8[3]类似的解耦头,有类别和box分支,其中box不是直接进行边界框回归,而是将回归任务转化成分类任务。
解耦头解释:
source:Openmmlab
BBOX分支中,4表示anchor点到上下左右4个边界的距离,每个距离对应一个长度为reg_max的向量,reg_max一般设置为16。在网络预测完成后,将向量进行softmax,得到权重,这些权重再与[0,1,2,…, 15]进行加权,得到anchor点到4个边界的距离,从而得到预测框的信息。
source:Zhi Tian et al.
3 正负样本匹配策略与损失函数
3.1 正负样本匹配策略
样本匹配依旧使用的是TaskAlign样本匹配。和YOLOv8、YOLOv6等算法保持一致;TaskAlignedAssigner的匹配策略就是:根据分类与回归的分数加权的分数去选择正样本。
t
=
s
a
∗
u
b
t = s^{a}*u^{b}
t=sa∗ub
针对每一个gt,其中s是每个anchor点对应的gt类别的分类置信度,u是每个anchor点对应预测的目标框与gt的IoU,a,b表示外部配置的指数,两者相乘就可以衡量对齐程度alignment metrics。再直接基于对齐程度选取topk作为正样本。
3.2 损失函数
- 分类损失:BCE Loss
- 回归损失:DFL Loss + CIoU Loss
4 耗时评估与初步使用建议
4.1 AX650耗时
作者:圈圈虫
链接:https://www.zhihu.com/question/645376390/answer/3406848125
YOLOv9-c在ax650单帧平均耗时26ms。 YOLOv9-C是第三大的模型,稍微小一点的模型M,S相较于v8并没有显著的优势。
4.2 其他评价
作者:JerryFxckingWong
链接:https://www.zhihu.com/question/645376390/answer/3409418697
bilibili上一位up在vis drone做的实验结果:
- 训练时间翻倍,论文中提到的监督方式基本上多了一倍的网络结构
- 同规模下推理时间增加(由于split操作的引入)
用split的方式看似丰富了所谓的梯度流,减少了参数量,但是大大增加了推理的时间,尤其对于端设备来说,这会导致推理的各种不连续性。
4.3 总体评价
- 相较于之前的YOLOv8,YOLOv9指标并没有显著的提升;
- v9以牺牲耗时为代价,换来部分指标提升,整体网络结果对于板端部署并不友好,耗时可能会相较于项目中使用的模型会偏高;
- 在耗时允许范围内,使用YOLOv9,相同量级参数下,指标可能会好一些,需要在实际业务上测试。
5 参考资料
[1] Ding X, Zhang X, Ma N, et al. Repvgg: Making vgg-style convnets great again[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2021: 13733-13742.
[2] Wang C Y, Bochkovskiy A, Liao H Y M. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 7464-7475.
[3] YOLOv8:https://github.com/ultralytics/ultralytics/tree/main