YOLO resume 失效排坑:别让 export 毁了你的 last.pt

前言:本文记录了一次模型训练中断后无法恢复的排查过程。原本只是缺少 scipy 库的简单报错,却在修复后意外发现模型从零开始重新训练。经过层层排查,最终定位到 model.export() 导出 ONNX 时覆盖了权重文件,导致训练状态丢失。本文不仅记录了完整的排查思路,还提供了防止此类问题再次发生的代码级解决方案,适合所有使用 PyTorch 训练框架的开发者参考。

YOLO 训练中断后无法继续训练?可能是导出 ONNX 时覆盖了权重文件

原本这只是一次普通的报错,笔者本想着通过 resume=True 的方式继续训练,但是再次运行时发现无法接着训练该模型了。原本报错很容易解决,仅仅只是缺了一个 scipy 库,在终端运行一句命令即可解决。
报错
解决方案如下:

pip install scipy

问题解决

问题到此看似已经结束,但是当笔者在调整完路径准备继续训练时,发现模型从零开始重新训练了,同时图也画好了(一般训练结束时才会出图)。
问题再现
在这里插入图片描述

笔者好生疑惑,这是为什么,于是问了万能的 DeepSeek,在 DS 的指导下加了一行打印路径的代码试试情况。
DS指导
结果
DS老师训话中
悲 QWQ,遂笔者选择了微调模型。

原因分析:

笔者在 D 老师的指导下,思考了出现这种状况的原因,大概率是因为其中一行代码的结果。
罪魁祸首

path = model.export(format="onnx")

没错,就是这最后一行不起眼的代码,把导出的模型重命名后,粘贴回了 train-5\weights 文件夹,覆盖了原来的文件,导致原来的文件没有 epoch 和 optimizer,无法通过 resume=True 继续训练。
这行代码本来是用来X-AnyLabeling做数据标记而准备的,没想到成了覆盖epoch等信息的罪魁祸首。


解决方案:

为了避免这种情况,可以在导出 ONNX 格式前加个判断,从根本上防止这类事件再次发生。

# 导出 ONNX
export_enabled = True  # 你可以把这个改为 False 来禁用导出

if export_enabled and results:
    print("训练完成,开始导出 ONNX...")
    # 指定导出路径,避免与权重文件夹混淆(防止误覆盖)
    # 默认会生成在模型所在目录,名称为 last.onnx
    onnx_path = model.export(format="onnx", imgsz=1280)
    print(f"ONNX 模型已导出至: {onnx_path}")
elif not results:
    print("训练未成功执行,跳过 ONNX 导出。")
else:
    print("导出功能已禁用 (export_enabled=False),跳过。")

下面是整个问题的排查与解决流程图:

flowchart TD A["训练报错:缺少 scipy 库"] --> B["安装 scipy 解决报错"] B --> C["调整路径后继续训练"] C --> D{"模型是否从零开始训练?"} D -->|"是"| E["排查原因"] D -->|"否"| F["正常训练"] E --> G["询问 DeepSeek"] G --> H["打印路径情况"] H --> I["发现罪魁祸首:model.export()"] I --> J["该代码将 ONNX 模型导出并覆盖了权重文件"] J --> K["导致权重文件丢失 epoch 和 optimizer 信息"] K --> L["解决方案:添加导出开关判断"] L --> M["设置 export_enabled 变量"] M --> N{"训练成功且导出开启?"} N -->|"是"| O["导出 ONNX 模型"] N -->|"否"| P["跳过导出"] O --> Q["指定导出路径,避免误覆盖"] P --> Q

总结与建议

关键教训

  1. 警惕副作用代码model.export() 这类看似无关的导出代码,可能会意外覆盖关键训练文件。在训练脚本中,任何文件写入操作都应谨慎对待。
  2. 路径隔离:导出文件(如 ONNX 模型)应指定独立的输出目录,避免与权重文件夹 weights 混用,从根本上杜绝误覆盖。
  3. 添加防护开关:对于非核心功能(如模型导出),建议添加开关变量(如 export_enabled),让开发者可以显式控制是否执行,降低意外触发的风险。

最佳实践

  • 训练脚本中所有文件写入操作,建议先打印目标路径,确认无误后再执行。
  • 使用 resume=True 恢复训练前,检查权重文件是否包含 epochoptimizer 状态,避免白跑一轮。
  • 将模型导出、日志记录等辅助功能封装为独立函数,与主训练流程解耦,便于维护和调试。
posted @ 2026-09-12 00:25  Floatingfur  阅读(3)  评论(0)    收藏  举报