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 整体结构图

为了让你更直观地理解,我画了一张结构图。你可以看到数据是怎么从输入流到输出的。

YOLOv11 整体结构图 输入图像 (640x640x3) Backbone (Stem + C2f x 7 + SPPF) P3 (80x80) P4 (40x40) P5 (20x20) Neck (FPN + PAN) Head P3 Head P4 Head P5 检测结果 检测结果 检测结果 说明:Backbone 提取特征,Neck 融合多尺度信息,Head 输出检测结果。 剪枝时,优先考虑 Backbone 的 Stage 3/4 和 Neck 的 C2f 模块。

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。