YOLOv8: 多任务统一新时代

代码: github.com/ultralytics/ultralytics
作者: Ultralytics (2023年1月)
特点: ❌ 无正式论文,但标志着 Anchor-Free + 多任务统一 时代


历史性转变

YOLOv5 YOLOv8
锚框 Anchor-Based Anchor-Free
Head 耦合 Head 解耦 Head
任务 仅检测 检测 + 分割 + 分类 + 姿态
C3 模块 C3 (CSP Bottleneck) C2f (Fast CSP)

网络架构

整体结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
输入 640×640×3

┌─────────────────────────────┐
│ Backbone: CSPDarknet + C2f │
│ P1→P2→P3→P4→P5 (5阶段) │
│ SPPF (快速金字塔池化) │
└──────────┬──────────────────┘

┌─────────────────────────────┐
│ Neck: C2f + 上采样 + Concat │
│ FPN: P5→P4→P3 (自上而下) │
│ PAN: P3→P4→P5 (自下而上) │
└──────────┬──────────────────┘

┌─────────────────────────────┐
│ Head: Decoupled Anchor-Free │
│ 分类分支 (BCE Loss) │
│ 回归分支 (CIoU + DFL Loss) │
└─────────────────────────────┘

C2f vs C3

1
2
3
4
C3 (v5):    Conv → Bottleneck×N → Conv + 直通 → Concat → Conv

C2f (v8): Conv → [split] → Bottleneck×N → 全部Concat → Conv
└── 每个Bottleneck的输出都保留!

优势: C2f 保留了更多中间梯度信息,特征更丰富。

Anchor-Free Head

1
2
3
4
5
6
传统 Anchor-Based Head:
→ 预测 tx, ty, tw, th (相对于锚框的偏移)

YOLOv8 Anchor-Free Head:
→ 直接预测 bbox 左上角和右下角的偏移
→ 每个位置预测:「这个点是否是目标中心」+「框的边界」

好处:

  • 不需要预设锚框尺寸(自动适配任意长宽比)
  • 减少超参数
  • NMS 更简单高效

多任务统一

YOLOv8 的核心架构同一 Backbone+Neck,仅切换 Head:

1
2
3
4
              ┌──→ Detect Head   → 目标检测
Backbone + ─┼──→ Segment Head → 实例分割
Neck ┼──→ Pose Head → 姿态估计
└──→ Classify Head → 图像分类
任务 模型命名 示例
检测 yolov8n.pt model = YOLO("yolov8n.pt")
分割 yolov8n-seg.pt model = YOLO("yolov8n-seg.pt")
分类 yolov8n-cls.pt model = YOLO("yolov8n-cls.pt")
姿态 yolov8n-pose.pt model = YOLO("yolov8n-pose.pt")

DFL Loss(Distribution Focal Loss)

YOLOv8 在回归分支引入 DFL,将边界框位置建模为离散概率分布而非单一数值。

思想: 边界框的每条边不是精确的一个值,而是一个概率分布。

$$\text{DFL}(S_i, S_{i+1}) = -((y_{i+1}-y)\log(S_i) + (y-y_i)\log(S_{i+1}))$$

总回归损失:
$$\mathcal{L}{reg} = \mathcal{L}{CIoU} + \lambda \cdot \mathcal{L}_{DFL}$$


模型变体

变体 参数量 mAP (COCO) 适用
yolov8n 3.2M 37.3% Nano,移动端
yolov8s 11.2M 44.9% Small
yolov8m 25.9M 50.2% Medium,通用
yolov8l 43.7M 52.9% Large
yolov8x 68.2M 53.9% X-Large,极致

实战: 2行代码跑推理

1
2
3
4
5
6
7
from ultralytics import YOLO

# 加载预训练模型
model = YOLO("yolov8n.pt")

# 推理
results = model("image.jpg", save=True, conf=0.5)

实战: 训练自己的数据集

1
2
3
4
from ultralytics import YOLO

model = YOLO("yolov8n.pt") # 加载预训练权重
model.train(data="data.yaml", epochs=100, imgsz=640)

📦 完整教程见 [[30.resources/yolo-master/docs/Hands_on_YoLo_with_ultralytics/0-dog-breed-detection/README|狗品种检测入门教程]]


相关链接

  • 📝 [[YOLO 系列总览]]
  • 📝 [[YOLO 核心概念]]
  • 📝 [[YOLOv5 详解]]
  • 📦 [[30.resources/yolo-master/docs/Hands_on_YoLo_with_ultralytics/0-dog-breed-detection/README|YOLOv8 狗品种检测]]
  • 📦 [[30.resources/yolo-master/docs/Hands_on_YoLo_with_ultralytics/1-DOTA-obb/README|YOLOv11 OBB 进阶]]