YOLOv11 模型结构解析:从 Backbone 到 Head 的完整拆解
YOLOv11 的结构,说白了就是三个大模块串在一起:Backbone(骨干网络)、Neck(颈部) 和 Head(检测头)。我刚开始接触 YOLO 系列时,总觉得这些名词很玄乎。后来做部署才发现,不理解结构,你连模型为什么慢都找不到原因。
这一章,咱们就把 YOLOv11 的骨架拆开来看。你想想看,一个模型从输入图片到输出检测框,中间到底发生了什么?
2.1 整体架构概览
先看一张整体流程图,我习惯把 YOLOv11 比作一个「信息漏斗」——图片从宽到窄,特征从粗到细,最后在 Head 里输出结果。
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 卷积,通道数减半,然后分成两半。
- 分支处理:一半直接传递(保留原始信息),另一半经过 n 个 Bottleneck 模块(每个 Bottleneck 包含两个 3×3 卷积)。
- 特征拼接:所有分支的输出在通道维度上拼接,再经过一个 1×1 卷积融合。
为什么 C2f 比原来的 C3 模块好?我举个例子。在 YOLOv5 的 C3 里,Bottleneck 的数量是固定的。而 C2f 允许你通过参数 n 控制 Bottleneck 的个数。n 越大,模型越深,感受野越大,但计算量也上去了。
2.2.2 SPPF 模块
SPPF(Spatial Pyramid Pooling Fast)是 YOLO 系列的老朋友了。它的作用是什么?说白了,就是让模型能同时看到「大目标」和「小目标」。
SPPF 的核心操作是 多尺度最大池化。它用 3 个 5×5 的池化核串联,等效于一个 13×13 的大池化核。这样做的好处是:
- 计算量小:3 个 5×5 池化的计算量远小于 1 个 13×13 池化。
- 感受野大:能捕捉到更大范围的上下文信息。
- 特征丰富:不同尺度的池化结果拼接在一起,相当于给模型提供了「多视角」的特征。
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 时筛选。
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 | 云端高精度 |
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 数量或者降低通道数,效果最明显。
2.6 本章小结
这一章我们把 YOLOv11 的结构拆了个底朝天。从 Backbone 的 C2f 和 SPPF,到 Neck 的 FPN+PAN,再到 Head 的解耦设计,每个模块都有它的设计哲学。