Ultralytics YOLO26 完整训练指南(从零开始)

0 阅读25分钟

YOLO26 是 Ultralytics 于 2026 年 1 月发布的最新一代 YOLO 模型,具备端到端无 NMS 推理、MuSGD 混合优化器、CPU 推理速度提升最高 43% 等特性。本文档涵盖从环境安装、数据标注、数据集配置、模型训练到推理部署的完整流程。

image.png


目录

  1. YOLO26 简介与模型选择
  2. 环境安装
  3. 训练图片获取与注意事项
  4. 标注工具推荐与使用
  5. 数据集目录结构与配置
  6. 模型训练
  7. 训练结果验证
  8. 模型推理(使用训练好的模型)
  9. 模型导出与部署
  10. 常见问题与注意事项

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 推理速度适用场景
yolo26n2.4M40.938.9ms边缘设备、移动端、实时性要求高
yolo26s9.5M48.687.2ms轻量级服务器、嵌入式设备
yolo26m20.4M53.1220.0ms精度与速度平衡
yolo26l24.8M55.0286.2ms精度优先场景
yolo26x55.7M57.5525.8ms最高精度需求

选择建议:

  • 初学者/快速验证:选 yolo26nyolo26s
  • 生产环境平衡:选 yolo26m
  • 追求最高精度:选 yolo26lyolo26x

1.3 支持的任务类型

任务模型后缀说明
目标检测无后缀yolo26n.pt
实例分割-segyolo26n-seg.pt
图像分类-clsyolo26n-cls.pt
姿态估计-poseyolo26n-pose.pt
旋转目标检测-obbyolo26n-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 系统要求

项目最低要求推荐配置
Python3.8+3.10 / 3.11
PyTorch1.8+2.0+
CUDA(GPU 训练)11.2+12.1+
显卡(GPU 训练)4GB 显存以上NVIDIA RTX 3060 及以上,8GB+ 显存
内存8GB16GB+
操作系统Windows / macOS / LinuxUbuntu 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 screencapadb 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_pathNone 而崩溃:

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。

  1. 打开图片目录Open Dir → 选择你的图片文件夹
  2. 选中一张图片:点击左侧文件列表中的任意图片,确保图片已加载显示在画布上
  3. 切换保存格式:点击左侧工具栏的 PascalVOC 按钮,没看到可能在底部的箭头里面,展开就可以看到,切换为 YOLO 格式(很重要!)
  4. 设置保存目录Change Save Dir → 选择标签保存文件夹(建议与图片分开存放)
  5. 创建标注
    • 快捷键 W:创建矩形框
    • 用鼠标拖拽框选目标
    • 输入类别名称(保持一致,如 catdog
    • 快捷键 D:下一张图片
    • 快捷键 A:上一张图片
    • 快捷键 Ctrl+S:保存标注
  6. 预定义类别:在保存目录(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 在线标注(团队推荐)

  1. 访问 roboflow.com,注册账号
  2. 创建项目,选择 Object Detection
  3. 上传图片
  4. 在线框选标注目标、设定类别
  5. 设置训练集/验证集/测试集比例(推荐 70/20/10)
  6. 添加数据增强预处理(可选)
  7. 导出时选择 YOLOv8 格式(与 YOLO26 兼容),下载数据集

4.5 标注注意事项

  • 框要贴紧目标:不要留太多空白,也不要裁切目标
  • 类别名称统一:同一类目标全程用同一名称,区分大小写
  • 类别粒度按需求定,不是越细越好
    • 类别越多,每个类别需要的训练数据越多,模型学习难度越大
    • 如果只需要知道"这里有个怪物",标一个 monster 就够;如果需要区分怪物种类再细分 monster_amonster_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           # 数据集配置文件

关键要求:

  • imageslabels 目录结构必须完全镜像
  • 每个图片文件必须有一个同名的 .txt 标签文件
  • 如果某张图片没有标注目标,对应的 .txt 文件内容为空(文件必须存在)

5.2 数据集划分

标注完成后,需要将图片和标签按比例(推荐 80/20)随机划分到 trainval 目录中。可以让 AI 根据你的实际目录路径生成划分脚本,核心逻辑就是:随机打乱图片列表 → 按比例分成两组 → 把图片和同名 .txt 标签分别复制到对应的 images/trainimages/vallabels/trainlabels/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 配置文件路径
epochs100训练总轮数
imgsz640输入图像尺寸(建议 640)
batch16批次大小。设为 -1 可自动适配 60% 显存
deviceauto设备:0(GPU)、cpumps(Mac)、0,1(多 GPU)
optimizerauto优化器:auto 会根据数据量自动选择 MuSGD 或 AdamW
lr00.01初始学习率
patience100早停耐心值(验证指标多少轮不提升就停止)
save_period-1每隔多少轮保存一次模型(-1 仅保存 best 和 last)
cacheFalse缓存图片到内存 True 或磁盘 disk,加速训练
workers8数据加载线程数
pretrainedTrue是否使用预训练权重
resumeFalse是否从断点继续训练
ampTrue混合精度训练,减少显存占用
cos_lrFalse余弦学习率衰减
close_mosaic10最后 N 轮关闭 Mosaic 增强
freezeNone冻结前 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 训练技巧

  1. 先用小模型验证流程:用 yolo26n + 少量 epoch 跑通整个流程后,再用大模型正式训练
  2. batch 大小调整:显存不足时减小 batch,或设为 -1 自动适配
  3. 图片缓存加速:数据集不大时用 cache=True 将图片缓存到内存
  4. 数据增强:Ultralytics 默认开启 Mosaic、翻转等增强,通常无需额外配置
  5. 早停机制patience=100 表示验证指标 100 轮不提升就停止,避免过拟合
  6. 学习率:使用预训练权重时建议 lr0=0.01;微调时可降到 0.001
  7. 训练轮数:小数据集 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 关键指标说明

指标含义理想值
mAP50IoU=0.5 时的平均精度> 0.8
mAP50-95IoU=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 支持的导出格式

格式参数适用场景
ONNXonnx通用部署
TensorRTengineNVIDIA GPU 高性能推理
CoreMLcoremlApple 设备
TFLitetfliteAndroid / 嵌入式
OpenVINOopenvinoIntel CPU / VPU
TorchScripttorchscriptPyTorch 生态部署
NCNNncnn移动端轻量推理

9.3 命令行导出

yolo export model=runs/train/my_yolo26_exp/weights/best.pt format=onnx

10. 常见问题与注意事项

10.1 训练前检查清单

  • 虚拟环境已激活
  • yolo checks 验证通过
  • data.yaml 路径正确(推荐绝对路径)
  • imageslabels 目录结构镜像对应
  • 每个图片都有对应的 .txt 标签文件
  • 标签中类别 ID 从 0 开始,与 data.yamlnames 顺序一致
  • 标签坐标值在 0~1 范围内
  • 至少有训练集和验证集

10.2 常见报错及解决

问题原因解决方案
CUDA out of memory显存不足减小 batchimgsz,或设置 batch=-1 自动适配
No labels found标签路径不对检查 labels 目录是否与 images 镜像对应
Dataset not founddata.yaml 路径错误使用绝对路径,检查 path / train / val 是否正确
RuntimeError (Windows)多进程问题在脚本顶部加 if __name__ == "__main__":
训练 loss 不下降学习率不合适或数据问题检查标注质量、调整 lr0、确认类别 ID 正确
验证 mAP 很低数据量不足或过拟合增加数据量、使用数据增强、减小模型尺寸
class id X out of range标签中的类别 ID 超过 nc确保标签 ID 范围为 0nc-1

10.3 性能优化建议

  1. 数据质量 > 数据数量:标注准确比数据多更重要
  2. 数据增强:小数据集时尝试更多增强策略(Mosaic、MixUp、翻转等)
  3. 迁移学习:永远推荐从预训练模型开始(.pt 文件),除非领域差异极大
  4. 多尺度训练:设置 multi_scale=0.5 让模型适应不同大小的目标
  5. 余弦学习率:长训练时设置 cos_lr=True,后期收敛更平稳
  6. 混合精度amp=True(默认开启),减少显存占用加速训练
  7. 图片尺寸: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") 部署到目标平台

参考资料: