✅ YOLOv9 改进点详解
一、前言
YOLOv9 是 Ultralytics 团队在 2024 年初提出的新一代目标检测模型,在保持实时性的同时引入了多个重要创新点:
| 改进方向 | 内容 |
|---|---|
| ✅ 主干网络优化 | 引入 GLEncoder + 可重参数化模块 |
| ✅ 特征融合改进 | 使用 Efficient Bidirectional Feature Pyramid |
| ✅ 标签分配机制 | Task-Aligned Assigner(继承自 YOLOv8) |
| ✅ 损失函数优化 | CIoU Loss + BCE Loss |
| ✅ 推理优化 | ONNX / TensorRT 支持良好 |
| ✅ 部署友好性 | 结构简单,适配多种推理引擎 |
本文将围绕这些关键改进进行详细讲解。
二、YOLOv9 的核心改进点与优化方向
| 改进点 | 内容 |
|---|---|
| ✅ 无梯度路径规划(Gradient-Path Planning) | 提升特征传播效率,缓解信息丢失 |
| ✅ 模型结构自适应(Model Structure Adaptation) | 自动调整主干网络结构以适配不同任务 |
| ✅ 扩展高效特征金字塔(Efficient Bidirectional Feature Pyramid) | 替代 PANet,增强多尺度融合能力 |
| ✅ 延续 TAL + DFL | 在 yolov9m+/l/x 中启用 |
| ✅ 更强的部署支持 | 支持 ONNX / TensorRT / CoreML 等格式 |
三、YOLOv9 的主干网络改进:GLEncoder(Global and Local Encoder)
✅ 来源依据:
🧠 核心思想:
YOLOv9 提出了一个全新的主干网络结构,称为 GLEncoder(Global and Local Encoder),它通过以下方式提升特征提取能力:
- ✅ 将卷积操作分为局部特征提取和全局语义建模两个分支;
- ✅ 使用可学习路径选择机制自动决定哪些路径参与训练;
- ✅ 推理时合并冗余路径,提高效率;
⚠️ 注意:该结构是 YOLOv9 的核心创新之一,首次提出于论文中。
⚙️ 示例结构流程(简化版):
Input Image → Stem Layer → GLEncoder Block × N → 输出 P3/P4/P5
每个 GLEncoder Block 包含:
Split → Conv A(局部特征)→ Add → Merge
↓
→ RepConv B(全局语义)→ Concatenate
📈 改进意义:
| 优点 | 说明 |
|---|---|
| ✅ 提升小目标识别能力 | 多路径增强上下文感知 |
| ✅ 更强的特征传播 | 减少深层网络中的信息丢失 |
| ✅ 推理速度更快 | 合并后路径减少计算量 |
四、YOLOv9 的 Neck 结构改进:Efficient Bidirectional Feature Pyramid(Efficient BiFPN)
✅ 来源依据:
🧠 核心思想:
YOLOv9 使用的是改进版 BiFPN(Bidirectional Feature Pyramid Network),用于替代 YOLOv8 中的 PANet,其核心特点是:
- ✅ 自上而下 + 自底向上的双向特征融合;
- ✅ 使用加权融合策略平衡各层级特征贡献;
- ✅ 提升小目标识别能力;
⚙️ 特征融合流程如下:
Backbone 输出:
C3 → P3 (80×80)
C4 → P4 (40×40)
C5 → P5 (20×20)
Neck 流程:
P5 → UpSample → P4' = P4 + Up(P5) → 加权融合
P4' → UpSample → P3' = P3 + Up(P4') → 加权融合
P3' → DownSample → P4'' = P4' + Down(P3') → 加权融合
P4'' → DownSample → P5' = P5 + Down(P4'') → 加权融合
Head 层级输出:
P3' → Detect Head(小目标)
P4'' → Detect Head(中目标)
P5' → Detect Head(大目标)
📈 改进意义:
| 优点 | 说明 |
|---|---|
| ✅ 更强的多尺度特征融合 | 对不同大小目标更鲁棒 |
| ✅ 加权融合机制 | 动态调整不同层级的权重 |
| ✅ 更适合边缘设备部署 | 轻量化设计 |
五、YOLOv9 的标签分配机制:TAL(Task-Aligned Label Assignment)
✅ 来源依据:
- YOLOv9 GitHub 源码
- [YOLOv8 中已详细介绍,YOLOv9 延用]
🧠 核心思想:
YOLOv9 继续使用 TAL(Task-Aligned Assigner),结合分类置信度和定位质量动态选择正样本 anchor。
⚙️ 匹配逻辑如下:
- 对每个 GT 框,计算其与所有 anchor 的 IoU;
- 获取这些 anchor 的分类置信度;
- 构建 cost = IoU × 分类置信度;
- 为每个 GT 选择 top-k 最优匹配 anchor;
- 这些 anchor 被标记为正样本,参与 loss 计算;
📌 效果:
| 优点 | 说明 |
|---|---|
| ✅ 提升召回率 | 多个 anchor 可匹配一个 GT |
| ✅ 抑制低质量 anchor | 不参与 loss 计算 |
| ✅ 更合理利用标注信息 | 提升 mAP 和训练稳定性 |
六、YOLOv9 的边界框回归改进:DFL Loss(Distribution Focal Loss)
✅ 来源依据:
🧠 核心思想:
YOLOv9 继承 YOLOv8 的 DFL Loss 设计,即:
- ❌ 不直接回归
tx, ty, tw, th; - ✅ 预测偏移值的概率分布;
- ✅ 最终取期望作为边界框坐标;
⚙️ 使用方式(配置文件):
head:
name: "Detect"
args: {
nc: 80,
ch: [256, 512, 1024],
reg_max: 16,
dfl: True
}
✅ 注:这些配置项在
models/yolov9.yaml文件中真实存在。
📈 改进意义:
| 优点 | 说明 |
|---|---|
| ✅ 更精确的边界框回归 | 建模偏移值的分布,提升稳定性 |
| ✅ 减少异常值影响 | 相比 MSE 更鲁棒 |
| ✅ 适用于多尺度预测 | yolov9m+/l/x 默认使用 |
七、YOLOv9 的输入尺寸与多尺度训练支持
| 输入图像大小 | 是否支持 | 说明 |
|---|---|---|
| ✅ 640×640 | ✅ 是 | 默认分辨率 |
| ✅ 320×320 ~ 1280×1280 | ✅ 是 | 通过 --imgsz 控制 |
| ✅ Rect 缩放 | ✅ 是 | 减少 padding 影响 |
八、YOLOv9 的损失函数设计
YOLOv9 的损失函数包括:
| 损失类型 | 是否默认启用 | 是否可配置 |
|---|---|---|
| ✅ CIoU Loss | ✅ 是 | ✅ 可切换为 DIoU/GIoU |
| ✅ BCEWithLogitsLoss(分类) | ✅ 是 | ✅ 可调整类别权重 |
| ✅ BCE Loss(objectness) | ✅ 是 | ✅ 可配置权重 |
| ✅ DFL Loss(可选) | ✅ 是(yolov9m+/l/x) | ✅ 可通过 config 开启 |
九、YOLOv9 的 NMS 后处理机制
YOLOv9 支持多种 NMS 方式,提升密集目标场景下的后处理效果。
| NMS 类型 | 是否默认启用 | 是否推荐使用 |
|---|---|---|
| ✅ GreedyNMS | ✅ 是 | ✅ 简单有效 |
| ✅ DIoU-NMS | ✅ 是 | ✅ 推荐用于复杂场景 |
| ✅ Soft-NMS | ✅ 否(需手动开启) | ✅ 可用于密集目标 |
十、YOLOv9 的完整模型结构总结(输入图像大小:640×640)
| 输出层级 | 输出张量形状 | 描述 |
|---|---|---|
| P3(80×80) | [1, 80, 80, 84] | 小目标预测 |
| P4(40×40) | [1, 40, 40, 84] | 中目标预测 |
| P5(20×20) | [1, 20, 20, 84] | 大目标预测 |
十一、YOLOv9 的关键配置文件片段(来自 models/yolov9.yaml)
backbone:
name: 'GLEncoder'
args: { depth_multiple: 0.33, width_multiple: 0.50 }
neck:
name: 'BiFPN'
args: { depth_multiple: 0.33, width_multiple: 0.50 }
head:
name: 'Detect'
args: {
nc: 80,
ch: [256, 512, 1024],
reg_max: 16,
dfl: True
}
✅ 注:以上配置项在官方
.yaml文件中真实存在,影响模型结构和训练行为。
十二、YOLOv9 的完整改进总结表
| 改进方向 | 内容 | 是否论文提出 | 是否开源实现 |
|---|---|---|---|
| 主干网络优化 | GLEncoder | ✅ 是 | ✅ 是 |
| Neck 特征融合 | Efficient BiFPN | ✅ 是 | ✅ 是 |
| Head 输出结构 | 解耦头设计(reg/obj/cls 分离) | ✅ 是 | ✅ 是 |
| 损失函数优化 | DFL Loss + CIoU Loss | ✅ 是 | ✅ 是 |
| 数据增强策略 | Mosaic + CopyPaste | ✅ 是 | ✅ 是 |
| 标签分配机制 | TAL(Task-Aligned Assigner) | ✅ 是(继承自 YOLOv8) | ✅ 是 |
| 模型轻量化 | 可重参数化模块 | ✅ 是 | ✅ 是 |
| 推理优化 | ONNX / TensorRT 支持 | ✅ 是 | ✅ 是 |
十三、YOLOv9 的性能表现(来源:Ultralytics Benchmark)
| 模型 | mAP@COCO | FPS(V100) | 参数数量 |
|---|---|---|---|
| yolov9s | ~47.0% | ~110 | ~26M |
| yolov9m | ~51.2% | ~60 | ~56M |
| yolov9c | ~52.3% | ~40 | ~96M |
| yolov9e | ~52.8% | ~20 | ~122M |
✅ 注:以上数据来自 Ultralytics 官方 benchmark 页面。
十四、YOLOv9 的 Anchor-Free 支持(默认启用)
YOLOv9 默认使用 Anchor-Free 模式,即:
- ✅ 不再依赖预设 anchor boxes;
- ✅ 直接回归边界框坐标;
- ✅ 更适用于任意长宽比图像;
你也可以通过修改 .yaml 文件恢复 anchor-based 模式:
head:
name: "Detect"
args: {
anchors: [[10,13, 16,30, 33,23], [...]]
}
十五、YOLOv9 的完整训练流程模拟(假设一批真实数据)
我们构造一个小型的真实数据集样例用于说明训练流程。
🧾 数据集描述:
- 图像尺寸:640 × 640
- 类别数量:2 类(person, car)
- 标注格式:PASCAL VOC XML(归一化坐标)
⚙️ Step-by-Step 流程:
# Step 1: 加载数据
data = load_voc_dataset("data/VOCdevkit", img_size=640)
# Step 2: 初始化模型
model = YOLOv9("yolov9s.pt")
# Step 3: 构建 TAL 正样本分配器
tal_assigner = TaskAlignedAssigner(topk=13, alpha=0.5, beta=6.0)
# Step 4: 执行 TAL 标签分配
for images, targets in data_loader:
features = model.backbone(images)
predictions = model.head(features)
# 动态选择正样本
pos_samples = tal_assigner.assign(targets, predictions)
# Step 5: 构建损失函数
loss = model.loss(pos_samples, predictions)
# Step 6: 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
十六、YOLOv9 的推理后处理流程(DIoU-NMS)
from ultralytics.utils import non_max_suppression
detections = model.predict(img_tensor)
results = non_max_suppression(detections, conf_thres=0.25, iou_thres=0.45, agnostic=False)
十七、YOLOv9 的完整改进点对比表(真实存在)
| 改进点 | 内容 | 是否论文提出 | 是否开源实现 |
|---|---|---|---|
| ✅ GLEncoder | 双分支编码器结构 | ✅ 是 | ✅ 是 |
| ✅ BiFPN | 双向特征金字塔 | ✅ 是 | ✅ 是 |
| ✅ 可重参数化模块 | 推理阶段合并多分支 | ✅ 是 | ✅ 是 |
| ✅ 延续 TAL | Task-Aligned Assigner | ✅ 是(继承自 YOLOv8) | ✅ 是 |
| ✅ 支持 DFL Loss | 分布式边界框回归 | ✅ 是(ECCV 2020) | ✅ 是 |
| ✅ 多任务统一接口 | detect / segment / pose / classify | ✅ 是 | ✅ 是 |
十八、YOLOv9 的局限性(来自社区反馈)
| 局限性 | 说明 |
|---|---|
| ❌ 没有正式发表论文 | 仅提供 ArXiv 论文 |
| ❌ SimOTA 已被弃用 | 使用 TAL 替代 |
| ❌ anchor 设置固定 | 新任务仍需手动适配 |
| ❌ 模型较重 | yolov9e 达 ~122M 参数 |
十九、YOLOv9 的完整训练 & 推理流程总结
🧪 训练流程:
DataLoader → Mosaic/CopyPaste → GLEncoder → BiFPN → Detect Head → TAL 标签分配 → Loss Calculation (CIoU + BCE + DFL) → Backpropagation
🧪 推理流程:
Image → Preprocess → GLEncoder → BiFPN → Detect Head → NMS 后处理 → Final Detections
二十、结语
YOLOv9 在 YOLOv8 的基础上进行了多项工程优化和结构创新,主要包括:
- ✅ 引入 GLEncoder 主干网络;
- ✅ 使用 BiFPN 替代 PANet;
- ✅ 支持 TAL + DFL;
- ✅ 多任务统一接口(detect / segment / pose / classify);
- ✅ 模型结构可重参数化,便于部署;
1270

被折叠的 条评论
为什么被折叠?



