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 | # 基础格式(detect任务) |
核心要点:需同时包含 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 | # 原训练100轮,现在续训并追加至150轮(新增50轮训练) |
3. 极简续训(自动查找最近一次训练的last.pt)
若最近一次训练的检查点未被移动或删除,可直接使用 resume 参数,无需手动指定 last.pt 路径:
1 | yolo detect train resume |
三、Python脚本续训(适合代码集成、批量训练)
1. 标准续训(加载last.pt + 开启resume=True,无缝衔接)
1 | from ultralytics import YOLO |
2. 追加训练(基于上次权重微调,不严格续训状态)
若无需继承上次的优化器、训练轮次等状态,仅需用上次训练的权重作为初始化进行微调(如新增少量数据集、调整模型参数),可加载 best.pt 或 last.pt,但不开启resume=True:
1 | model = YOLO("runs/detect/train/weights/best.pt") # 也可使用last.pt |
四、核心原理与关键参数说明(避坑核心)
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 | yolo detect train model=yolov8n.pt data=mydata.yaml epochs=50 imgsz=640 batch=16 |
Step2 模拟中断(如手动Ctrl+C、断电等意外情况)
假设训练中断时,已训练至epoch 30(未完成50轮),此时 last.pt会保存当前训练状态(epoch=30、优化器参数等)。
Step3 断点续训(从epoch 31继续,直至完成50轮,或追加至更多轮次)
1 | # 续训至100轮示例 |
七、拓展补充(进阶实操必备)
1. 自定义检查点保存路径(避免路径混乱)
若需将检查点保存至指定路径,可在初始训练时指定project 和 name 参数:
1 | # 初始训练:指定保存路径(project为文件夹,name为子文件夹) |
2. 续训时调整学习率(按需优化)
若续训时发现模型出现过拟合、收敛变慢等问题,可在续训命令/脚本中微调学习率:
1 | yolo detect train resume model=runs/detect/train/weights/last.pt epochs=100 lr0=0.0005 |
1 | model = YOLO("runs/detect/train/weights/last.pt") |
说明:续训时学习率建议微调(通常为初始学习率的1/10~1/2),避免因学习率过高导致模型震荡、效果退化。
3. 多任务续训通用逻辑(检测/分割/分类通用)
无论是什么任务,断点续训的核心逻辑完全一致,仅需对应修改任务类型和检查点路径:
1 | # 图像分割续训 |
4. 续训日志查看与分析(排查问题)
续训时会自动延续上次的训练日志,日志保存路径与检查点路径一致(runs/xxx/train/results.csv),可通过以下方式查看:
- 直接打开
results.csv,查看每一轮的损失值、mAP、准确率等指标,判断续训是否正常收敛。 - 使用TensorBoard查看日志可视化结果:
1 | tensorboard --logdir=runs/detect/train/logs |
注意:若续训后指标出现断崖式下降,需检查
last.pt完整性、数据集配置一致性或学习率设置。
八、总结
YOLOv8 断点续训的核心是「加载 last.pt + 开启 resume=True」,关键在于保证数据集配置、模型结构与上次训练一致,避免因参数冲突、文件损坏导致续训失败。
无论是命令行快速操作,还是Python脚本集成,均需遵循这一核心逻辑;若需追加轮次、微调参数,仅需在续训时指定相关参数即可。
通过以上完整指南,可轻松实现YOLOv8模型的无缝续训,提升训练效率,避免因意外中断导致的训练成果浪费。