YOLOv11 模型结构解析:Backbone、Neck、Head 的核心组件与参数分布
聊到 YOLOv11 的模型结构,很多人第一反应就是“又改了”。确实,从 v5 到 v8 再到 v11,YOLO 系列的骨架一直在进化。但说实话,核心思路没变过——Backbone 负责提特征,Neck 负责融合特征,Head 负责输出预测。这个三板斧,你吃透了,后面做剪枝和量化才能知道刀往哪儿砍。
我个人习惯,拿到一个新模型,第一件事不是跑推理,而是先看它的结构图和参数分布。为什么?因为剪枝说白了就是“砍掉冗余的参数”,你连参数长在哪都不知道,怎么砍?
3.1 Backbone:特征提取的基石
YOLOv11 的 Backbone 延续了 CSPNet(Cross Stage Partial Network)的设计哲学。但 v11 做了一些关键调整,我直接说重点:
- Conv 模块:标准卷积 + BN + SiLU 激活。这是最基础的算子,也是参数量的大头。
- C2f 模块:这是从 v8 继承下来的核心模块。它把输入分成两路,一路直接过,另一路经过多个 Bottleneck 再拼接。v11 里 C2f 的 Bottleneck 数量做了调整,变得更“瘦”了。
- SPPF 模块:空间金字塔池化。用多个 5x5 的 MaxPool 串联,替代了原来的 SPP。效果差不多,但计算量小很多。
我遇到过不少新手,一上来就盯着 C2f 里的 Bottleneck 个数看。其实你更应该关注的是 通道数。Backbone 的通道数从 64 开始,逐层翻倍,到最后一层通常是 512 或 1024。这些通道数直接决定了模型的计算量和显存占用。
关键参数分布(以 YOLOv11n 为例)
| 层名 | 输入通道 | 输出通道 | 模块类型 | 参数量占比 |
|---|---|---|---|---|
| Conv1 | 3 | 16 | Conv + BN + SiLU | ~1% |
| C2f_1 | 16 | 32 | C2f (1 Bottleneck) | ~5% |
| Conv2 | 32 | 64 | Conv + BN + SiLU | ~2% |
| C2f_2 | 64 | 64 | C2f (2 Bottlenecks) | ~12% |
| Conv3 | 64 | 128 | Conv + BN + SiLU | ~4% |
| C2f_3 | 128 | 128 | C2f (2 Bottlenecks) | ~20% |
| Conv4 | 128 | 256 | Conv + BN + SiLU | ~8% |
| C2f_4 | 256 | 256 | C2f (2 Bottlenecks) | ~35% |
| SPPF | 256 | 256 | SPPF | ~13% |
看到没?C2f_4 和 C2f_3 这两个模块占了 Backbone 一半以上的参数量。你想想看,如果要做剪枝,这两个地方是不是重点关照对象?
3.2 Neck:特征金字塔与路径聚合
Neck 部分,YOLOv11 用的是 FPN + PAN 的结构。说白了就是两条路:
- 自顶向下(FPN):把高层语义信息传递到低层,让低层特征也能“看懂”大目标。
- 自底向上(PAN):把低层位置信息传递到高层,让高层特征也能“看清”小目标。
v11 在 Neck 里也用了 C2f 模块,但这里的 C2f 和 Backbone 里的不太一样。Neck 里的 C2f 通常 不改变通道数,只做特征融合。这一点很多文档没讲清楚,我当初也踩过坑。
我的经验:Neck 部分的参数量虽然不如 Backbone 多,但它的计算量(FLOPs)其实不小。因为特征图的分辨率在这里还是相对较高的。做量化的时候,Neck 里的 BN 层和激活函数是容易出问题的区域,尤其是 SiLU 激活,量化后精度掉得比较明显。
Neck 的输出是三个尺度的特征图,分别对应 P3(小目标)、P4(中目标)、P5(大目标)。这三个特征图会送到 Head 去做最终的预测。
3.3 Head:解耦检测头
YOLOv11 的 Head 采用了 解耦检测头(Decoupled Head) 的设计。什么意思呢?就是分类和回归分开走:
- 分类分支:预测每个 anchor 属于哪个类别。
- 回归分支:预测 bounding box 的坐标偏移。
每个分支由两个 Conv 层组成。第一个 Conv 把通道数降到 64(或 128,看模型大小),第二个 Conv 输出最终结果。这样做的好处是,分类和回归可以各自优化,互不干扰。
我记得有一次做剪枝实验,我把 Head 里的通道数从 64 砍到 32,结果 mAP 直接掉了 5 个点。后来才发现,Head 虽然参数量不大,但对精度极其敏感。所以我的建议是:剪枝优先动 Backbone 和 Neck,Head 尽量保持不动,或者只做微调。
避坑指南:我曾经在 Head 上做过一次激进的通道剪枝,结果模型直接不收敛了。后来排查发现,是因为回归分支的通道数太少,导致 bounding box 的预测方差太大。所以,如果你一定要动 Head,建议先做 逐层敏感性分析,看看哪一层对精度影响最小。
3.4 整体结构图与参数分布
下面这张图是我手绘的 YOLOv11 整体结构,你可以对照着看:
从图上可以清楚看到,数据流是从左到右的。Backbone 输出三个尺度的特征(P3、P4、P5),Neck 通过上采样和下采样把它们融合到一起,最后 Head 在每个尺度上独立做预测。
3.5 参数分布总结
最后,我整理了一份 YOLOv11 各版本的参数分布表。你可以在做剪枝时参考:
| 模型版本 | 总参数量 | Backbone 占比 | Neck 占比 | Head 占比 |
|---|---|---|---|---|
| YOLOv11n | ~2.6M | ~55% | ~30% | ~15% |
| YOLOv11s | ~9.4M | ~52% | ~32% | ~16% |
| YOLOv11m | ~25.1M | ~50% | ~33% | ~17% |
| YOLOv11l | ~53.2M | ~48% | ~34% | ~18% |
| YOLOv11x | ~97.8M | ~46% | ~35% | ~19% |
嗯,这里要注意一个趋势:模型越大,Backbone 的占比反而越低。为什么?因为大模型在 Neck 和 Head 里加了更多的通道和层数。所以,如果你用的是 YOLOv11x,剪枝的重点可以适当往 Neck 和 Head 倾斜。