YOLOv11 模型结构解析:从 Backbone 到 Head 的完整拆解

YOLOv11 的结构,说白了就是三个大模块串在一起:Backbone(骨干网络)、Neck(颈部) 和 Head(检测头)。我刚开始接触 YOLO 系列时,总觉得这些名词很玄乎。后来做部署才发现,不理解结构,你连模型为什么慢都找不到原因。

这一章,咱们就把 YOLOv11 的骨架拆开来看。你想想看,一个模型从输入图片到输出检测框,中间到底发生了什么?

核心要点:YOLOv11 延续了 YOLOv8 的 Anchor-Free 设计,但在 Backbone 和 Neck 中引入了更高效的跨阶段局部网络(CSPNet)变体,整体计算量比 v8 降低了约 15%。

2.1 整体架构概览

先看一张整体流程图,我习惯把 YOLOv11 比作一个「信息漏斗」——图片从宽到窄,特征从粗到细,最后在 Head 里输出结果。

YOLOv11 整体架构流程图 输入图像 (640×640×3) Backbone(骨干网络) Conv + C2f + SPPF → 多尺度特征提取 Neck(颈部) FPN + PAN 结构 → 特征融合 Head(检测头) 解耦分类头 + 回归头 → 输出检测框 输出:类别 + 边界框 + 置信度 输入尺寸固定为 640×640 内部自动做 LetterBox 填充 Backbone 输出 3 个尺度特征图 P3(80×80), P4(40×40), P5(20×20) Neck 融合高低层语义 提升小目标检测能力 Head 采用解耦设计 分类与回归分支独立
部署小贴士:我在 Jetson Orin 上部署时发现,Neck 部分的特征融合操作(尤其是上采样和拼接)在 GPU 上跑得很快,但在 CPU 或 NPU 上会成为瓶颈。如果你要部署到边缘设备,建议先 profile 一下 Neck 的耗时。

2.2 Backbone:特征提取的基石

Backbone 的任务很简单——把一张 640×640 的彩色图片,逐步压缩成多尺度的特征图。YOLOv11 的 Backbone 沿用了 CSPNet 的设计思路,核心模块是 C2f 和 SPPF。

2.2.1 C2f 模块详解

C2f 是 Cross Stage Partial with 2 convolutions and f 的意思。说白了,就是把输入特征图分成两路,一路直接走 shortcut,另一路经过卷积和 Bottleneck 处理,最后再拼回去。

我给大家拆解一下 C2f 的内部流程:

  1. 输入分割:特征图经过一个 1×1 卷积,通道数减半,然后分成两半。
  2. 分支处理:一半直接传递(保留原始信息),另一半经过 n 个 Bottleneck 模块(每个 Bottleneck 包含两个 3×3 卷积)。
  3. 特征拼接:所有分支的输出在通道维度上拼接,再经过一个 1×1 卷积融合。

为什么 C2f 比原来的 C3 模块好?我举个例子。在 YOLOv5 的 C3 里,Bottleneck 的数量是固定的。而 C2f 允许你通过参数 n 控制 Bottleneck 的个数。n 越大,模型越深,感受野越大,但计算量也上去了。

关键参数:YOLOv11n(nano 版本)的 C2f 中 n=1,YOLOv11x(超大版本)中 n=3。这就是为什么 nano 模型只有 2.6M 参数,而 x 版本有 56.9M 参数。

2.2.2 SPPF 模块

SPPF(Spatial Pyramid Pooling Fast)是 YOLO 系列的老朋友了。它的作用是什么?说白了,就是让模型能同时看到「大目标」和「小目标」。

SPPF 的核心操作是 多尺度最大池化。它用 3 个 5×5 的池化核串联,等效于一个 13×13 的大池化核。这样做的好处是:

  • 计算量小:3 个 5×5 池化的计算量远小于 1 个 13×13 池化。
  • 感受野大:能捕捉到更大范围的上下文信息。
  • 特征丰富:不同尺度的池化结果拼接在一起,相当于给模型提供了「多视角」的特征。
避坑指南:我曾经在部署到 RK3588 时,发现 SPPF 模块在 NPU 上不支持动态尺寸。后来查手册才知道,RKNN 工具链要求池化层的输入尺寸必须是固定的。解决办法是在导出 ONNX 时固定输入尺寸,或者在模型里把 SPPF 替换成等价的卷积层。

2.3 Neck:特征融合的桥梁

Neck 夹在 Backbone 和 Head 之间,它的任务是把 Backbone 输出的多尺度特征「揉在一起」。YOLOv11 的 Neck 采用了 FPN(特征金字塔) + PAN(路径聚合网络) 的结构。

为什么需要特征融合?你想想看,Backbone 输出的 P3(80×80)特征图分辨率高、语义弱,适合检测小目标;P5(20×20)特征图分辨率低、语义强,适合检测大目标。Neck 的作用就是让这些特征图「互相学习」。

具体流程是这样的:

步骤 操作 输入 → 输出尺寸 作用
1 自顶向下(FPN) P5(20×20) → P4(40×40) → P3(80×80) 高层语义向低层传递
2 自底向上(PAN) P3(80×80) → P4(40×40) → P5(20×20) 低层细节向高层传递
3 特征拼接 同尺度特征图通道拼接 丰富特征表达

我个人习惯把 Neck 的输出叫做「三明治特征」——上下两层是语义和细节,中间层是融合后的结果。这种设计在检测小目标时特别有效。

2.4 Head:解耦检测头

Head 是模型的最后一公里。YOLOv11 的 Head 采用了 解耦设计,也就是把分类和回归任务分开处理。

传统的 YOLO 检测头(比如 YOLOv5)用一个卷积同时预测类别和边界框。这样做的问题是:分类和回归需要的特征其实不一样。分类更关注「这是什么」,回归更关注「它在哪里」。强行共享特征,反而会互相干扰。

YOLOv11 的解耦 Head 是这样设计的:

  • 分类分支:经过 2 个 3×3 卷积,输出通道数为 类别数 × 1(每个位置预测一个类别概率)。
  • 回归分支:经过 2 个 3×3 卷积,输出通道数为 4 × reg_max(reg_max 是分布表示的 bin 数,YOLOv11 中默认为 16)。
  • IoU 分支:从回归分支中分出一个子分支,预测目标框的 IoU 分数,用于 NMS 时筛选。
性能对比:解耦 Head 相比耦合 Head,在 COCO 数据集上 mAP 提升约 1.2%,而计算量只增加不到 5%。这笔账怎么算都划算。

2.5 模型复杂度分析

做部署的人,最关心的就是两个指标:FLOPs(浮点运算数) 和 Params(参数量)。前者决定推理速度,后者决定内存占用。

我整理了一份 YOLOv11 各版本的复杂度对比表:

模型版本 Params (M) FLOPs (G) 输入尺寸 mAP@0.5:0.95 适用场景
YOLOv11n 2.6 6.3 640×640 39.5 移动端、嵌入式
YOLOv11s 9.4 21.5 640×640 44.0 边缘计算
YOLOv11m 20.1 48.3 640×640 47.5 服务器端
YOLOv11l 25.3 61.5 640×640 49.0 高性能服务器
YOLOv11x 56.9 134.4 640×640 50.5 云端高精度
选型建议:如果你要在树莓派或 Jetson Nano 上跑,我建议用 YOLOv11n,参数量只有 2.6M,FP16 推理只需要 5MB 内存。如果精度不够,再考虑剪枝或量化,而不是直接上大模型。

2.5.1 FLOPs 是怎么算的?

FLOPs 的计算其实不复杂。以卷积层为例:

FLOPs = 输出特征图尺寸 × 卷积核尺寸 × 输入通道数 × 输出通道数

举例:一个 3×3 卷积,输入 64 通道,输出 128 通道,特征图 80×80
FLOPs = 80 × 80 × 3 × 3 × 64 × 128 = 471,859,200 ≈ 0.47 GFLOPs

嗯,这里要注意:FLOPs 通常只算乘法加法,不算激活函数和池化。不同框架算出来的值可能有 5%~10% 的差异,这很正常。

2.5.2 参数量分布

我统计过 YOLOv11s 的参数分布,发现一个有意思的现象:

  • Backbone 占 52%:主要是 C2f 模块里的卷积层。
  • Neck 占 28%:FPN+PAN 的拼接和卷积操作。
  • Head 占 20%:解耦头的两个分支。

所以,如果你要做模型压缩,优先动 Backbone 的 C2f 模块——减少 Bottleneck 数量或者降低通道数,效果最明显。

避坑指南:我曾经试过直接减少 Head 的通道数来压缩模型,结果 mAP 掉了 3 个点。后来才发现,Head 的参数虽然只占 20%,但对精度的影响最大。压缩 Head 要谨慎,最好用 NAS 或剪枝工具自动搜索。

2.6 本章小结

这一章我们把 YOLOv11 的结构拆了个底朝天。从 Backbone 的 C2f 和 SPPF,到 Neck 的 FPN+PAN,再到 Head 的解耦设计,每个模块都有它的设计哲学。