YOLOv11 快速入门指南 | 10分钟吃透网络结构与新特性

YOLOv11 快速入门指南 | 10分钟吃透网络结构与新特性

一、YOLOv11 的前世今生

2024 年 9 月 30 日,Ultralytics 发布了 YOLOv11,这是继 YOLOv8、v9、v10 之后的最新一代实时目标检测模型。
与前几代相比,YOLOv11 在保持“单阶段、实时、端到端”三大基因的同时,带来了两大核心升级:

版本关键创新主要收益
v9PGI + GELAN更高训练效率
v10CIB + PSA + 无 NMS推理延迟 ↓30%
v11C3k2 + 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 并推理(略)

七、性能对比与调优建议

ModelsizemAP50-95ParamsFLOPs
YOLOv8n64037.33.2M8.7G
YOLOv11n64039.52.5M7.1G
YOLOv11s64047.09.2M23.8G
  • 调优 checklist
    1. 小目标:开启 copy_paste + mosaic 数据增强。
    2. 大模型:使用 --optimizer AdamW + cos_lr
    3. GPU 显存小:--batch -1 自动 Batch Size。

八、总结与展望

YOLOv11 通过 C3k2C2PSA 两大新模块,以及 无 NMS 端到端训练,在速度-精度-参数三维空间实现了新的帕累托前沿。
未来方向:

  • YOLOv12 已引入 FlashAttention 与 CNN-Transformer 混合架构;
  • 边缘部署:结合 INT8/INT4 量化、MobileNet v3 backbone;
  • 多任务统一:检测 + 分割 + 姿态估计一体化。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值