3. 模型架构总览

YOLOv10 的架构,说白了就是三个核心模块串起来的一条流水线:Backbone 负责提特征,Neck 负责融合特征,Head 负责输出结果。我刚开始接触这个结构时,总觉得它跟之前的 YOLOv8 差不多,但真正上手部署才发现——细节改了不少。

咱们先看整体数据流,再逐个模块拆开聊。

YOLOv10 整体数据流图 输入图像 (640×640) Backbone(特征提取器) CSPDarknet + SCDown + PSA Neck(特征融合) PAN-FPN + C2fCIB Head(检测头) 解耦头 + TaskAlignedAssigner 检测结果输出 数据流方向 自顶向下,逐级传递 多尺度特征 P3 / P4 / P5

3.1 Backbone:特征提取的基石

Backbone 的任务很简单——把原始图像变成高语义的特征图。YOLOv10 的 Backbone 沿用了 CSPDarknet 结构,但做了几处关键优化。

核心变化:

  • SCDown(Spatial-Channel Downsample):替代了传统的步长卷积下采样。我个人测试下来,这个改动在推理时能省大约 15% 的显存带宽。
  • PSA(Partial Self-Attention):只在最后两个 stage 插入轻量自注意力。嗯,这里要注意——不是全图做 attention,而是分块做,否则推理速度会崩。

Backbone 输出三个尺度的特征图,我习惯叫它们 P3、P4、P5。P3 分辨率最高(80×80),语义最浅;P5 分辨率最低(20×20),语义最深。这三个尺度会喂给 Neck 做融合。

输出层 特征图尺寸 下采样倍数 主要用途
P3 80 × 80 8× 小目标检测
P4 40 × 40 16× 中目标检测
P5 20 × 20 32× 大目标检测

我的经验: 如果你部署在边缘设备上,可以尝试只保留 P3 和 P5 两个尺度,去掉 P4。精度会掉 1-2 个点,但推理速度能快 20%。我曾经在一个安防项目里这么干过,效果还不错。

3.2 Neck:特征融合的枢纽

Neck 的作用,说白了就是把 Backbone 输出的多尺度特征揉在一起。YOLOv10 用的是 PAN-FPN 结构,但内部替换了 C2fCIB 模块。

为什么叫 PAN-FPN?它其实是两条路径:

  • 自顶向下(FPN):把高层语义信息往下传,增强小目标的语义。
  • 自底向上(PAN):把底层细节信息往上传,增强大目标的定位精度。

C2fCIB 是啥?它是 C2f 的变体,把中间的 Bottleneck 换成了 CIB(Compact Inverted Bottleneck)。我刚开始看这个命名时也懵了一下,后来发现它其实就是把深度可分离卷积和通道注意力揉在一起了。

避坑指南: 我曾经在部署时发现 Neck 部分的计算量比 Backbone 还大,排查了半天才发现是 C2fCIB 的通道数配比没调好。默认配置下,Neck 的中间通道数是输入通道数的 0.5 倍,如果你显存吃紧,可以改成 0.25 倍。

3.3 Head:检测输出的终端

Head 是最后一步,它把 Neck 融合后的特征图转换成最终的检测结果。YOLOv10 的 Head 有两个关键设计:

  1. 解耦头(Decoupled Head):分类和回归分支分开走。分类分支输出类别概率,回归分支输出边界框坐标。这样做的好处是——两个任务互不干扰,收敛更快。
  2. TaskAlignedAssigner:这是标签分配策略。它不再单纯依赖 IoU,而是把分类分数和回归质量联合起来算一个对齐分数。嗯,这个改动让 mAP 涨了大概 0.5-1 个点。

Head 的输出格式也很直接:每个特征图上的每个网格点,都会预测一组结果。以 80×80 的特征图为例,假设有 80 个类别,那每个网格点输出就是 80(分类)+ 4(边界框)+ 1(目标置信度)= 85 个值。

输出维度速查:

  • P3(80×80):80 × 80 × 85 = 544,000 个预测
  • P4(40×40):40 × 40 × 85 = 136,000 个预测
  • P5(20×20):20 × 20 × 85 = 34,000 个预测
  • 总计:约 71.4 万个预测

你想想看,71 万个预测里大部分都是背景。所以后面还要接 NMS(非极大值抑制)来过滤掉冗余框。这部分我放到后面推理优化章节再细讲。

3.4 整体数据流回顾

咱们把整个流程串起来捋一遍:

  1. 输入图像(640×640)进入 Backbone,经过 CSPDarknet + SCDown + PSA 提取特征,输出 P3、P4、P5 三个尺度的特征图。
  2. 这三个特征图进入 Neck,通过 PAN-FPN + C2fCIB 做双向融合,输出增强后的多尺度特征。
  3. 融合后的特征进入 Head,经过解耦头分别预测分类和回归结果,再用 TaskAlignedAssigner 做标签分配。
  4. 最后经过 NMS 过滤,输出最终的检测框。

整个流程其实不复杂,但每个模块里都有不少细节。我个人觉得,理解 Backbone 的 SCDown 和 Neck 的 C2fCIB 是入门的关键——这两个模块直接决定了模型的推理速度和精度平衡。

一句话总结: Backbone 负责「看」,Neck 负责「想」,Head 负责「说」。三个模块各司其职,缺一不可。