YOLO11 全面笔记:从网络结构到训练、推理解码与源码阅读
YOLO11 全面笔记:从网络结构到训练、推理解码与源码阅读
阅读目标:看完这一篇后,能够回答 YOLO11 与 YOLOv8 的核心差异、各模块的作用、Anchor-Free 和 DFL 如何解码检测框、训练阶段如何分配正样本,以及源码应当按照什么顺序阅读。
本文重点介绍 Ultralytics 官方标准目标检测模型
yolo11.yaml。实例分割、姿态估计、旋转框检测和分类模型与检测模型共享部分思想,但任务头不同。
0. 一页结论:先建立整体印象
YOLO11 可以理解为:
YOLO11 = YOLOv8 的 Anchor-Free 检测框架 + Backbone 和 Neck 中大量 C2f → C3k2 + Backbone 末端 SPPF 后加入 C2PSA + 重新调整网络深度、宽度和最大通道数YOLO11 没有推翻 YOLOv8 的检测逻辑。下面这些核心机制仍然保留:
P3、P4、P5 三尺度检测 Anchor-Free:围绕网格参考点预测框 DFL:四条边的分布式回归 分类与回归分支解耦 Task-Aligned Assigner:训练阶段分配正负样本 标准推理流程:置信度筛选 + NMS最需要牢记的对比:
| 对比项 | YOLOv8 | YOLO11 |
|---|---|---|
| Backbone 主模块 | C2f | C3k2 |
| Neck 融合模块 | C2f | C3k2 |
| Backbone 末端 | SPPF | SPPF → C2PSA |
| 检测尺度 | P3、P4、P5 | P3、P4、P5 |
| 检测方式 | Anchor-Free | Anchor-Free |
| 框回归 | DFL | DFL |
| 标准推理后处理 | NMS | NMS |
一个措辞上的小纠正:不要说“主干网格部分换成了 C3k2”。更准确的说法是:
YOLO11 将 Backbone 和 Neck 中大量使用的 C2f 模块替换为 C3k2;网格通常用于描述 Detect Head 中的特征图参考点。
1. YOLO11 是什么?
YOLO11 是 Ultralytics 在 2024 年 9 月发布的一代 YOLO 系列模型。官方支持五类任务:
| 任务 | 常见权重文件 | 输出结果 |
|---|---|---|
| 目标检测 | yolo11n.pt | 水平检测框、类别、分数 |
| 实例分割 | yolo11n-seg.pt | 检测框、类别、实例掩膜 |
| 图像分类 | yolo11n-cls.pt | 整张图像的类别 |
| 姿态估计 | yolo11n-pose.pt | 关键点及其置信度 |
| 旋转框检测 | yolo11n-obb.pt | 带角度的旋转框 |
官方提供n、s、m、l、x五种规模。它们共享同一套整体骨架,但使用不同的深度、宽度和最大通道数配置。
需要注意:Ultralytics 没有为 YOLO11 单独发布正式研究论文。因此,学习 YOLO11 时,官方文档、官方 YAML 和源码比网上二次整理图更可靠。
2. 学习前需要掌握的基础词汇
2.1 Backbone、Neck 和 Detect Head
目标检测网络通常可以拆成三个部分:
输入图片 ↓ Backbone:提取不同层级的视觉特征 ↓ Neck:融合浅层细节和深层语义 ↓ Detect Head:预测类别和边界框Backbone 类似“视觉特征提取器”。浅层更容易捕获颜色、边缘和纹理;深层更容易理解目标整体结构和语义。
Neck 类似“信息交换枢纽”。它把高层语义传给浅层,也把浅层定位信息重新传回深层。
Detect Head 是最终预测模块。它接收 P3、P4、P5 三个尺度的融合特征,输出分类信息和边界框信息。
2.2 特征图、Stride 和 P3/P4/P5
假设输入图片为640 × 640:
| 特征层 | Stride | 特征图尺寸 | 位置数量 | 更擅长处理 |
|---|---|---|---|---|
| P3 | 8 | 80 × 80 | 6400 | 小目标 |
| P4 | 16 | 40 × 40 | 1600 | 中等目标 |
| P5 | 32 | 20 × 20 | 400 | 较大目标 |
总参考点数量为:
80 × 80 + 40 × 40 + 20 × 20 = 8400Stride 为 8 表示:特征图上相邻位置在输入图尺度上大约相隔 8 个像素。
3. YOLO11 总体网络结构图
假设输入尺寸为640 × 640 × 3,标准检测模型的数据流如下:
YOLO11 输入图片 640 × 640 × 3 │ ▼ ┌────────────────────────── Backbone ──────────────────────────┐ │ │ │ Conv, stride=2 → P1/2 │ │ 320 × 320 │ │ │ │ │ Conv, stride=2 → P2/4 │ │ 160 × 160 │ │ │ │ │ C3k2 │ │ │ │ │ Conv, stride=2 → P3/8 │ │ 80 × 80 ──────────────────────────────────────────┐ │ │ │ │ │ │ C3k2 │ │ │ │ │ │ │ Conv, stride=2 → P4/16 │ │ │ 40 × 40 ───────────────────────────────┐ │ │ │ │ │ │ │ │ C3k2 │ │ │ │ │ │ │ │ │ Conv, stride=2 │ → P5/32 │ │ │ 20 × 20 │ │ │ │ │ │ │ │ │ C3k2 │ │ │ │ │ │ │ │ │ SPPF │ │ │ │ │ │ │ │ │ C2PSA │ │ │ └────────┼───────────────────────────────┼───────────┼──────────┘ │ │ │ ▼ │ │ ┌──────────────────────────── Neck ─────────────────────────────┐ │ │ │ 深层 P5 │ │ │ │ │ ├─ Upsample │ │ ▼ │ │ 40 × 40 ── Concat ◄──────────────── Backbone P4 │ │ │ │ │ C3k2 │ │ │ │ │ ├─ Upsample │ │ ▼ │ │ 80 × 80 ── Concat ◄──────────────── Backbone P3 │ │ │ │ │ C3k2 ─────────────────────────────────────────────► 输出 P3 │ │ │ │ │ ├─ Conv, stride=2 │ │ ▼ │ │ 40 × 40 ── Concat ◄──────────────── 中间融合特征 │ │ │ │ │ C3k2 ─────────────────────────────────────────────► 输出 P4 │ │ │ │ │ ├─ Conv, stride=2 │ │ ▼ │ │ 20 × 20 ── Concat ◄──────────────── C2PSA 深层特征 │ │ │ │ │ C3k2 ─────────────────────────────────────────────► 输出 P5 │ └───┬──────────────────────────────────────────────────────────┘ │ ▼ Detect(P3, P4, P5) │ ▼ 边界框分布 + 类别分数 │ ▼ DFL 解码 → 置信度筛选 → NMS │ ▼ 最终检测结果概念上分为 Backbone、Neck 和 Detect Head。但在 Ultralytics 的 YAML 文件中,head:部分同时包含 Neck 的特征融合层和最后的Detect层。
4. 如何阅读yolo11.yaml
标准 YAML 中每一行通常采用下面的结构:
[from,repeats,module,args]含义如下:
| 字段 | 含义 | 示例 |
|---|---|---|
from | 输入来自哪一层 | -1表示上一层,[-1, 6]表示将上一层和第 6 层共同作为输入 |
repeats | 模块基础重复次数 | [ -1, 2, C3k2, ... ] |
module | 模块类型 | Conv、C3k2、SPPF、C2PSA、Concat、Detect |
args | 模块参数 | 输出通道数、卷积核大小、步长等 |
官方标准结构的核心可以概括为:
backbone:-Conv-Conv-C3k2-Conv# P3/8-C3k2-Conv# P4/16-C3k2-Conv# P5/32-C3k2-SPPF-C2PSAhead:-Upsample-Concat# 融合 Backbone P4-C3k2-Upsample-Concat# 融合 Backbone P3-C3k2# 输出 P3-Conv# 下采样-Concat-C3k2# 输出 P4-Conv# 下采样-Concat-C3k2# 输出 P5-Detect# Detect(P3, P4, P5)4.1 模型缩放参数
官方 YAML 为五个规模配置了不同缩放参数:
| 模型 | depth | width | max_channels |
|---|---|---|---|
| YOLO11n | 0.50 | 0.25 | 1024 |
| YOLO11s | 0.50 | 0.50 | 1024 |
| YOLO11m | 0.50 | 1.00 | 512 |
| YOLO11l | 1.00 | 1.00 | 512 |
| YOLO11x | 1.00 | 1.50 | 512 |
可以这样理解:
depth:控制模块重复次数 width:控制通道数 max_channels:限制最大通道数同一套 YAML 会根据规模参数生成不同大小的网络。
5. 以 YOLO11n 为例,逐层看尺寸变化
下面的通道数按照官方 YAML 与YOLO11n的width=0.25推导。输入图片假设为640 × 640。
| 层号 | 模块 | 输入来源 | 输出尺寸 | 作用 |
|---|---|---|---|---|
| 0 | Conv | 输入图像 | 320 × 320 × 16 | 第一次下采样 |
| 1 | Conv | 0 | 160 × 160 × 32 | 第二次下采样 |
| 2 | C3k2 | 1 | 160 × 160 × 64 | 提取浅层特征 |
| 3 | Conv | 2 | 80 × 80 × 64 | 下采样至 P3 尺度 |
| 4 | C3k2 | 3 | 80 × 80 × 128 | 保存 Backbone P3 特征 |
| 5 | Conv | 4 | 40 × 40 × 128 | 下采样至 P4 尺度 |
| 6 | C3k2 | 5 | 40 × 40 × 128 | 保存 Backbone P4 特征 |
| 7 | Conv | 6 | 20 × 20 × 256 | 下采样至 P5 尺度 |
| 8 | C3k2 | 7 | 20 × 20 × 256 | 深层特征提取 |
| 9 | SPPF | 8 | 20 × 20 × 256 | 扩大感受野 |
| 10 | C2PSA | 9 | 20 × 20 × 256 | 强化重要区域和全局关系 |
| 11 | Upsample | 10 | 40 × 40 × 256 | 上采样 |
| 12 | Concat | 11 + 6 | 40 × 40 × 384 | 拼接 Backbone P4 |
| 13 | C3k2 | 12 | 40 × 40 × 128 | 融合 P4 |
| 14 | Upsample | 13 | 80 × 80 × 128 | 上采样 |
| 15 | Concat | 14 + 4 | 80 × 80 × 256 | 拼接 Backbone P3 |
| 16 | C3k2 | 15 | 80 × 80 × 64 | 最终 P3,小目标尺度 |
| 17 | Conv | 16 | 40 × 40 × 64 | 下采样 |
| 18 | Concat | 17 + 13 | 40 × 40 × 192 | 拼接中层特征 |
| 19 | C3k2 | 18 | 40 × 40 × 128 | 最终 P4,中目标尺度 |
| 20 | Conv | 19 | 20 × 20 × 128 | 下采样 |
| 21 | Concat | 20 + 10 | 20 × 20 × 384 | 拼接深层特征 |
| 22 | C3k2 | 21 | 20 × 20 × 256 | 最终 P5,大目标尺度 |
| 23 | Detect | 16 + 19 + 22 | P3 + P4 + P5 | 预测类别和边界框 |
不同规模模型的通道数和模块重复次数不同,但 P3、P4、P5 的空间尺度关系相同。
6. Backbone 模块详解
6.1 Conv:卷积、归一化和激活
YOLO 中的Conv通常不只是一次裸卷积,而是一个组合模块。它负责:
提取局部特征 + 调整通道数 + 在 stride=2 时完成下采样每次 stride=2 后,特征图宽高大约减半,通道数通常增加。这样网络逐步把高分辨率图像压缩成更抽象的语义表示。
6.2 先回忆 YOLOv8 的 C2f
C2f 延续 CSP 思想。核心逻辑是:
输入特征 ↓ 卷积并拆分通道 ├───────────────┐ │ │ ▼ ▼ 保留部分特征 经过 Bottleneck 逐步加工 │ │ └──────┬────────┘ ▼ Concat │ ▼ 卷积融合它让一部分特征快速传递,另一部分特征进行更深入计算,在表达能力和计算成本之间取得平衡。
6.3 YOLO11 的 C3k2
YOLO11 大量使用C3k2。从官方源码看,C3k2继承自C2f,仍然保留“拆分—加工—拼接—融合”的总体框架,但重写了内部模块组合方式。
可以简化理解为:
输入 x │ ▼ 卷积并拆分 ├─────────────────┐ │ │ ▼ ▼ 快捷传递分支 深层加工分支 │ ├─ 普通 Bottleneck │ 或 └─ C3k 模块 │ │ └────────┬────────┘ ▼ Concat │ ▼ 卷积融合标准yolo11.yaml中可以看到:
C3k2,[256,False,0.25]C3k2,[512,False,0.25]C3k2,[512,True]C3k2,[1024,True]这里的True或False主要控制内部是否使用C3k路径。浅层通常偏轻量,深层允许使用更充分的特征提取结构。
常见误区:k2不是 2 × 2 卷积核
C3k2不能机械理解为“使用 2 × 2 卷积核”。官方源码中,它是一个继承C2f的复合模块名称。重点在内部组合方式,而不是简单更换卷积核尺寸。
6.4 SPPF:低成本扩大感受野
SPPF 位于 Backbone 后部。它通过连续最大池化与特征拼接,让网络以较低开销汇集不同范围的信息。
深层输入 ├─ 原始特征 ├─ 池化一次 ├─ 池化两次 └─ 池化三次 ↓ Concat ↓ 卷积融合直觉上,网络不仅看到某个局部纹理,还能同时看到更大范围的上下文。
6.5 C2PSA:深层注意力模块
YOLO11 在 SPPF 后增加C2PSA:
C3k2 → SPPF → C2PSA → NeckC2PSA 会先将特征拆成两个分支:
输入特征 │ ▼ 1 × 1 Conv │ ▼ 按通道拆分 ├──────────────────────┐ │ │ ▼ ▼ 分支 A:直接保留 分支 B:多个 PSABlock │ ├─ Attention └─ FFN │ │ └───────────┬──────────┘ ▼ Concat │ ▼ 1 × 1 Conv │ ▼ 输出PSABlock 内部包含注意力模块和前馈网络,并使用残差连接。注意力部分会生成 Q、K、V,计算不同空间位置之间的相关性,并加入位置编码相关卷积。
为什么把 C2PSA 放在深层?假设输入为640 × 640,P5 特征图通常只有20 × 20。在低分辨率特征图上建模全局关系,成本比在浅层高分辨率特征图上做注意力更可控。
7. Neck:为什么要多尺度融合?
仅靠 Backbone 不够。浅层和深层特征各有优缺点:
| 特征层级 | 优势 | 不足 |
|---|---|---|
| 浅层 | 空间细节丰富,定位更精细 | 语义较弱 |
| 深层 | 语义更强,容易识别目标整体 | 空间分辨率较低 |
YOLO11 的 Neck 采用类似 FPN + PAN 的双向融合路径。
7.1 自顶向下:把深层语义传给浅层
深层 P5 ↓ Upsample 与 Backbone P4 拼接 ↓ C3k2 融合 P4 ↓ Upsample 与 Backbone P3 拼接 ↓ C3k2 最终 P37.2 自底向上:把定位信息重新传回深层
最终 P3 ↓ stride=2 Conv 与中间 P4 拼接 ↓ C3k2 最终 P4 ↓ stride=2 Conv 与深层 P5 拼接 ↓ C3k2 最终 P5最后得到:
P3:更适合小目标 P4:兼顾语义和细节 P5:更适合较大目标8. Detect Head:YOLO11 如何预测边界框?
8.1 Anchor-Free 到底是什么意思?
YOLOv5 是 Anchor-Based。每个网格位置会关联若干预先设定的 Anchor 宽高模板,网络再预测相对于模板的偏移量。
YOLO11 与 YOLOv8 类似,采用 Anchor-Free 思路。它不依赖预设 Anchor 框宽高,而是围绕特征图上的参考点预测四条边距离:
左边距离:l 上边距离:t 右边距离:r 下边距离:b参考点坐标为(cx, cy)时:
x1 = cx - l y1 = cy - t x2 = cx + r y2 = cy + b源码中仍然会出现make_anchors、anchor_points等命名,但这些是网格参考点,不是 YOLOv5 那种预设 Anchor 框模板。
8.2 参考点位于哪里?
官方源码使用grid_cell_offset=0.5生成参考点,即参考点位于每个网格单元的中心附近:
0.5, 1.5, 2.5, 3.5, ...在不同尺度上解码后,还需要乘以相应 stride,映射回输入图尺度。
8.3 每个位置输出多少个数?
当前标准 Detect Head 默认:
reg_max = 16 输出通道数 = nc + 4 × reg_max其中:
nc:类别数量 4:左、上、右、下四条边 16:每条边的离散分布桶数量对于 COCO 的 80 类检测:
4 × 16 + 80 = 144每个参考点输出 144 个数。
对于自定义 3 类任务:
4 × 16 + 3 = 67每个参考点输出 67 个数。
8.4 YOLO11 是否单独预测 Objectness?
标准 YOLO11 Detect Head 的输出通道公式是:
nc + 4 × reg_max不是:
1 + nc + 4 × reg_max因此,它没有 YOLOv5 风格的独立 Objectness 输出通道。推理时,分类分支经过 Sigmoid 得到类别分数,再进行阈值筛选和后处理。
9. DFL:为什么每条边要预测 16 个数?
DFL 即 Distribution Focal Loss 相关的分布式回归思路。
传统方式可能直接回归:
l = 4.05DFL 不直接输出单一浮点数,而是预测多个离散位置的概率分布。例如左边距离的部分概率为:
| 离散位置 | 概率 |
|---|---|
| 3 | 0.15 |
| 4 | 0.65 |
| 5 | 0.20 |
最终通过期望值恢复连续距离:
l = 3 × 0.15 + 4 × 0.65 + 5 × 0.20 = 4.05这样既保留离散分类形式的稳定性,又能得到连续值。
9.1 为什么默认是 16?
这是表达能力和计算成本之间的工程折中:
reg_max | 回归输出通道数 | 特点 |
|---|---|---|
| 8 | 4 × 8 = 32 | 更轻量,但表达能力较弱 |
| 16 | 4 × 16 = 64 | 官方默认折中 |
| 32 | 4 × 32 = 128 | 表达能力更强,但计算量、显存和输出通道更多 |
16不是数学上的唯一正确答案,而是实用默认值。
10. YOLO11 训练阶段完整流程
可以把训练过程拆成六步:
读取图片和标签 ↓ 数据增强与预处理 ↓ Backbone + Neck + Detect 前向传播 ↓ 生成不同尺度上的参考点 ↓ Task-Aligned Assigner 分配正负样本 ↓ 计算 Box、Cls、DFL 损失 ↓ 反向传播更新参数10.1 数据增强
Ultralytics 训练管线支持 Mosaic、MixUp、随机透视变换、颜色调整等增强方式。实际项目中需要根据任务特征控制增强强度。例如医学图像中,过度颜色扰动、翻转或形变可能破坏业务语义。
10.2 Task-Aligned Assigner
一张640 × 640输入图上有 8400 个参考点。训练时需要判断:哪些位置负责学习某个真实目标?
Task-Aligned Assigner 不只是看参考点是否落入真实框,而是综合分类预测质量和定位质量,挑选更合适的正样本。
直觉上:
候选点很多 ↓ 优先选择: 分类更像目标 并且 预测框位置更准确 的参考点 ↓ 作为正样本参与训练10.3 三类主要损失
YOLO11 标准检测训练主要计算:
| 损失项 | 作用 |
|---|---|
| Box Loss | 让预测框与真实框更接近,包含 IoU 类定位损失 |
| Classification Loss | 让类别预测更准确,当前实现使用 BCE |
| DFL Loss | 让四条边的距离分布更合理 |
最终损失按超参数权重加权,再反向传播。
10.4 为什么源码里仍然能看到v8DetectionLoss?
YOLO11 标准检测模型仍然复用了成熟的检测损失框架,因此源码类名中可能保留v8DetectionLoss。这不代表加载的是 YOLOv8。
工程源码中,类名经常为了兼容性和复用而保留。判断实际模型时,应结合 YAML、模型构建逻辑和运行配置。
11. YOLO11 推理阶段完整流程
标准推理可以拆成以下步骤:
输入图片 ↓ 缩放、填充、归一化等预处理 ↓ Backbone 提取多层特征 ↓ Neck 融合 P3、P4、P5 ↓ Detect Head 输出边界框分布和类别分数 ↓ DFL:将每条边的离散分布转换为连续距离 ↓ 结合参考点和 stride 解码边界框 ↓ 分类 Logits 经过 Sigmoid ↓ 置信度筛选 ↓ NMS 去除重复框 ↓ 恢复到原始图像坐标11.1 为什么需要 NMS?
同一个真实目标附近通常会有多个参考点输出高分候选框。例如一只猫附近可能有:
框 A:0.93 框 B:0.88 框 C:0.84这些框高度重叠。NMS 会优先保留高分框,并根据 IoU 重叠程度抑制重复预测。
11.2 标准 YOLO11 是不是 NMS-Free?
不是。当前通用 Detect 实现中可以看到可选的端到端模式,但标准yolo11.yaml调用 Detect 时没有开启该选项。因此,学习标准 YOLO11 检测模型时,应按经典 NMS 后处理流程理解。
12. YOLO11 和 YOLOv8 的详细对比
12.1 结构对比
| 对比项 | YOLOv8 | YOLO11 | 影响 |
|---|---|---|---|
| Backbone 主模块 | C2f | C3k2 | 改进特征提取效率与灵活性 |
| Neck 主模块 | C2f | C3k2 | 改进多尺度融合阶段的特征加工 |
| Backbone 末端 | SPPF | SPPF → C2PSA | 增强深层注意力与全局关系建模 |
| 检测尺度 | P3、P4、P5 | P3、P4、P5 | 保持多尺度检测能力 |
| Anchor 框模板 | 不使用 | 不使用 | 均为 Anchor-Free |
| 边框表达 | l、t、r、b + DFL | l、t、r、b + DFL | 基本延续 |
| 正负样本分配 | Task-Aligned | Task-Aligned | 基本延续 |
| 标准后处理 | NMS | NMS | 基本延续 |
12.2 Backbone 并排图
YOLOv8 Backbone YOLO11 Backbone 输入 输入 │ │ ▼ ▼ Conv Conv │ │ ▼ ▼ Conv Conv │ │ ▼ ▼ C2f C3k2 │ │ ▼ ▼ Conv Conv │ │ ▼ ▼ C2f C3k2 │ │ ▼ ▼ Conv Conv │ │ ▼ ▼ C2f C3k2 │ │ ▼ ▼ Conv Conv │ │ ▼ ▼ C2f C3k2 │ │ ▼ ▼ SPPF SPPF │ ▼ C2PSA12.3 Neck 并排图
YOLOv8 Neck YOLO11 Neck Upsample Upsample │ │ Concat Concat │ │ C2f C3k2 │ │ Upsample Upsample │ │ Concat Concat │ │ C2f C3k2 │ │ Conv Conv │ │ Concat Concat │ │ C2f C3k2 │ │ Conv Conv │ │ Concat Concat │ │ C2f C3k212.4 官方 COCO 检测基准
| 模型 | YOLO11 mAP50-95 | YOLOv8 mAP50-95 | YOLO11 参数量 | YOLOv8 参数量 | YOLO11 FLOPs | YOLOv8 FLOPs |
|---|---|---|---|---|---|---|
| n | 39.5 | 37.3 | 2.6M | 3.2M | 6.5B | 8.7B |
| s | 47.0 | 44.9 | 9.4M | 11.2M | 21.5B | 28.6B |
| m | 51.5 | 50.2 | 20.1M | 25.9M | 68.0B | 78.9B |
| l | 53.4 | 52.9 | 25.3M | 43.7M | 86.9B | 165.2B |
| x | 54.7 | 53.9 | 56.9M | 68.2M | 194.9B | 257.8B |
这些结果说明 YOLO11 的优化方向不是简单堆叠更大的网络,而是在更少参数和计算量下提升精度。
13. YOLO11 不同规模如何选择?
官方标准检测模型基准如下:
| 模型 | mAP50-95 | 参数量 | FLOPs | T4 TensorRT10 推理耗时 |
|---|---|---|---|---|
| YOLO11n | 39.5 | 2.6M | 6.5B | 1.5 ms |
| YOLO11s | 47.0 | 9.4M | 21.5B | 2.5 ms |
| YOLO11m | 51.5 | 20.1M | 68.0B | 4.7 ms |
| YOLO11l | 53.4 | 25.3M | 86.9B | 6.2 ms |
| YOLO11x | 54.7 | 56.9M | 194.9B | 11.3 ms |
实际选择建议:
| 场景 | 建议起点 |
|---|---|
| 快速验证、边缘设备、CPU 或弱算力设备 | YOLO11n |
| 大多数项目的初始精度与速度平衡 | YOLO11s |
| GPU 服务端、希望进一步提高精度 | YOLO11m |
| 算力较充足且精度优先 | YOLO11l |
| 研究、高算力环境或精度压榨 | YOLO11x |
真实部署速度还会受到输入分辨率、Batch Size、硬件、导出格式、预处理和后处理实现影响。官方延迟只能作为基准参考。
14. 自定义数据集与训练示例
14.1 检测标签格式
常见 YOLO 检测标签文件中,每一行为:
class_id x_center y_center width height其中坐标通常归一化到0~1。
示例:
0 0.512 0.486 0.320 0.27514.2 数据集 YAML
path:/path/to/datasettrain:images/trainval:images/valnames:0:tongue1:sublingual2:invalid14.3 Python 训练、验证与推理
fromultralyticsimportYOLO# 加载 COCO 预训练权重model=YOLO("yolo11n.pt")# 训练model.train(data="dataset.yaml",epochs=100,imgsz=640,)# 验证metrics=model.val()print(metrics.box.map)# mAP50-95# 推理results=model("test.jpg")# 查看模型摘要model.info()# 查看 PyTorch 网络结构print(model.model)14.4 导出 ONNX
fromultralyticsimportYOLO model=YOLO("best.pt")model.export(format="onnx")实际部署时,还可以根据平台选择 TensorRT、OpenVINO、TFLite 等格式。导出后仍需验证数值一致性、后处理正确性和真实端到端性能。
15. 常见误区集中纠正
| 常见误区 | 正确理解 |
|---|---|
| YOLO11 只替换了 Backbone 的 C2f | 不完整。Backbone 和 Neck 中大量 C2f 都换成了 C3k2 |
C3k2表示 2 × 2 卷积核 | 错。它是复合模块名称,不应机械按卷积核尺寸理解 |
| Anchor-Free 意味着源码里完全没有 anchor 字样 | 错。源码仍有anchor_points,但它们是网格参考点,不是预设 Anchor 框模板 |
| YOLO11 仍然有 YOLOv5 那样独立 Objectness 输出 | 标准 Detect Head 没有单独 Objectness 通道 |
| C2PSA 分布在所有特征层 | 标准 YOLO11 中,它位于 Backbone 末端 SPPF 后 |
| YOLO11 完全重新设计了 Detect Head | 不准确。核心 Anchor-Free、DFL 和 P3/P4/P5 检测逻辑基本延续 YOLOv8 |
| 标准 YOLO11 是 NMS-Free | 错。标准yolo11.yaml仍按经典 NMS 流程理解 |
| YOLO11 有官方正式论文 | 官方文档明确说明没有单独正式论文,应以官方文档和源码为准 |
16. 源码阅读顺序
推荐按下面顺序阅读,不要一上来钻进全部源码:
1. ultralytics/cfg/models/11/yolo11.yaml ↓ 2. ultralytics/nn/modules/block.py 重点:C3k2、C3k、SPPF、C2PSA、PSABlock、Attention ↓ 3. ultralytics/nn/modules/head.py 重点:Detect、DFL、解码逻辑 ↓ 4. ultralytics/utils/tal.py 重点:make_anchors、dist2bbox、TaskAlignedAssigner ↓ 5. ultralytics/utils/loss.py 重点:v8DetectionLoss、BboxLoss、DFLoss ↓ 6. ultralytics/nn/tasks.py 重点:模型构建、损失函数初始化阅读时始终围绕三个问题:
张量尺寸怎样变化? 特征来自哪一层? 这一模块解决了什么问题?17. 最终速记卡
17.1 网络结构速记
YOLO11 = YOLOv8 检测逻辑 + Backbone / Neck:C2f → C3k2 + Backbone 末端:SPPF → SPPF + C2PSA17.2 检测头速记
输入:P3、P4、P5 参考点数:80² + 40² + 20² = 8400(输入 640 时) 每个点回归:l、t、r、b 每条边:16 个分布值 每个点输出:4 × 16 + nc 标准 Head:没有独立 Objectness 通道17.3 训练速记
前向传播 → 生成参考点 → Task-Aligned Assigner 分配正样本 → Box Loss + Classification Loss + DFL Loss → 反向传播17.4 推理速记
预处理 → Backbone → Neck → Detect → DFL 解码 → 参考点 + stride 恢复框 → Sigmoid 类别分数 → 置信度筛选 → NMS → 输出结果18. 官方资料索引
以下资料适合作为后续查阅入口:
- YOLO11 官方模型说明:https://docs.ultralytics.com/models/yolo11/
- YOLO11 官方 YAML:https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/models/11/yolo11.yaml
- YOLOv8 官方 YAML:https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/models/v8/yolov8.yaml
- YOLO11 与 YOLOv8 官方对比:https://docs.ultralytics.com/compare/yolo11-vs-yolov8/
- Block 模块参考:https://docs.ultralytics.com/reference/nn/modules/block/
- Detect Head 参考:https://docs.ultralytics.com/reference/nn/modules/head/
- Task-Aligned Assigner 与参考点工具:https://docs.ultralytics.com/reference/utils/tal/
- 损失函数参考:https://docs.ultralytics.com/reference/utils/loss/
- 导出模式:https://docs.ultralytics.com/modes/export/
