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 本章知识结构图
下面这张图把本章的核心流程串起来了,从环境准备到训练监控再到断点续训,你可以对照着看:
4.6 本章小结
这一章我们走完了训练的全流程:从环境搭建到命令执行,从日志监控到断点恢复。你想想看,其实核心就三件事:配好环境、调好参数、盯好日志。断点续训是兜底手段,但最好别用到——训练前检查好数据路径和显存,能省很多麻烦。
我个人建议你第一次训练时,先用小数据集跑 10 轮试试水,确认流程没问题再上全量数据。这样即使出问题,损失也小。