论文链接: YOLOv9: Learning What You Want to Learn Using Programmable Gradient
YOLOv9是由Chien-Yao Wang、I-Hau Yeh和Hong-Yuan Mark Liao共同提出的新一代目标检测系统,它是YOLO(You Only Look Once)算法系列的最新版本。YOLO系列算法以其速度快和准确性高而闻名,在实时目标检测领域有着广泛的应用。YOLOv9在前代版本的基础上进行了显著的改进,旨在解决深度学习中信息丢失的问题,并提高模型在各种任务上的性能。
YOLOv9的核心创新
-
可编程梯度信息(PGI):YOLOv9引入了PGI,这是一种辅助监督框架,用于解决深度学习模型中信息丢失的问题。PGI通过辅助可逆分支生成可靠的梯度信息,这些信息用于网络权重的更新,从而提高模型在复杂任务上的性能。
-
通用高效层聚合网络(GELAN):YOLOv9提出了GELAN,这是一种新型轻量级网络架构,它基于梯度路径规划,优化了信息流动和参数利用,减少了计算资源的需求,同时保持或提高了检测精度。
-
信息瓶颈缓解:YOLOv9通过PGI和GELAN的结合,有效减少了数据在传输过程中的信息损失,使模型能够更准确地学习到目标任务所需的特征。
-
多级辅助信息:PGI还包括多级辅助信息,它整合了不同预测头的梯度信息,帮助主分支学习到更全面的语义信息,提高模型对各种目标的检测能力。
-
损失函数的创新:YOLOv9在损失函数方面进行了创新,包括多种IoU损失函数的改进和变体,如CIoU、DIoU等,以及融合了“Focus”思想的一系列新损失函数,这些损失函数针对特定的目标检测挑战进行优化。
YOLOv9的性能评估
根据论文中的实验结果,YOLOv9在MS COCO数据集上的表现超越了之前的YOLO系列版本以及其他一些实时目标检测器。YOLOv9在准确性、参数效率、计算复杂度和推理速度方面都取得了显著的提升,是一个在多个方面都具有竞争力的目标检测模型,特别适用于需要实时处理的应用场景。
YOLOv9网络结构
YOLOv9配置文件
# YOLOv9
# parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
#activation: nn.LeakyReLU(0.1)
#activation: nn.ReLU()
# anchors
anchors: 3
# YOLOv9 backbone
backbone:
[
[-1, 1, Silence, []],
# conv down
[-1, 1, Conv, [64, 3, 2]], # 1-P1/2
# conv down
[-1, 1, Conv, [128, 3, 2]], # 2-P2/4
# elan-1 block
[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 3
# conv down
[-1, 1, Conv, [256, 3, 2]], # 4-P3/8
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 5
# conv down
[-1, 1, Conv, [512, 3, 2]], # 6-P4/16
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 7
# conv down
[-1, 1, Conv, [512, 3, 2]], # 8-P5/32
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 9
]
# YOLOv9 head
head:
[
# elan-spp block
[-1, 1, SPPELAN, [512, 256]], # 10
# up-concat merge
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 7], 1, Concat, [1]], # cat backbone P4
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 13
# up-concat merge
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 5], 1, Concat, [1]], # cat backbone P3
# elan-2 block
[-1, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 16 (P3/8-small)
# conv-down merge
[-1, 1, Conv, [256, 3, 2]],
[[-1, 13], 1, Concat, [1]], # cat head P4
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 19 (P4/16-medium)
# conv-down merge
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 22 (P5/32-large)
# routing
[5, 1, CBLinear, [[256]]], # 23
[7, 1, CBLinear, [[256, 512]]], # 24
[9, 1, CBLinear, [[256, 512, 512]]], # 25
# conv down
[0, 1, Conv, [64, 3, 2]], # 26-P1/2
# conv down
[-1, 1, Conv, [128, 3, 2]], # 27-P2/4
# elan-1 block
[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 28
# conv down fuse
[-1, 1, Conv, [256, 3, 2]], # 29-P3/8
[[23, 24, 25, -1], 1, CBFuse, [[0, 0, 0]]], # 30
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 31
# conv down fuse
[-1, 1, Conv, [512, 3, 2]], # 32-P4/16
[[24, 25, -1], 1, CBFuse, [[1, 1]]], # 33
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 34
# conv down fuse
[-1, 1, Conv, [512, 3, 2]], # 35-P5/32
[[25, -1], 1, CBFuse, [[2]]], # 36
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 37
# detect
[[31, 34, 37, 16, 19, 22], 1, DualDDetect, [nc]], # DualDDetect(A3, A4, A5, P3, P4, P5)
]