4. 模型训练实战:Ultralytics库安装、训练命令与参数解析、训练日志监控、断点续训

好,到了真正动手训练模型的环节了。前面我们聊了数据集怎么准备、怎么标,现在终于可以跑起来看看效果。这一章我会把从安装库到监控训练、再到断点续训的完整流程走一遍,中间穿插一些我踩过的坑。

4.1 Ultralytics库安装与环境配置

Ultralytics 这个库,说白了就是 YOLOv8/v9/v10 的官方训练工具箱。安装它其实很简单,但有几个细节不注意容易翻车。

核心安装命令:

pip install ultralytics

这条命令会自动拉取 PyTorch、torchvision 等依赖。但我建议你先装好 PyTorch 再装 ultralytics,因为 pip 自动装的 PyTorch 版本可能不是最适合你显卡的。

我个人习惯用 conda 创建一个干净环境:

conda create -n yolov8 python=3.10 -y
conda activate yolov8
# 先装 PyTorch(根据你的 CUDA 版本选命令)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118
# 再装 ultralytics
pip install ultralytics

验证安装:

python -c "from ultralytics import YOLO; print(YOLO.__version__)"

如果能正常输出版本号,说明环境没问题。

嗯,这里要注意:如果你用的是 Windows,建议用 PowerShell 或 CMD 管理员模式装。我在项目里遇到过因为权限不够导致 dll 加载失败的情况,折腾了半天才发现是安装路径有中文。

4.2 训练命令与核心参数解析

装好库之后,训练一个模型只需要一行命令。但这一行命令背后有几十个参数可以调。我们先从最常用的开始。

4.2.1 基础训练命令

yolo train model=yolov8n.pt data=coco128.yaml epochs=100 imgsz=640 batch=16 device=0

这条命令的意思:用 yolov8n 的预训练权重,在 coco128 数据集上训练 100 轮,输入图片尺寸 640,批次大小 16,用 GPU 0 训练。

参数速查表(我常用的):

参数 默认值 说明
model yolov8n.pt 模型权重路径或配置文件名
data coco128.yaml 数据集配置文件路径
epochs 100 训练总轮数
batch 16 批次大小,根据显存调整
imgsz 640 输入图片尺寸(正方形)
device cpu 训练设备:0,1,2 或 cpu
workers 8 数据加载线程数
lr0 0.01 初始学习率
patience 50 早停耐心值,多少轮没提升就停
save True 是否保存检查点
project runs/train 项目保存路径
name exp 实验名称

4.2.2 参数调优经验

说说我的一些习惯:

  • batch 大小:能大尽量大,但别爆显存。我一般先设 16,如果显存有余量就加到 32。batch 太小的话,BN 层统计不准,模型容易震荡。
  • imgsz:不是越大越好。640 是性价比最高的尺寸。我之前试过 1280,mAP 只涨了 0.5%,但训练时间翻了三倍。
  • workers:Windows 下建议设成 0 或 2,设高了容易报 DataLoader 错误。Linux 下可以设到 8 或 16。
  • patience:我习惯设 30-50。设太小容易早停,设太大浪费时间。

我曾经踩过的坑: 有一次训练时忘了设 device,结果默认用 CPU 跑了 20 个小时才发现。后来我习惯在命令里显式写上 device=0,或者在代码里加个判断:

import torch
device = 'cuda' if torch.cuda.is_available() else 'cpu'

4.3 训练日志监控

训练跑起来之后,你不能扔那儿不管。监控日志能帮你及时发现过拟合、学习率异常、梯度爆炸等问题。

4.3.1 终端实时输出

Ultralytics 默认会在终端打印每一轮的训练信息,大概长这样:

     Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances   Size
      1/100      5.8G      1.452      1.234      1.123         45     640
      2/100      5.8G      1.321      1.112      1.045         52     640
      3/100      5.8G      1.198      1.045      0.987         48     640

重点关注 box_loss 和 cls_loss 的下降趋势。如果 loss 连续 10 轮不降反升,可能是学习率太大或者数据有问题。

4.3.2 TensorBoard 可视化

我个人更喜欢用 TensorBoard 看曲线。Ultralytics 默认会生成 TensorBoard 日志,你只需要在另一个终端启动:

tensorboard --logdir runs/train

然后在浏览器打开 http://localhost:6006,就能看到 loss 曲线、mAP 曲线、学习率变化等。我习惯把 mAP50 和 mAP50-95 放在一起看,如果 mAP50 很高但 mAP50-95 很低,说明模型对小目标或遮挡目标检测不好。

小技巧: 训练时加上 plots=True 参数,Ultralytics 会自动生成混淆矩阵、PR 曲线、F1 曲线等图表,保存在 runs/train/exp 目录下。

yolo train model=yolov8n.pt data=coco128.yaml plots=True

4.3.3 日志文件分析

训练结束后,所有日志都保存在 runs/train/exp/ 目录下。我经常用 Python 脚本批量分析多个实验的日志:

import pandas as pd
import matplotlib.pyplot as plt

# 读取训练结果
results = pd.read_csv('runs/train/exp/results.csv')
plt.plot(results['epoch'], results['metrics/mAP50(B)'])
plt.xlabel('Epoch')
plt.ylabel('mAP50')
plt.show()

这样能快速对比不同参数组合的效果。

4.4 断点续训

训练到一半断电了、显存炸了、或者你想临时调个参数——别慌,Ultralytics 支持断点续训。

4.4.1 自动保存检查点

训练过程中,Ultralytics 会自动保存两种检查点:

  • last.pt:最后一轮的权重,每轮都更新。
  • best.pt:验证集上 mAP 最高的权重。

这两个文件保存在 runs/train/exp/weights/ 目录下。

4.4.2 恢复训练命令

假设你训练到第 50 轮时断电了,恢复训练只需要:

yolo train model=runs/train/exp/weights/last.pt data=coco128.yaml epochs=100 resume=True

关键参数 resume=True 会自动读取上次训练的状态,包括当前轮数、优化器状态、学习率调度器等。

注意: 恢复训练时,epochs 参数要填总轮数,不是剩余轮数。比如你原来设了 100 轮,训练到 50 轮断了,恢复时还是写 epochs=100,Ultralytics 会自动从第 51 轮开始。

4.4.3 手动指定恢复点

有时候你想从某个特定轮次恢复,比如你觉得第 30 轮的权重泛化性更好,可以手动指定:

yolo train model=runs/train/exp/weights/epoch30.pt data=coco128.yaml epochs=100

但这样不会恢复优化器状态,相当于用第 30 轮的权重重新开始训练。我一般只在想换学习率策略时才这么干。

我曾经踩过的坑: 有一次我换了数据集路径后直接恢复训练,结果报错说找不到图片。后来我养成习惯:恢复训练前先检查 data 参数指向的 yaml 文件路径是否正确。如果数据集移动了位置,记得更新 yaml 里的路径。

4.5 本章知识结构图

下面这张图把本章的核心流程串起来了,从环境准备到训练监控再到断点续训,你可以对照着看:

YOLO训练实战流程 YOLO训练实战流程 1. 环境准备 conda创建环境 pip install ultralytics 2. 训练命令 yolo train model=... 参数:batch/imgsz/lr0 3. 日志监控 终端实时输出 TensorBoard 4. 断点续训 last.pt / best.pt resume=True 恢复训练 💡 核心要点 环境隔离 → 参数调优 → 实时监控 → 断点恢复,形成闭环

4.6 本章小结

这一章我们走完了训练的全流程:从环境搭建到命令执行,从日志监控到断点恢复。你想想看,其实核心就三件事:配好环境、调好参数、盯好日志。断点续训是兜底手段,但最好别用到——训练前检查好数据路径和显存,能省很多麻烦。

我个人建议你第一次训练时,先用小数据集跑 10 轮试试水,确认流程没问题再上全量数据。这样即使出问题,损失也小。