3. 模型结构解析
好,咱们直接进入正题。YOLOv11 的结构,说白了就是三个大块:Backbone(骨干网络)、Neck(颈部) 和 Head(检测头)。我刚开始接触这个系列时,总觉得结构图密密麻麻的,看久了就晕。后来我习惯把每个模块拆开,只看它输入输出是什么,参数量多少,这样心里就有底了。
这一章,咱们就掰开揉碎,把每个模块的细节、参数量和计算量都过一遍。你想想看,只有知道哪块“肉”多,剪枝时才知道从哪下刀。
3.1 Backbone:特征提取的“地基”
Backbone 的作用,就是把输入的图片(比如 640x640x3)变成一堆特征图。YOLOv11 的 Backbone 沿用了 CSPNet(Cross Stage Partial Network)的思想,但做了一些调整。
我个人习惯把 Backbone 分成几个阶段来看:
- Stem 层:一个卷积 + 一个卷积,快速把分辨率降下来,通道数升上去。
- Stage 1-4:每个 Stage 包含若干个 C2f 模块(Cross Stage Partial with 2 convolutions and feature fusion)。
- SPPF 层:空间金字塔池化,用来增大感受野。
关键点:YOLOv11 的 Backbone 输出三个尺度的特征图,分别对应下采样 8 倍、16 倍、32 倍。这三个输出会喂给 Neck 做进一步融合。
咱们来看一下各模块的参数量和计算量。以 YOLOv11n(nano 版本)为例:
| 模块名称 | 输入尺寸 | 输出尺寸 | 参数量 (Params) | 计算量 (GFLOPs) |
|---|---|---|---|---|
| Stem (Conv+Conv) | 640x640x3 | 320x320x32 | ~1.2K | ~0.5 |
| Stage 1 (C2f x 1) | 320x320x32 | 160x160x64 | ~8.5K | ~1.1 |
| Stage 2 (C2f x 2) | 160x160x64 | 80x80x128 | ~45.2K | ~2.9 |
| Stage 3 (C2f x 3) | 80x80x128 | 40x40x256 | ~210.5K | ~6.8 |
| Stage 4 (C2f x 1) | 40x40x256 | 20x20x512 | ~340.1K | ~5.4 |
| SPPF | 20x20x512 | 20x20x512 | ~262.7K | ~4.2 |
我的经验:Stage 3 和 Stage 4 是参数量的大头。如果你要做剪枝,这两个地方是重点关照对象。我曾经在一个项目中,把 Stage 4 的 C2f 模块从 1 个增加到 3 个,结果 mAP 只涨了 0.3%,但推理速度慢了 15%。得不偿失。
3.2 Neck:特征融合的“桥梁”
Neck 的作用,是把 Backbone 输出的多尺度特征图融合起来。YOLOv11 用的是 FPN + PAN 结构,也就是特征金字塔网络 + 路径聚合网络。
说白了,就是一条自上而下的路径(FPN)把语义信息传下去,一条自下而上的路径(PAN)把位置信息传上来。两条路径一结合,小目标和大目标都能检测得更好。
Neck 里主要包含两种模块:
- Upsample:上采样,把特征图放大。
- C2f 模块:和 Backbone 里的类似,但通道数不同。
- Conv:普通卷积,用来调整通道数。
咱们继续看参数量:
| 模块名称 | 输入尺寸 | 输出尺寸 | 参数量 (Params) | 计算量 (GFLOPs) |
|---|---|---|---|---|
| FPN Top-down Conv | 20x20x512 | 40x40x256 | ~131.6K | ~2.1 |
| FPN C2f (P4) | 40x40x256 | 40x40x256 | ~105.2K | ~1.7 |
| FPN Upsample + Conv | 40x40x256 | 80x80x128 | ~32.9K | ~0.5 |
| FPN C2f (P3) | 80x80x128 | 80x80x128 | ~52.6K | ~0.8 |
| PAN Bottom-up Conv | 80x80x128 | 40x40x256 | ~65.8K | ~1.1 |
| PAN C2f (N4) | 40x40x256 | 40x40x256 | ~105.2K | ~1.7 |
| PAN Bottom-up Conv | 40x40x256 | 20x20x512 | ~131.6K | ~2.1 |
| PAN C2f (N5) | 20x20x512 | 20x20x512 | ~210.5K | ~3.4 |
避坑指南:我曾经在剪枝时,一股脑把 Neck 里的 C2f 模块全剪了,结果模型精度直接掉了 5 个点。后来才发现,Neck 里的特征融合对精度影响很大,剪枝时要“温柔”一点,尤其是 PAN 路径上的模块。
3.3 Head:检测输出的“最后一公里”
Head 是模型的输出端。YOLOv11 的 Head 和之前版本不太一样,它采用了 解耦头(Decoupled Head) 的设计。
什么意思呢?就是把分类和回归任务分开,用不同的卷积层去处理。这样做的好处是,每个任务可以专注于自己的特征,精度更高。
Head 的结构很简单:
- 对 Neck 输出的三个特征图(P3、P4、P5),分别做一次卷积。
- 每个特征图输出两个分支:分类分支 和 回归分支。
- 分类分支输出类别概率,回归分支输出边界框坐标。
参数量如下:
| 模块名称 | 输入尺寸 | 输出尺寸 | 参数量 (Params) | 计算量 (GFLOPs) |
|---|---|---|---|---|
| Head Conv (P3) | 80x80x128 | 80x80x64 | ~8.2K | ~0.1 |
| Head Conv (P4) | 40x40x256 | 40x40x64 | ~16.4K | ~0.1 |
| Head Conv (P5) | 20x20x512 | 20x20x64 | ~32.8K | ~0.1 |
| 分类分支 (P3/P4/P5) | 80x80x64 | 80x80x80 | ~5.2K (每个) | ~0.03 (每个) |
| 回归分支 (P3/P4/P5) | 80x80x64 | 80x80x64 | ~4.1K (每个) | ~0.02 (每个) |
注意:Head 的参数量虽然不大,但计算量集中在高分辨率的特征图上(P3 是 80x80)。如果你要优化推理速度,可以考虑把 Head 的卷积层换成深度可分离卷积。
3.4 整体结构图
为了让你更直观地理解,我画了一张结构图。你可以看到数据是怎么从输入流到输出的。
3.5 整体参数量与计算量汇总
最后,咱们把整个模型加起来看看:
| 模块 | 参数量 (Params) | 占比 | 计算量 (GFLOPs) | 占比 |
|---|---|---|---|---|
| Backbone | ~868.2K | ~52% | ~20.9 | ~55% |
| Neck | ~735.4K | ~44% | ~13.4 | ~35% |
| Head | ~71.9K | ~4% | ~0.4 | ~1% |
| 总计 | ~1.68M | 100% | ~34.7 | 100% |
我的建议:看到这个表格,你应该明白了。Backbone 和 Neck 占了 96% 的参数量和 90% 的计算量。Head 虽然小,但它是输出端,剪枝时最好留到最后再动。我一般会先剪 Backbone 的 Stage 4,再剪 Neck 的 PAN 路径,最后才考虑 Head。