文章目录
YOLOv11 快速入门指南 | 10分钟吃透网络结构与新特性
一、YOLOv11 的前世今生
2024 年 9 月 30 日,Ultralytics 发布了 YOLOv11,这是继 YOLOv8、v9、v10 之后的最新一代实时目标检测模型。
与前几代相比,YOLOv11 在保持“单阶段、实时、端到端”三大基因的同时,带来了两大核心升级:
版本 | 关键创新 | 主要收益 |
---|---|---|
v9 | PGI + GELAN | 更高训练效率 |
v10 | CIB + PSA + 无 NMS | 推理延迟 ↓30% |
v11 | C3k2 + C2PSA + 无 NMS | 参数量 ↓22%,mAP ↑1.8% |
一句话总结:YOLOv11 = 更快 + 更准 + 更少参数。
二、10 分钟看懂网络结构
2.1 宏观骨架:Backbone-Neck-Head 三段式
Input(640×640×3)
│
├─Backbone──┬─> C3k2 ──> C2PSA ──┐
│ │ │
│ └─> …… │
│ │
├─Neck(PANet)──> concat ──> upscale ──> ……
│
└─Head(Anchor-Free, 3 layers)
→ cls + reg + dfl (Decoupled)
2.2 微观单元:C3k2 与 C2PSA
2.2.1 C3k2 模块
- 作用:替换 YOLOv8 的 C2f,做跨阶段局部特征融合。
- 核心代码(ultralytics/nn/modules/block.py):
class C3k2(C2f):
"""Faster CSP Bottleneck with optional C3k blocks."""
def __init__(self, c1, c2, n=1, c3k=False, e=0.5, g=1, shortcut=True):
super().__init__(c1, c2, n, shortcut, g, e)
self.m = nn.ModuleList(
C3k(self.c, self.c, 2, shortcut, g) if c3k
else Bottleneck(self.c, self.c, shortcut, g)
for _ in range(n)
)
- 参数解释
c3k=True
:使用 2×Bottleneck 的 C3k;
c3k=False
:退化为 C2f(兼容旧模型)。
2.2.2 C2PSA 模块
- 作用:在 SPPF 之后引入 位置敏感多头注意力(PSA),捕获长程依赖。
- 核心代码:
class C2PSA(nn.Module):
def __init__(self, c1, c2, n=1, e=0.5):
super().__init__()
self.cv1 = Conv(c1, c2, 1, 1)
self.cv2 = Conv(c1, c2, 1, 1)
self.m = nn.Sequential(*(PSABlock(c2, attn_ratio=0.5, num_heads=4)
for _ in range(n)))
def forward(self, x):
x = self.cv1(x)
x = x + self.m(x)
return self.cv2(x)
- 可视化:
去掉PSABlock
中的attn
即退化为 C2 结构。
三、无 NMS 训练策略
3.1 双流标签分配
YOLOv11 延续了 v10 的 一致双重分配(dual label assignment):
- One-to-Many:训练阶段使用一对多分配(加速收敛)。
- One-to-One:推理阶段使用一对一匹配,无需 NMS,直接输出 Top-K。
3.2 代码级实现
在 ultralytics/utils/loss.py
中新增:
class v11Loss:
def __init__(self, tal_topk=10, use_dfl=True):
self.assigner = TaskAlignedAssigner(topk=tal_topk) # 一对多
self.assigner_oto = TopKAssigner(topk=1) # 一对一
训练时同时计算两种损失,推理时仅用后者,实现 端到端。
四、5 分钟跑通第一个训练
4.1 环境安装(CPU/GPU 通杀)
# 1. 创建虚拟环境
conda create -n yolo11 python=3.10 -y
conda activate yolo11
# 2. 安装依赖
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install ultralytics --upgrade
4.2 数据集准备(以 COCO128 为例)
# 下载示例数据集
wget https://ultralytics.com/assets/coco128.zip
unzip -q coco128.zip -d datasets/
datasets/coco128.yaml
关键内容:
path: ./datasets/coco128
train: images/train2017
val: images/train2017
nc: 80
names: [person, bicycle, ...]
4.3 启动训练
from ultralytics import YOLO
# 1. 加载模型
model = YOLO("yolo11n.yaml") # 从零开始
# model = YOLO("yolo11n.pt") # 使用预训练权重
# 2. 训练
model.train(
data="datasets/coco128.yaml",
epochs=50,
imgsz=640,
batch=32,
device=0, # GPU id
project="runs/train",
name="yolo11n_coco128"
)
4.4 验证与推理
# 验证
metrics = model.val()
print("mAP50-95:", metrics.box.map)
# 推理
results = model.predict("test.jpg", imgsz=640, conf=0.5)
results[0].show()
五、自定义数据 3 步到位
5.1 Labelme 标注 → YOLO 格式转换
import json, os
from pathlib import Path
def convert(labelme_dir, save_dir):
for json_file in Path(labelme_dir).glob("*.json"):
with open(json_file) as f:
data = json.load(f)
w, h = data["imageWidth"], data["imageHeight"]
txt_path = Path(save_dir) / f"{json_file.stem}.txt"
with open(txt_path, "w") as f:
for shape in data["shapes"]:
cls = shape["label"]
x1, y1, x2, y2 = shape["points"]
cx = (x1 + x2) / 2 / w
cy = (y1 + y2) / 2 / h
bw = abs(x2 - x1) / w
bh = abs(y2 - y1) / h
f.write(f"{cls} {cx} {cy} {bw} {bh}\n")
5.2 修改 YAML
path: ./mydata
train: images/train
val: images/val
nc: 3
names: ['cat', 'dog', 'bird']
5.3 训练
model = YOLO("yolo11s.pt")
model.train(data="mydata.yaml", epochs=100, imgsz=640, device=0)
六、部署加速:ONNX → TensorRT
# 1. 导出 ONNX
yolo task=detect mode=export model=runs/train/exp/weights/best.pt format=onnx
# 2. ONNX → TensorRT(需安装 trtexec)
trtexec --onnx=best.onnx --saveEngine=best.engine --fp16
Python 推理示例:
import tensorrt as trt
import pycuda.driver as cuda
import numpy as np
import cv2
# 加载 engine 并推理(略)
七、性能对比与调优建议
Model | size | mAP50-95 | Params | FLOPs |
---|---|---|---|---|
YOLOv8n | 640 | 37.3 | 3.2M | 8.7G |
YOLOv11n | 640 | 39.5 | 2.5M | 7.1G |
YOLOv11s | 640 | 47.0 | 9.2M | 23.8G |
- 调优 checklist
- 小目标:开启
copy_paste
+mosaic
数据增强。 - 大模型:使用
--optimizer AdamW
+cos_lr
。 - GPU 显存小:
--batch -1
自动 Batch Size。
- 小目标:开启
八、总结与展望
YOLOv11 通过 C3k2 和 C2PSA 两大新模块,以及 无 NMS 端到端训练,在速度-精度-参数三维空间实现了新的帕累托前沿。
未来方向:
- YOLOv12 已引入 FlashAttention 与 CNN-Transformer 混合架构;
- 边缘部署:结合 INT8/INT4 量化、MobileNet v3 backbone;
- 多任务统一:检测 + 分割 + 姿态估计一体化。