YOLOv8 模型断点续训完整指南

YOLOv8 基于上次训练结果继续训练(断点续训)的核心要点是:加载训练过程中自动生成的 last.pt 检查点(包含优化器、EMA、已训练轮次、学习率等完整训练状态),并开启resume=True 参数。需特别注意:切勿使用 best.pt 进行续训,该文件仅保存验证最优权重,不包含任何训练状态,无法实现无缝续训。

以下将从检查点定位、命令行续训、Python脚本续训、核心参数说明、常见问题避坑、完整流程示例六部分,为读者提供可直接落地、无冗余的实操指南。


一、先找到上次训练的检查点(核心前提)

YOLOv8 训练完成后,检查点文件会默认保存至固定路径,不同任务的保存路径如下:

任务类型 保存路径
目标检测 runs/detect/train/weights/last.pt
图像分割 runs/segment/train/weights/last.pt
图像分类 runs/classify/train/weights/last.pt

文件说明

  • last.pt续训必用文件,保存完整训练状态(含已训练轮次epoch、优化器参数、学习率调度器、EMA权重等),可实现无缝衔接续训,无需重复配置基础参数。
  • best.pt:仅保存验证集最优模型权重,不可用于断点续训——若用其启动训练,会重置优化器、学习率等所有状态,从epoch=0重新开始。

二、命令行CLI续训(最常用,适合快速操作)

1. 标准续训(从上次中断轮次继续,总epochs不变)

1
2
# 基础格式(detect任务)
yolo detect train resume model=runs/detect/train/weights/last.pt

核心要点:需同时包含 resume 参数和 last.pt 完整路径;无需重复填写data、epochs、imgsz等参数——系统会自动从 last.pt 读取上次训练的所有配置,实现无缝续训。

实操示例:若上次训练中断时已训练至epoch 30,总计划训练100轮,执行以下命令即可从epoch 31继续:

1
yolo detect train resume model=runs/detect/my_train/weights/last.pt

2. 追加更多epochs(在原训练基础上增加训练轮次)

若原训练已完成既定轮次,或想在中断后追加更多训练轮次,只需在续训命令中指定新的总epochs(新总轮次需大于上次已训练轮次)即可:

1
2
# 原训练100轮,现在续训并追加至150轮(新增50轮训练)
yolo detect train resume model=runs/detect/train/weights/last.pt epochs=150

3. 极简续训(自动查找最近一次训练的last.pt)

若最近一次训练的检查点未被移动或删除,可直接使用 resume 参数,无需手动指定 last.pt 路径:

1
yolo detect train resume

三、Python脚本续训(适合代码集成、批量训练)

1. 标准续训(加载last.pt + 开启resume=True,无缝衔接)

1
2
3
4
5
6
7
8
9
10
11
12
13
from ultralytics import YOLO

# 1. 加载上次训练的last.pt(核心步骤,确保路径正确)
model = YOLO("runs/detect/train/weights/last.pt")

# 2. 启动续训:resume=True 是关键,自动继承上次所有训练配置
results = model.train(
resume=True, # 必须开启,启用断点续训功能
# 以下参数可选:仅当需要调整时填写(不填写则继承上次配置)
# epochs=150, # 示例:原100轮→150轮,追加50轮训练
# batch=16, # 示例:调整批次大小(根据显卡显存灵活设置)
# imgsz=640 # 示例:调整输入图像尺寸(需与上次一致)
)

2. 追加训练(基于上次权重微调,不严格续训状态)

若无需继承上次的优化器、训练轮次等状态,仅需用上次训练的权重作为初始化进行微调(如新增少量数据集、调整模型参数),可加载 best.ptlast.pt,但不开启resume=True

1
2
3
4
5
6
model = YOLO("runs/detect/train/weights/best.pt")  # 也可使用last.pt
results = model.train(
data="mydata.yaml", # 需指定数据集配置(无法继承上次配置)
epochs=50, # 从头计算50轮训练,非续接上次轮次
lr0=0.0001 # 微调用小学习率,避免过拟合(推荐值)
)

四、核心原理与关键参数说明(避坑核心)

1. resume=True 的核心作用

  • 自动读取 last.pt 中记录的已训练轮次(epoch),从 epoch+1 开始继续训练,无需手动记录中断轮次。
  • 加载完整训练状态(含优化器参数、学习率调度器、EMA权重),确保训练连续性——不会重置学习率、动量等关键参数,避免训练效果断层。
  • 自动复用上次训练的所有配置(含数据集配置data.yaml、批次大小batch、输入图像尺寸imgsz等),无需重复配置,提升实操效率。

2. 必须保持一致的配置(避免报错、训练断层)

配置类型 要求
数据集相关 需完全一致:数据集路径、类别数量(nc)、类别名称(names)、标签格式
模型核心结构 不可修改:模型版本(如yolov8n→yolov8s)、损失函数、数据增强核心参数

3. 常见参数冲突处理(实操必备)

  • 续训时仅修改需调整的参数(如epochs、batch、device),其余参数保持默认,避免手动配置与last.pt 中的配置冲突。
  • 若出现CUDA内存不足(显存不够):续训时可手动指定较小的batch尺寸(如batch=8),系统会自动覆盖上次的batch配置。

五、常见问题与避坑(实操高频问题解决)

1. 报错:Resume checkpoint not found(找不到续训检查点)

原因:路径错误;指定了best.pt而非last.pt;训练因强制中断导致 last.pt 损坏。

解决:确认命令或脚本中指定的路径必须指向 last.pt;若文件损坏,只能用 best.pt 重新启动训练(无法续训)。

2. 续训后从epoch=0开始(未实现真正续训)

原因:使用best.pt 而非 last.pt;未开启 resume=True(Python脚本)或未加 resume 参数(命令行)。

解决:更换为 last.pt,并确保开启resume=True(脚本)或添加 resume 参数(命令行)。

3. 学习率/优化器异常(续训后训练效果变差)

原因:使用 best.pt 续训(无优化器状态,会重置学习率);手动修改学习率、优化器类型等参数,与 last.pt 中的状态冲突。

解决:改用 last.pt 续训,续训时不随意修改学习率、优化器相关参数。

4. 数据集/类别不匹配(报错或预测异常)

原因:续训时使用的data.yaml与上次训练的配置不一致(如类别数、类别名称、数据集路径修改)。

解决:确保续训时使用的data.yaml与上次训练完全一致;若需修改数据集,建议采用”微调”方式(不开启resume=True)。


六、完整示例流程(从初始训练→中断→续训,实操可直接套用)

Step1 初始训练(设定总轮次,正常启动训练)

1
2
yolo detect train model=yolov8n.pt data=mydata.yaml epochs=50 imgsz=640 batch=16
# 训练过程中,检查点会保存至:runs/detect/train/weights/last.pt(此时记录epoch=50)

Step2 模拟中断(如手动Ctrl+C、断电等意外情况)

假设训练中断时,已训练至epoch 30(未完成50轮),此时 last.pt会保存当前训练状态(epoch=30、优化器参数等)。

Step3 断点续训(从epoch 31继续,直至完成50轮,或追加至更多轮次)

1
2
3
# 续训至100轮示例
yolo detect train resume model=runs/detect/train/weights/last.pt epochs=100
# 系统自动读取last.pt中的状态,从epoch=31开始训练,直至完成100轮,继承所有初始配置

七、拓展补充(进阶实操必备)

1. 自定义检查点保存路径(避免路径混乱)

若需将检查点保存至指定路径,可在初始训练时指定projectname 参数:

1
2
3
4
5
6
# 初始训练:指定保存路径(project为文件夹,name为子文件夹)
yolo detect train model=yolov8n.pt data=mydata.yaml epochs=50 project=my_yolov8_train name=detect_task
# 检查点保存路径:my_yolov8_train/detect_task/weights/last.pt

# 续训时指定该路径
yolo detect train resume model=my_yolov8_train/detect_task/weights/last.pt epochs=100

2. 续训时调整学习率(按需优化)

若续训时发现模型出现过拟合、收敛变慢等问题,可在续训命令/脚本中微调学习率:

1
yolo detect train resume model=runs/detect/train/weights/last.pt epochs=100 lr0=0.0005
1
2
3
4
5
6
model = YOLO("runs/detect/train/weights/last.pt")
results = model.train(
resume=True,
epochs=100,
lr0=0.0005 # 微调学习率,比初始学习率(0.01)小一个数量级,避免过拟合
)

说明:续训时学习率建议微调(通常为初始学习率的1/10~1/2),避免因学习率过高导致模型震荡、效果退化。

3. 多任务续训通用逻辑(检测/分割/分类通用)

无论是什么任务,断点续训的核心逻辑完全一致,仅需对应修改任务类型和检查点路径:

1
2
3
4
5
# 图像分割续训
yolo segment train resume model=runs/segment/train/weights/last.pt epochs=80

# 图像分类续训
yolo classify train resume model=runs/classify/train/weights/last.pt epochs=60

4. 续训日志查看与分析(排查问题)

续训时会自动延续上次的训练日志,日志保存路径与检查点路径一致(runs/xxx/train/results.csv),可通过以下方式查看:

  1. 直接打开 results.csv,查看每一轮的损失值、mAP、准确率等指标,判断续训是否正常收敛。
  2. 使用TensorBoard查看日志可视化结果:
1
tensorboard --logdir=runs/detect/train/logs

注意:若续训后指标出现断崖式下降,需检查 last.pt 完整性、数据集配置一致性或学习率设置。


八、总结

YOLOv8 断点续训的核心是「加载 last.pt + 开启 resume=True」,关键在于保证数据集配置、模型结构与上次训练一致,避免因参数冲突、文件损坏导致续训失败。

无论是命令行快速操作,还是Python脚本集成,均需遵循这一核心逻辑;若需追加轮次、微调参数,仅需在续训时指定相关参数即可。

通过以上完整指南,可轻松实现YOLOv8模型的无缝续训,提升训练效率,避免因意外中断导致的训练成果浪费。