4、YOLOv8模型架构解析:Backbone、Neck、Head与损失函数
YOLOv8 的架构,说白了就是三个核心模块的串联:Backbone 负责提特征,Neck 负责融合特征,Head 负责预测结果。再加上一个精心设计的损失函数,整个模型就能端到端地训练了。
我个人习惯把 YOLOv8 看作一个「特征加工流水线」—— 原料是图像,经过 Backbone 粗加工,Neck 精加工,最后 Head 包装成检测结果。下面我们逐个拆解。
4.1 Backbone:CSPDarknet 结构
YOLOv8 的 Backbone 沿用了 CSPDarknet 结构,但做了关键改进。它不再是简单的堆叠卷积,而是引入了 C2f 模块(Cross Stage Partial with 2 convolutions and fusion)。
为什么要用 C2f?我刚开始接触时也有这个疑问。后来在项目中对比发现,C2f 相比之前的 C3 模块,梯度流更丰富,特征复用效率更高。说白了,就是让信息在层与层之间「多跑几条路」,避免梯度消失。
Backbone 的典型结构如下(以 YOLOv8n 为例):
| 阶段 | 模块 | 输出尺寸 | 说明 |
|---|---|---|---|
| Stem | Conv (3x3, stride=2) | 320x320 | 下采样 + 通道扩展 |
| Stage 1 | C2f + Conv | 160x160 | 浅层特征,保留细节 |
| Stage 2 | C2f + Conv | 80x80 | 中等尺度 |
| Stage 3 | C2f + Conv | 40x40 | 深层特征,语义丰富 |
| Stage 4 | C2f + SPPF | 20x20 | 最大感受野,全局信息 |
4.2 Neck:FPN + PAN 结构
Neck 的作用是「特征融合」。YOLOv8 使用了 FPN(特征金字塔) + PAN(路径聚合网络) 的组合结构。
FPN 是自顶向下的路径,把高层的语义信息传递到底层。PAN 是自底向上的路径,把底层的定位信息传递到高层。两者结合,相当于给模型装了一个「双向对讲机」。
我记得第一次调参时,发现 Neck 的通道数对性能影响很大。YOLOv8 默认在 Neck 中保持通道数一致(比如 256 或 512),这样避免了信息瓶颈。
Neck 的输出是三个尺度的特征图:
- P3(80x80):负责小目标检测
- P4(40x40):负责中目标检测
- P5(20x20):负责大目标检测
为什么会是这三个尺度?你想想看,一张 640x640 的输入图,经过 5 次下采样后得到 20x20 的特征图,每个格子对应原图 32x32 的区域。对于大目标来说,这个粒度刚刚好。
4.3 Head:Decoupled Head(解耦头)
YOLOv8 最大的架构变化之一,就是用了 Decoupled Head。之前的 YOLOv5 用的是耦合头(一个卷积同时输出分类和回归),而 YOLOv8 把分类和回归分成了两个分支。
为什么要解耦?我在项目中遇到过这样的情况:分类和回归任务对特征的需求不同。分类更关注「是什么」,回归更关注「在哪里」。强行共享特征,反而会互相干扰。
- 分类分支:Conv → Conv → 输出 (num_classes)
- 回归分支:Conv → Conv → 输出 (4 * reg_max)
另外,YOLOv8 去掉了 Objectness 分支(即置信度分支)。这意味着每个格子默认就包含目标,不再需要额外判断「有没有目标」。这个改动简化了训练流程,也减少了冗余计算。
4.4 损失函数:Cls + Box + DFL
YOLOv8 的损失函数由三部分组成:
| 损失项 | 公式 | 作用 |
|---|---|---|
| 分类损失 (Cls) | BCE Loss | 判断目标类别 |
| 回归损失 (Box) | CIoU Loss | 优化边界框位置 |
| 分布损失 (DFL) | Cross Entropy | 学习边界框的分布 |
DFL(Distribution Focal Loss) 是 YOLOv8 引入的新东西。传统的回归是直接预测一个值(比如 x, y, w, h),而 DFL 把每个值看作一个离散分布。举个例子,预测框的左边距不再是单一数值,而是 16 个离散值的加权和。
这样做的好处是什么?我个人的理解是:DFL 让模型学会了「不确定性」。当目标遮挡严重或边界模糊时,DFL 的分布会更分散,模型知道「我不确定」。这在自动驾驶等安全关键场景中非常有用。
总损失公式如下:
Loss = λ_cls * L_cls + λ_box * L_box + λ_dfl * L_dfl
默认权重:λ_cls=0.5, λ_box=7.5, λ_dfl=1.5。这个比例是经过大量实验调出来的,一般不需要动。
4.5 整体架构流程图
下面我用一张 SVG 图把整个流程串起来,方便你理解数据是怎么流动的: