YOLO26 是 Ultralytics 于 2026 年 1 月发布的最新一代 YOLO 模型,具备端到端无 NMS 推理、MuSGD 混合优化器、CPU 推理速度提升最高 43% 等特性。本文档涵盖从环境安装、数据标注、数据集配置、模型训练到推理部署的完整流程。
目录
1. YOLO26 简介与模型选择
1.1 核心特性
| 特性 | 说明 |
|---|---|
| 端到端无 NMS 推理 | 原生端到端检测,无需非极大值抑制后处理,延迟更低 |
| MuSGD 优化器 | SGD + Muon 混合优化器,训练更稳定、收敛更快 |
| DFL 移除 | 移除 Distribution Focal Loss 模块,简化推理,兼容更多边缘设备 |
| CPU 推理加速 | 相比上一代最高提升 43% 的 CPU 推理速度 |
| 双头架构 | One-to-One(默认,无需 NMS)和 One-to-Many(精度更高)两种头部可切换 |
1.2 模型尺寸选择
| 模型 | 参数量 | mAP(val 50-95) | CPU 推理速度 | 适用场景 |
|---|---|---|---|---|
| yolo26n | 2.4M | 40.9 | 38.9ms | 边缘设备、移动端、实时性要求高 |
| yolo26s | 9.5M | 48.6 | 87.2ms | 轻量级服务器、嵌入式设备 |
| yolo26m | 20.4M | 53.1 | 220.0ms | 精度与速度平衡 |
| yolo26l | 24.8M | 55.0 | 286.2ms | 精度优先场景 |
| yolo26x | 55.7M | 57.5 | 525.8ms | 最高精度需求 |
选择建议:
- 初学者/快速验证:选
yolo26n或yolo26s - 生产环境平衡:选
yolo26m - 追求最高精度:选
yolo26l或yolo26x
1.3 支持的任务类型
| 任务 | 模型后缀 | 说明 |
|---|---|---|
| 目标检测 | 无后缀 | yolo26n.pt |
| 实例分割 | -seg | yolo26n-seg.pt |
| 图像分类 | -cls | yolo26n-cls.pt |
| 姿态估计 | -pose | yolo26n-pose.pt |
| 旋转目标检测 | -obb | yolo26n-obb.pt |
目标检测(无后缀)— yolo26n.pt
作用: 找出目标位置(矩形框)+ 给出类别 + 置信度
适用场景举例:
- 游戏中检测敌人/怪物在哪、按钮在哪、UI 元素在哪
- 自动驾驶中检测行人、车辆、红绿灯
- 工业质检中检测产品缺陷位置
输出: 每个目标的矩形框坐标 [x1, y1, x2, y2]、类别名称、置信度
实例分割(-seg)— yolo26n-seg.pt
作用: 在目标检测的基础上,额外输出每个目标的精确轮廓掩码(像素级边界)
适用场景举例:
- 需要知道目标的精确形状,而不仅仅是矩形框
- 图像抠图:分离前景人物和背景
- 医学影像:精确标出肿瘤/病灶的边界区域
- 自动驾驶:精确区分道路、人行道、车辆轮廓
输出: 矩形框 + 类别 + 置信度 + 逐像素的分割掩码
图像分类(-cls)— yolo26n-cls.pt
作用: 判断整张图片属于哪个类别,不定位具体位置
适用场景举例:
- 判断当前游戏画面处于哪个场景(主城 / 战斗 / 背包 / 加载中)
- 判断一张照片是猫还是狗
- 判断产品图片是合格还是不合格
输出: 各类别的概率分布(如:战斗场景 92%、主城 5%、加载中 3%)
姿态估计(-pose)— yolo26n-pose.pt
作用: 检测人体并定位关键骨骼点(眼睛、肩膀、手肘、手腕、膝盖等 17 个关键点)
适用场景举例:
- 健身 App 检测用户动作是否标准
- 体感游戏中的人体姿势识别
- 跌倒检测:判断老人是否摔倒
- 运动分析:分析运动员的姿势和动作
输出: 人体矩形框 + 17 个关键点的坐标和置信度
旋转目标检测(-obb)— yolo26n-obb.pt
作用: 用带角度的旋转矩形框定位目标,比水平矩形框更贴合倾斜物体
适用场景举例:
- 航拍/卫星图中检测倾斜停放的车辆、船只
- 文档中检测倾斜的文字区域
- 遥感图像中检测任意角度的建筑物
输出: 旋转矩形框(4 个顶点坐标)+ 类别 + 置信度
2. 环境安装
2.1 系统要求
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| Python | 3.8+ | 3.10 / 3.11 |
| PyTorch | 1.8+ | 2.0+ |
| CUDA(GPU 训练) | 11.2+ | 12.1+ |
| 显卡(GPU 训练) | 4GB 显存以上 | NVIDIA RTX 3060 及以上,8GB+ 显存 |
| 内存 | 8GB | 16GB+ |
| 操作系统 | Windows / macOS / Linux | Ubuntu 22.04 / macOS (Apple Silicon 支持 MPS) |
2.2 安装步骤
步骤一:创建虚拟环境(强烈推荐)
# 使用 conda 创建虚拟环境
conda create -n yolo26 python=3.11 -y
conda activate yolo26
# 或使用 venv
python -m venv yolo26_env
source yolo26_env/bin/activate # macOS / Linux
# yolo26_env\Scripts\activate # Windows
步骤二:安装 PyTorch
根据你的硬件选择对应版本:
# GPU 版本(CUDA 12.1)— 推荐
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# CPU 版本
pip install torch torchvision torchaudio
# macOS Apple Silicon(M1/M2/M3/M4,自带 MPS 支持)
pip install torch torchvision torchaudio
步骤三:安装 Ultralytics
pip install ultralytics
步骤四:验证安装
yolo checks
正常输出会显示 Ultralytics 版本、Python 版本、PyTorch 版本和可用设备信息。
也可以用 Python 验证:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
print("安装成功!检测到", len(results[0].boxes), "个目标")
# 可选:显示检测结果图片(弹窗展示,按任意键关闭)
results[0].show()
# 可选:保存检测结果图片到当前目录
results[0].save(filename="result.jpg")
results 返回结果详解
推理返回的是一个 Results 列表,每个元素对应一张图片的检测结果:
r = results[0] # 取第一张图片的结果
# --- 检测框信息 ---
r.boxes # 所有检测框对象
r.boxes.xyxy # 边界框坐标 [x1, y1, x2, y2],像素值
r.boxes.xywh # 边界框坐标 [中心x, 中心y, 宽, 高],像素值
r.boxes.xywhn # 同上,但归一化到 0~1
r.boxes.cls # 类别 ID,如 tensor([0, 5, 11])
r.boxes.conf # 置信度,如 tensor([0.92, 0.87, 0.76])
r.boxes.data # 完整数据 [x1, y1, x2, y2, conf, cls]
# --- 辅助信息 ---
r.names # 类别字典,如 {0: 'person', 5: 'bus', 11: 'stop sign'}
r.orig_img # 原始图片(numpy 数组)
r.orig_shape # 原始图片尺寸 (height, width)
r.speed # 各阶段耗时 {'preprocess': ms, 'inference': ms, 'postprocess': ms}
# --- 分割/姿态/OBB 任务(仅对应模型可用)---
r.masks # 实例分割掩码(-seg 模型)
r.keypoints # 关键点坐标(-pose 模型)
r.obb # 旋转框信息(-obb 模型)
r.probs # 分类概率(-cls 模型)
# --- 实用方法 ---
r.show() # 弹窗显示标注结果
r.save(filename="out.jpg") # 保存标注结果图片
r.plot() # 返回绘制了标注的 numpy 图片数组(可自行处理)
r.to_json() # 将结果转为 JSON 字符串
r.tojson() # 同上(别名)
打印某张图片所有检测目标的示例:
r = results[0]
for box in r.boxes:
cls_id = int(box.cls[0])
print(f"{r.names[cls_id]}: 置信度={float(box.conf[0]):.2f}, 坐标={box.xyxy[0].tolist()}")
# 输出示例:
# person: 置信度=0.92, 坐标=[52.0, 398.0, 231.0, 896.0]
# bus: 置信度=0.87, 坐标=[16.0, 230.0, 801.0, 768.0]
2.3 注意事项
- 不要在系统全局 Python 中安装,务必使用虚拟环境隔离
- GPU 训练必须安装 CUDA 对应版本的 PyTorch,去 PyTorch 官网 确认版本对应关系
- macOS 用户可以使用
device="mps"来利用 Apple Silicon 加速训练 - Windows 用户如果遇到
RuntimeError,需要在脚本中添加if __name__ == "__main__":保护
3. 训练图片获取与注意事项
3.1 核心原则:训练图 = 推理时的截图方式保持一致
YOLO 内部会将输入图片统一缩放到模型输入尺寸(如 640×640),所以理论上任何分辨率的图片都能训练和推理。但训练图和推理图的来源方式越一致,检测效果越好——因为相同来源意味着图像特征(清晰度、色彩、噪点)高度一致。
3.2 常见图片来源方式
方式一:ADB 截图(推荐用于模拟器/真机场景)
通过 adb screencap 或 adb exec-out screencap -p 获取设备原生分辨率的截图:
# 截图保存到设备
adb shell screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png ./screenshot.png
# 直接获取到本地(更快)
adb exec-out screencap -p > screenshot.png
优点:
- 获取的是设备原生分辨率(如 1920×1080),不受电脑窗口大小影响
- 分辨率稳定,换台电脑、调整窗口大小都不影响截图结果
- 图像更清晰,目标特征更明显,检测效果更好
方式二:窗口截图(截取模拟器/应用窗口)
使用系统 API 或第三方工具截取屏幕上的窗口画面:
# Python 示例:使用 pyautogui 截取屏幕区域
import pyautogui
screenshot = pyautogui.screenshot(region=(x, y, width, height))
screenshot.save("screenshot.png")
# 或使用 mss(更快,适合实时场景)
import mss
with mss.mss() as sct:
monitor = {"top": y, "left": x, "width": width, "height": height}
img = sct.grab(monitor)
注意: 窗口截图的分辨率取决于窗口实际大小。如果模拟器窗口被缩小到 354×273,截图就是 354×273,信息量远小于原生 1920×1080。
方式三:直接收集图片文件
适用于非实时场景,直接从文件系统收集现有图片:
- 相机/手机拍摄的照片
- 网络爬取的图片(注意版权)
- 公开数据集中的图片
- 游戏/应用的素材资源
3.3 分辨率选择与一致性
关键点: 不是尺寸数值必须一模一样,而是图像内容的清晰度和特征要一致。
| 场景 | 能否使用 | 效果 |
|---|---|---|
| 训练 1920×1080,推理也用 1920×1080 | 最佳 | 特征一致,检测最准 |
| 训练 1920×1080,推理用 354×273 窗口截图 | 能用 | 会损精度,小图细节丢失,特征和训练时差异大 |
| 训练 354×273,推理也用 354×273 | 可以 | 一致就行,但小图本身信息少 |
原理解析:
- YOLO 推理时会将输入图片 resize 到模型输入尺寸(如 640×640),所以任何尺寸理论上都不会报错
- 但 1920×1080 的截图缩放到 640×640 和 354×273 的截图缩放到 640×640,丢失的信息量不同,导致特征差异
- 训练和推理的图像特征越接近,模型表现越稳定
推荐做法:
- 使用 ADB 截图统一分辨率:训练和推理都用
adb screencap获取设备原生分辨率(如 1920×1080),这样最稳最准 - 如果必须用窗口截图,训练时也要用同样的窗口截图方式采集数据
3.4 训练图片采集流程
以游戏/应用检测为例:
1. 确定截图方式
└─ 推荐 ADB 截图(设备原生分辨率 1920×1080)
2. 批量采集截图
└─ 截取几百张游戏画面,覆盖各种场景
└─ 不同地图、不同时间、不同状态都要有
3. 使用标注工具标注目标
└─ LabelImg 或 Roboflow 标注 bounding box
4. 导出为 YOLO 格式,开始训练
批量 ADB 截图脚本示例
import subprocess
import time
import os
output_dir = "./screenshots"
os.makedirs(output_dir, exist_ok=True)
for i in range(200):
filename = os.path.join(output_dir, f"screen_{i:04d}.png")
subprocess.run(
f"adb exec-out screencap -p > {filename}",
shell=True
)
print(f"已截取: {filename}")
time.sleep(2) # 每 2 秒截一张,根据需要调整间隔
3.5 采集注意事项
- 场景多样性:确保截图覆盖各种游戏场景——不同地图、不同怪物组合、不同 UI 状态、白天/夜晚等
- 目标多样性:同一类目标要包含不同大小、不同位置、部分遮挡等情况
- 数量建议:每个检测类别至少 100~300 张包含该目标的截图,场景越复杂越需要更多数据
- 负样本:适当包含一些没有目标的截图(空标签文件),让模型学会区分"无目标"场景
- 避免重复:连续截图时设置合理间隔,避免大量近似重复的画面(会导致过拟合)
- 避免 UI 干扰:如果检测的目标是游戏内物体,注意 UI 元素(血条、小地图等)是否会造成干扰,必要时可裁切或在标注时忽略
4. 标注工具推荐与使用
4.1 工具对比
| 工具 | 类型 | 支持格式 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|---|---|
| LabelImg | 桌面端 | YOLO / VOC / CreateML | 轻量免费、直接输出 YOLO 格式 | 仅支持矩形框标注 | ⭐⭐⭐⭐⭐ |
| Roboflow | 在线平台 | 多种格式 | 在线协作、自动增强、一键导出 | 免费版有数量限制 | ⭐⭐⭐⭐⭐ |
| LabelMe | 桌面端 | JSON | 支持多边形、分割标注 | 需手动转换为 YOLO 格式 | ⭐⭐⭐⭐ |
| CVAT | 网页端 | 多种格式 | 功能强大、团队协作 | 部署较复杂 | ⭐⭐⭐⭐ |
| Label Studio | 网页端 | 多种格式 | 通用标注、插件丰富 | 学习成本稍高 | ⭐⭐⭐ |
4.2 推荐方案
- 个人项目/小数据集 → LabelImg(最简单直接)
- 团队协作/大数据集 → Roboflow(在线平台,省心省力)
- 需要分割标注 → LabelMe(多边形标注)
4.3 LabelImg 安装与使用(推荐)
安装
labelImg 依赖 PyQt5,pip install 时会自动安装,通常无需手动处理:
pip install labelImg
兼容性提醒: labelImg 最后更新于 2021 年(v1.8.6),在 Python 3.11+ 上可能遇到 PyQt5 安装失败的问题。如果报错,按以下方式处理:
# 方案一:先手动安装 PyQt5 再装 labelImg
pip install pyqt5 lxml
pip install labelImg
# 方案二:指定 Python 3.10 环境(最稳妥)
conda create -n labelimg python=3.10 -y
conda activate labelimg
pip install labelImg
# 方案三(macOS):指定 PyQt5 版本
pip install pyqt5==5.15.2 lxml
pip install labelImg
PyQt5 float 坐标兼容问题(常见)
PyQt5 5.15+ 版本中部分 API 返回 float 类型坐标,而 labelImg 未跟进适配,运行时会报类似以下错误:
TypeError: arguments did not match any overloaded call:
drawLine(self, x1: int, y1: int, x2: int, y2: int): argument 1 has unexpected type 'float'
TypeError: setValue(self, a0: int): argument 1 has unexpected type 'float'
解决方法: 手动修改 labelImg 源码中的两个文件,将 float 坐标转为 int。
找到 labelImg 的安装目录(通常在虚拟环境的 site-packages/libs/ 下),修改以下文件:
1. 修改 canvas.py — 搜索 drawLine,将涉及 .x() / .y() / .height() / .width() 的参数用 int() 包裹:
# 修改前
p.drawLine(self.prev_point.x(), 0, self.prev_point.x(), self.pixmap.height())
# 修改后
p.drawLine(int(self.prev_point.x()), 0, int(self.prev_point.x()), int(self.pixmap.height()))
2. 修改 labelImg.py — 搜索 bar.setValue,将计算结果用 int() 包裹:
# 修改前
bar.setValue(bar.value() + bar.singleStep() * units)
# 修改后
bar.setValue(int(bar.value() + bar.singleStep() * units))
详细修复说明可参考:CSDN - labelImg PyQt5 兼容修复
启动
# 会占用一个命令行窗口挂着
labelImg
使用步骤
⚠️ 已知 Bug 提醒: labelImg 存在一个已知问题——如果在未打开图片的情况下切换保存格式(如切换为 YOLO),触发保存/自动保存时会因
self.file_path为None而崩溃:TypeError: expected str, bytes or os.PathLike object, not NoneType务必按以下顺序操作,先加载图片再切换格式,即可避免此问题。 博主 Python 3.12 + 新版 PyQt5,有兼容问题,可以要 ai 工具给改一下 labelImg 源码修复下,原因:Qt 新版本把鼠标坐标从 int 改成了 float 返回,而 labelImg 代码写的时候没处理这个,直接把 float 传给只接受 int 的绘图函数(drawLine、drawRect),就崩了,主要问题文件 canvas.py。
- 打开图片目录:
Open Dir→ 选择你的图片文件夹 - 选中一张图片:点击左侧文件列表中的任意图片,确保图片已加载显示在画布上
- 切换保存格式:点击左侧工具栏的
PascalVOC按钮,没看到可能在底部的箭头里面,展开就可以看到,切换为YOLO格式(很重要!) - 设置保存目录:
Change Save Dir→ 选择标签保存文件夹(建议与图片分开存放) - 创建标注:
- 快捷键
W:创建矩形框 - 用鼠标拖拽框选目标
- 输入类别名称(保持一致,如
cat、dog) - 快捷键
D:下一张图片 - 快捷键
A:上一张图片 - 快捷键
Ctrl+S:保存标注
- 快捷键
- 预定义类别:在保存目录(
Change Save Dir设置的目录)下保存后会自动生成classes.txt文件,每行一个类别名(可加快标注速度,标注时直接从列表选择而不用手动输入),也可以手动创建,直接写进去,不清楚就等它保存自动创建就行了,一样的效果。
cat
dog
bird
输出格式
每张图片会生成一个同名 .txt 文件,内容格式为:
<类别ID> <中心x> <中心y> <宽度> <高度>
所有坐标值为归一化值(0~1),示例:
0 0.415234 0.365625 0.201563 0.434375
1 0.712500 0.523438 0.150000 0.275000
4.4 Roboflow 在线标注(团队推荐)
- 访问 roboflow.com,注册账号
- 创建项目,选择
Object Detection - 上传图片
- 在线框选标注目标、设定类别
- 设置训练集/验证集/测试集比例(推荐 70/20/10)
- 添加数据增强预处理(可选)
- 导出时选择
YOLOv8格式(与 YOLO26 兼容),下载数据集
4.5 标注注意事项
- 框要贴紧目标:不要留太多空白,也不要裁切目标
- 类别名称统一:同一类目标全程用同一名称,区分大小写
- 类别粒度按需求定,不是越细越好:
- 类别越多,每个类别需要的训练数据越多,模型学习难度越大
- 如果只需要知道"这里有个怪物",标一个
monster就够;如果需要区分怪物种类再细分monster_a、monster_b - 外观差异大的目标才值得分开标(比如近战怪和远程怪长得完全不同);长得很像的硬拆成多类反而会互相混淆降低精度
- 实际建议:先用粗粒度跑通验证效果,有需要再逐步细分
- 标注所有目标:一张图中所有属于目标类的物体都要标注,不要遗漏
- 图片质量:避免严重模糊、过曝、过暗的图片
- 数据量建议:每个类别至少 100-300 张标注图片,越多越好
- 多样性:同一类别应包含不同角度、光照、尺寸、背景的样本
5. 数据集目录结构与配置
5.1 标准目录结构
my_dataset/
├── images/
│ ├── train/ # 训练集图片
│ │ ├── img001.jpg
│ │ ├── img002.jpg
│ │ └── ...
│ └── val/ # 验证集图片
│ ├── img101.jpg
│ ├── img102.jpg
│ └── ...
├── labels/
│ ├── train/ # 训练集标签(与图片一一对应)
│ │ ├── img001.txt
│ │ ├── img002.txt
│ │ └── ...
│ └── val/ # 验证集标签
│ ├── img101.txt
│ ├── img102.txt
│ └── ...
└── data.yaml # 数据集配置文件
关键要求:
images和labels目录结构必须完全镜像- 每个图片文件必须有一个同名的
.txt标签文件 - 如果某张图片没有标注目标,对应的
.txt文件内容为空(文件必须存在)
5.2 数据集划分
标注完成后,需要将图片和标签按比例(推荐 80/20)随机划分到 train 和 val 目录中。可以让 AI 根据你的实际目录路径生成划分脚本,核心逻辑就是:随机打乱图片列表 → 按比例分成两组 → 把图片和同名 .txt 标签分别复制到对应的 images/train、images/val、labels/train、labels/val 目录。
5.3 配置 data.yaml
在数据集根目录创建 data.yaml 文件:
# 数据集路径(使用绝对路径更可靠)
path: /home/user/my_dataset # 数据集根目录
train: images/train # 训练集图片路径(相对于 path)
val: images/val # 验证集图片路径(相对于 path)
test: # 测试集(可选,留空)
# 类别数量
nc: 3
# 类别名称(顺序必须与标注 ID 对应:0=cat, 1=dog, 2=bird),也就是 classes.txt 里面什么顺序这里就什么顺序,不要随意列出来
names:
0: cat
1: dog
2: bird
注意事项:
path推荐使用绝对路径,避免路径问题names中的序号必须与标注文件中的类别 ID 严格对应nc必须与names中的类别数量一致
为什么只配置 images 路径,不配置 labels?
YOLO 训练脚本内部有一套固定的路径推导规则:读取图片路径后,自动将路径中的 images 替换为 labels、将图片后缀替换为 .txt 来定位标签文件。例如:
图片:/home/user/my_dataset/images/train/001.jpg
↓ 自动推导
标签:/home/user/my_dataset/labels/train/001.txt
因此 data.yaml 中不需要(也没有字段)配置 labels 路径,只要你的目录结构保持 images/ 和 labels/ 镜像对应即可。这也解释了为什么 5.1 节中强调「目录结构必须完全镜像」——这不是建议,而是 YOLO 的硬性约定。
6. 模型训练
6.1 基础训练(Python)
from ultralytics import YOLO
# 加载预训练模型(推荐,迁移学习收敛更快)
model = YOLO("yolo26n.pt")
# 开始训练
results = model.train(
data="path/to/data.yaml", # 数据集配置文件路径
epochs=100, # 训练轮数
imgsz=640, # 输入图片尺寸
batch=16, # 批次大小
device=0, # GPU 设备(0 表示第一块 GPU)
project="runs/train", # 输出目录
name="my_yolo26_exp", # 实验名称
)
6.2 基础训练(命令行 CLI)
yolo detect train \
data=path/to/data.yaml \
model=yolo26n.pt \
epochs=100 \
imgsz=640 \
batch=16 \
device=0 \
project=runs/train \
name=my_yolo26_exp
6.3 常用训练参数详解
| 参数 | 默认值 | 说明 |
|---|---|---|
model | — | 模型文件:.pt 加载预训练权重,.yaml 从头构建 |
data | — | 数据集 yaml 配置文件路径 |
epochs | 100 | 训练总轮数 |
imgsz | 640 | 输入图像尺寸(建议 640) |
batch | 16 | 批次大小。设为 -1 可自动适配 60% 显存 |
device | auto | 设备:0(GPU)、cpu、mps(Mac)、0,1(多 GPU) |
optimizer | auto | 优化器:auto 会根据数据量自动选择 MuSGD 或 AdamW |
lr0 | 0.01 | 初始学习率 |
patience | 100 | 早停耐心值(验证指标多少轮不提升就停止) |
save_period | -1 | 每隔多少轮保存一次模型(-1 仅保存 best 和 last) |
cache | False | 缓存图片到内存 True 或磁盘 disk,加速训练 |
workers | 8 | 数据加载线程数 |
pretrained | True | 是否使用预训练权重 |
resume | False | 是否从断点继续训练 |
amp | True | 混合精度训练,减少显存占用 |
cos_lr | False | 余弦学习率衰减 |
close_mosaic | 10 | 最后 N 轮关闭 Mosaic 增强 |
freeze | None | 冻结前 N 层(微调时常用) |
6.4 进阶训练配置
从零训练(不使用预训练权重)
model = YOLO("yolo26n.yaml") # 从 YAML 配置构建模型
results = model.train(data="data.yaml", epochs=300, imgsz=640)
使用预训练权重 + 自定义 YAML
model = YOLO("yolo26n.yaml").load("yolo26n.pt")
results = model.train(data="data.yaml", epochs=100, imgsz=640)
冻结骨干网络微调
model = YOLO("yolo26n.pt")
results = model.train(
data="data.yaml",
epochs=50,
freeze=10, # 冻结前 10 层
lr0=0.001, # 微调时用较小学习率
)
多 GPU 训练
model = YOLO("yolo26n.pt")
results = model.train(
data="data.yaml",
epochs=100,
device=[0, 1], # 使用 GPU 0 和 GPU 1
)
断点续训
model = YOLO("runs/train/my_yolo26_exp/weights/last.pt")
results = model.train(resume=True)
macOS Apple Silicon 训练
model = YOLO("yolo26n.pt")
results = model.train(data="data.yaml", epochs=100, device="mps")
6.5 训练输出目录
训练完成后,结果保存在 runs/train/my_yolo26_exp/ 目录下:
runs/train/my_yolo26_exp/
├── weights/
│ ├── best.pt # 最佳模型权重(验证 mAP 最高时保存)
│ └── last.pt # 最后一轮的模型权重
├── results.csv # 每轮训练指标数据
├── results.png # 训练曲线图
├── confusion_matrix.png # 混淆矩阵
├── F1_curve.png # F1 曲线
├── P_curve.png # 精确率曲线
├── R_curve.png # 召回率曲线
├── PR_curve.png # PR 曲线
├── labels.jpg # 数据集标签分布
├── train_batch*.jpg # 训练批次可视化
├── val_batch*_pred.jpg # 验证预测可视化
└── args.yaml # 训练参数记录
6.6 训练技巧
- 先用小模型验证流程:用
yolo26n+ 少量 epoch 跑通整个流程后,再用大模型正式训练 - batch 大小调整:显存不足时减小 batch,或设为
-1自动适配 - 图片缓存加速:数据集不大时用
cache=True将图片缓存到内存 - 数据增强:Ultralytics 默认开启 Mosaic、翻转等增强,通常无需额外配置
- 早停机制:
patience=100表示验证指标 100 轮不提升就停止,避免过拟合 - 学习率:使用预训练权重时建议
lr0=0.01;微调时可降到0.001 - 训练轮数:小数据集 100-200 轮,大数据集 300+ 轮
7. 训练结果验证
7.1 使用训练好的模型进行验证
from ultralytics import YOLO
model = YOLO("runs/train/my_yolo26_exp/weights/best.pt")
metrics = model.val(data="path/to/data.yaml")
print(f"mAP50: {metrics.box.map50:.4f}")
print(f"mAP50-95: {metrics.box.map:.4f}")
print(f"精确率: {metrics.box.mp:.4f}")
print(f"召回率: {metrics.box.mr:.4f}")
命令行方式:
yolo detect val model=runs/train/my_yolo26_exp/weights/best.pt data=path/to/data.yaml
7.2 关键指标说明
| 指标 | 含义 | 理想值 |
|---|---|---|
| mAP50 | IoU=0.5 时的平均精度 | > 0.8 |
| mAP50-95 | IoU=0.5~0.95 的平均精度 | > 0.5 |
| Precision | 精确率(预测为正的正确比例) | > 0.8 |
| Recall | 召回率(实际为正被检测到的比例) | > 0.8 |
8. 模型推理(使用训练好的模型)
8.1 单张图片推理
from ultralytics import YOLO
model = YOLO("runs/train/my_yolo26_exp/weights/best.pt")
results = model("path/to/test_image.jpg")
for result in results:
boxes = result.boxes
for box in boxes:
cls_id = int(box.cls[0]) # 类别 ID
cls_name = result.names[cls_id] # 类别名称
confidence = float(box.conf[0]) # 置信度
x1, y1, x2, y2 = box.xyxy[0].tolist() # 边界框坐标
print(f"检测到: {cls_name}, 置信度: {confidence:.2f}, 坐标: ({x1:.0f},{y1:.0f})-({x2:.0f},{y2:.0f})")
result.show() # 显示结果图片
result.save() # 保存结果到 runs/detect/predict/
8.2 批量图片推理
from ultralytics import YOLO
model = YOLO("runs/train/my_yolo26_exp/weights/best.pt")
results = model(
source="path/to/test_images/", # 图片目录
conf=0.5, # 置信度阈值
iou=0.45, # IoU 阈值(使用 one-to-many 头部时)
save=True, # 保存结果图片
save_txt=True, # 保存检测结果 txt
)
8.3 视频推理
from ultralytics import YOLO
model = YOLO("runs/train/my_yolo26_exp/weights/best.pt")
results = model(
source="path/to/video.mp4",
conf=0.5,
save=True, # 保存标注后的视频
stream=True, # 流式处理,节省内存
)
for result in results:
pass # 逐帧处理
8.4 摄像头实时推理
from ultralytics import YOLO
model = YOLO("runs/train/my_yolo26_exp/weights/best.pt")
results = model(
source=0, # 0 表示默认摄像头
conf=0.5,
show=True, # 实时显示窗口
stream=True,
)
for result in results:
pass
8.5 命令行推理
# 单张图片
yolo detect predict model=runs/train/my_yolo26_exp/weights/best.pt source=test.jpg conf=0.5
# 图片目录
yolo detect predict model=runs/train/my_yolo26_exp/weights/best.pt source=test_images/ conf=0.5 save=True
# 视频
yolo detect predict model=runs/train/my_yolo26_exp/weights/best.pt source=video.mp4 conf=0.5 save=True
8.6 双头架构切换
YOLO26 支持两种推理头:
model = YOLO("runs/train/my_yolo26_exp/weights/best.pt")
# One-to-One 头(默认):端到端,无需 NMS,速度更快
results = model.predict("image.jpg")
# One-to-Many 头:需要 NMS 后处理,精度略高
results = model.predict("image.jpg", end2end=False)
9. 模型导出与部署
9.1 导出为不同格式
from ultralytics import YOLO
model = YOLO("runs/train/my_yolo26_exp/weights/best.pt")
# 导出为 ONNX
model.export(format="onnx")
# 导出为 TensorRT(需要 NVIDIA GPU)
model.export(format="engine")
# 导出为 CoreML(iOS / macOS)
model.export(format="coreml")
# 导出为 TFLite(Android / 嵌入式)
model.export(format="tflite")
# 导出为 OpenVINO(Intel 设备)
model.export(format="openvino")
9.2 支持的导出格式
| 格式 | 参数 | 适用场景 |
|---|---|---|
| ONNX | onnx | 通用部署 |
| TensorRT | engine | NVIDIA GPU 高性能推理 |
| CoreML | coreml | Apple 设备 |
| TFLite | tflite | Android / 嵌入式 |
| OpenVINO | openvino | Intel CPU / VPU |
| TorchScript | torchscript | PyTorch 生态部署 |
| NCNN | ncnn | 移动端轻量推理 |
9.3 命令行导出
yolo export model=runs/train/my_yolo26_exp/weights/best.pt format=onnx
10. 常见问题与注意事项
10.1 训练前检查清单
- 虚拟环境已激活
-
yolo checks验证通过 -
data.yaml路径正确(推荐绝对路径) -
images和labels目录结构镜像对应 - 每个图片都有对应的
.txt标签文件 - 标签中类别 ID 从 0 开始,与
data.yaml中names顺序一致 - 标签坐标值在 0~1 范围内
- 至少有训练集和验证集
10.2 常见报错及解决
| 问题 | 原因 | 解决方案 |
|---|---|---|
CUDA out of memory | 显存不足 | 减小 batch 或 imgsz,或设置 batch=-1 自动适配 |
No labels found | 标签路径不对 | 检查 labels 目录是否与 images 镜像对应 |
Dataset not found | data.yaml 路径错误 | 使用绝对路径,检查 path / train / val 是否正确 |
RuntimeError (Windows) | 多进程问题 | 在脚本顶部加 if __name__ == "__main__": |
| 训练 loss 不下降 | 学习率不合适或数据问题 | 检查标注质量、调整 lr0、确认类别 ID 正确 |
| 验证 mAP 很低 | 数据量不足或过拟合 | 增加数据量、使用数据增强、减小模型尺寸 |
class id X out of range | 标签中的类别 ID 超过 nc | 确保标签 ID 范围为 0 到 nc-1 |
10.3 性能优化建议
- 数据质量 > 数据数量:标注准确比数据多更重要
- 数据增强:小数据集时尝试更多增强策略(Mosaic、MixUp、翻转等)
- 迁移学习:永远推荐从预训练模型开始(
.pt文件),除非领域差异极大 - 多尺度训练:设置
multi_scale=0.5让模型适应不同大小的目标 - 余弦学习率:长训练时设置
cos_lr=True,后期收敛更平稳 - 混合精度:
amp=True(默认开启),减少显存占用加速训练 - 图片尺寸:640 是默认值,小目标多时可以尝试 1280
10.4 数据集质量提升
- 使用 Roboflow 的数据增强功能增加样本多样性
- 确保类别均衡,各类别样本数量不要差距太大
- 标注完成后用 YOLO 的可视化功能抽检标注质量:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(data="data.yaml", epochs=1, plots=True)
# 查看 runs/train/exp/ 下的 labels.jpg 和 train_batch*.jpg
10.5 完整训练流程速览
1. 安装环境 → conda + pip install ultralytics
↓
2. 采集图片 → 用与推理一致的截图方式(推荐 ADB 截图),覆盖各种场景
↓
3. 标注数据 → LabelImg(YOLO 格式)或 Roboflow
↓
4. 整理数据 → images/ + labels/ 目录结构
↓
5. 配置文件 → 编写 data.yaml
↓
6. 开始训练 → model.train(data="data.yaml", epochs=100)
↓
7. 评估验证 → model.val() 查看 mAP 等指标
↓
8. 模型推理 → model("test.jpg") 使用训练好的模型
↓
9. 导出部署 → model.export(format="onnx") 部署到目标平台
参考资料: