3. 模型架构总览
YOLOv10 的架构,说白了就是三个核心模块串起来的一条流水线:Backbone 负责提特征,Neck 负责融合特征,Head 负责输出结果。我刚开始接触这个结构时,总觉得它跟之前的 YOLOv8 差不多,但真正上手部署才发现——细节改了不少。
咱们先看整体数据流,再逐个模块拆开聊。
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 有两个关键设计:
- 解耦头(Decoupled Head):分类和回归分支分开走。分类分支输出类别概率,回归分支输出边界框坐标。这样做的好处是——两个任务互不干扰,收敛更快。
- 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 整体数据流回顾
咱们把整个流程串起来捋一遍:
- 输入图像(640×640)进入 Backbone,经过 CSPDarknet + SCDown + PSA 提取特征,输出 P3、P4、P5 三个尺度的特征图。
- 这三个特征图进入 Neck,通过 PAN-FPN + C2fCIB 做双向融合,输出增强后的多尺度特征。
- 融合后的特征进入 Head,经过解耦头分别预测分类和回归结果,再用 TaskAlignedAssigner 做标签分配。
- 最后经过 NMS 过滤,输出最终的检测框。
整个流程其实不复杂,但每个模块里都有不少细节。我个人觉得,理解 Backbone 的 SCDown 和 Neck 的 C2fCIB 是入门的关键——这两个模块直接决定了模型的推理速度和精度平衡。
一句话总结: Backbone 负责「看」,Neck 负责「想」,Head 负责「说」。三个模块各司其职,缺一不可。