YoloV8网络结构图
网络模块
- SPPF 模块
SPPF模块将SPP模块并行输入的最大池化调整为多个小卷积核的串行输入,可以有效减小网络的计算量,提升计算效率。 SPPF模块还避 免了对图像区域的裁剪,以及缩放操作导致的图像失真,实现局部特征和全局特征融合,完善目标的 特征信息。
- C2f 模块
受到ELAN模块的启发,YOLOv8 设计了更轻量化的C2f模块,引入更多的分支结构丰富梯度回传的支流,替换了YOLOv5中的C3模块,使模型变得更轻量化,从而获得更加丰富的梯度流信息。
三段式架构
- Backbone:主干特征提取
默认 Backbone 的层序非常清楚:Conv -> Conv -> C2f -> Conv -> C2f -> Conv -> C2f -> Conv -> C2f -> SPPF。其中 P3、P4、P5 三个主尺度特征分别在 1/8、1/16、1/32 下采样倍率处形成。
SPPF 仍然保留在 Backbone 末端,作用是扩大感受野并聚合上下文。YOLOv8 没有像某些后续模型那样大改末端金字塔池化,而是保留了这一块成熟设计。
- Neck:FPN + PAN 风格的双向融合
先上采样 + Concat 把高层语义往浅层传,再下采样 + Concat 把融合后的浅层细节回流到中高层,所以本质上就是 FPN/PAN 风格的双向特征融合。
P3/8 更偏小目标;
P4/16 更偏中目标;
P5/32 更偏大目标。
- Head:anchor-free 的分离式检测头
有两条主分支:cv2:box branch,输出 4 * reg_max;cv3:class branch,输出 nc。YOLOv8 检测头没有单独的 objectness 分支。 源码里 self.no = nc + self.reg_max * 4,不是旧 YOLO 常见的 nc + 5;训练损失里也是直接取 pred_scores 做分类 BCE,再配 box + dfl,没有单独的 obj loss 分支。
YOLOv8 的关键创新点
- anchor-based 转向 anchor-free
这是 YOLOv8 最核心的架构变化之一。官方对比页明确说,YOLOv8 的 anchor-free head 省去了手工 anchor 配置,并减少了框预测数量,从而让模型在自定义数据集上更稳,也会让后处理里的 NMS 更轻一些。YOLOv5/7 更像“基于预设框去修正”,YOLOv8 更像“直接在网格点上回归目标”。 这让迁移到新数据集时,少了一层“先配 anchor”的工程成本。
- 分离式 Head
YOLOv8 的 Head 不是单一输出卷积,而是把框回归和分类分开做。分离式 Head 的意义在于:
定位和分类本来就是两个优化目标,拆开后一般更容易收敛,也更利于后续针对不同分支做轻量化或导出优化。
- DFL 回归
当前 Detect 头默认 reg_max=16,所以每个位置的框分支先输出 4 * 16 = 64 个通道;随后在损失和解码里,通过 softmax 加权投影恢复成四个连续距离值,再通过 dist2bbox 解码为框。这意味着 YOLOv8 的框回归不是“直接回归 4 个数”,而是用离散分布去近似连续边距。这通常比直接回归更稳,尤其是在高精度定位场景里。
- 任务对齐分配
当前 v8DetectionLoss 默认使用 TaskAlignedAssigner,源码里默认参数是 topk=10、alpha=0.5、beta=6.0;而 TaskAlignedAssigner 的说明写得也很清楚:它用一个同时结合分类信息与定位信息 的 task-aligned metric 来做正负样本分配。这比“只按 IoU”或者“只按中心点”更像一种联合筛选:
既看你分得像不像,又看你框得准不准。
参考资料:
A Comprehensive Review of YOLO Architectures in Computer Vision: From YOLOv1 to YOLOv8 and YOLO-NAS
yolov8详细讲解,包括网络结构图、关键创新点、部署-CSDN博客