训练完成后模型保存在哪?workdirs目录下找
在使用OCR文字检测模型进行微调训练时,一个最常被问到的问题就是:训练好的模型到底保存在哪里了?很多人翻遍项目根目录、config文件夹、甚至output目录都找不到新生成的权重文件。其实答案很简单——它就安静地躺在workdirs/这个看似普通、却承载着所有训练成果的目录里。
本文将带你彻底理清 cv_resnet18_ocr-detection 模型的训练输出路径逻辑,不讲抽象概念,只说你打开终端就能验证的真实路径;不堆砌参数说明,只聚焦“我刚点完‘开始训练’,现在该去哪找模型”这个最朴素的需求。无论你是第一次尝试微调的新手,还是正在排查训练失败的老手,这篇内容都能帮你省下至少半小时的盲目搜索时间。
1. 为什么是 workdirs?不是 models 或 checkpoints?
很多用户习惯性地去models/、checkpoints/或weights/目录下翻找,结果一无所获。这背后其实有明确的设计逻辑:
models/目录存放的是原始预训练模型(如 ResNet18 backbone 的 ImageNet 权重),属于只读资源,不会被训练过程修改;checkpoints/并未在本镜像中创建——该 WebUI 采用的是单次完整训练 + 最终模型保存模式,而非每轮保存 checkpoint;workdirs/是本镜像专为训练任务生命周期设计的工作空间:从数据加载、日志记录、中间缓存,到最终模型权重和评估报告,全部集中管理。
你可以把workdirs/理解成一个“训练沙盒”:每次点击“开始训练”,系统都会新建一个带时间戳的子目录(如workdirs/20260105_143022/),所有产出物都严格限定在这个目录内,互不干扰,也便于你回溯不同实验的结果。
关键提示:
workdirs/目录位于项目根路径下,即/root/cv_resnet18_ocr-detection/workdirs/。它不会出现在 WebUI 界面的任何按钮或输入框中,必须通过命令行访问。
2. 训练完成后的标准输出结构
当你在 WebUI 的「训练微调」Tab 中点击“开始训练”并等待进度条走完,终端或日志中出现类似Training finished. Model saved to: workdirs/20260105_143022/的提示时,就可以进入对应目录查看成果了。
以一次典型训练为例,workdirs/20260105_143022/下的标准结构如下:
workdirs/ └── 20260105_143022/ ├── best.pth # 最优模型权重(按验证集指标自动保存) ├── last.pth # 最后一轮模型权重(无论是否最优) ├── train.log # 完整训练日志(含 loss、acc、时间戳) ├── eval_results.json # 验证集详细指标(precision/recall/f1) ├── visualization/ # 可视化结果(检测效果示例图) │ ├── val_sample_0.png │ └── val_sample_1.png └── config.yaml # 本次训练的实际配置(含 batch_size、lr 等)其中,真正用于后续推理或导出的模型文件只有两个:best.pth和last.pth。它们的区别非常实际:
best.pth:在训练过程中,系统会持续监控验证集上的 F1 分数(或其他设定指标),一旦发现更高值,就覆盖保存此文件。这是你应优先选用的模型,代表本次训练能达到的最高质量。last.pth:训练结束时的最终状态快照。如果训练后期出现过拟合,它的效果可能反而不如best.pth。
2.1 如何快速确认模型已成功保存?
别急着复制文件,先用一条命令验证完整性:
cd /root/cv_resnet18_ocr-detection ls -lh workdirs/*/best.pth正常输出应类似:
-rw-r--r-- 1 root root 45M Jan 5 14:32 workdirs/20260105_143022/best.pth如果看到No such file or directory,说明训练未成功完成(可能是数据集路径错误、标注格式异常或显存不足)。此时应立即查看train.log文件定位报错位置。
3. 模型文件怎么用?直接替换原模型即可
拿到best.pth后,你可能会疑惑:它和原始模型是什么关系?能不能直接拿来替换 WebUI 里的默认检测器?
答案是:可以,而且只需一步操作。
cv_resnet18_ocr-detection 的推理代码默认从固定路径加载权重。你只需将训练好的best.pth复制到以下位置,并重命名为model.pth:
cp workdirs/20260105_143022/best.pth \ /root/cv_resnet18_ocr-detection/models/model.pth然后重启 WebUI 服务:
bash stop_app.sh bash start_app.sh再次访问http://服务器IP:7860,你会发现所有检测功能(单图、批量)已自动切换为你微调后的新模型。无需修改任何代码,也不需要重新配置路径——这就是本镜像为工程落地做的关键简化。
注意:
models/model.pth是 WebUI 启动时唯一读取的权重文件。如果你同时有多个微调版本,只需反复执行上述cp命令并重启服务,即可快速切换对比效果。
4. ONNX 导出前,必须确认模型路径正确
WebUI 的「ONNX 导出」功能并非直接转换训练日志中的模型,而是读取当前生效的models/model.pth文件。这意味着:
- 如果你刚完成训练但还没执行
cp ... model.pth,导出的 ONNX 模型仍是原始预训练版本; - 如果你导出后又替换了
model.pth,已导出的 ONNX 文件不会自动更新,需重新点击「导出 ONNX」。
因此,标准的微调+部署流程应为三步闭环:
- 训练→ 在 WebUI 中配置数据集并启动训练
- 部署→
cp workdirs/*/best.pth models/model.pth+ 重启服务 - 导出→ 在 WebUI 中点击「导出 ONNX」,获得可跨平台使用的轻量模型
导出的 ONNX 文件默认保存在outputs/onnx/目录下,文件名包含输入尺寸信息,例如model_800x800.onnx。你可以用 Python 脚本直接加载它,完全脱离 PyTorch 环境:
import onnxruntime as ort import numpy as np # 加载导出的 ONNX 模型 session = ort.InferenceSession("outputs/onnx/model_800x800.onnx") # 构造模拟输入(NHWC → NCHW,归一化) dummy_input = np.random.randn(1, 3, 800, 800).astype(np.float32) dummy_input /= 255.0 # 推理 outputs = session.run(None, {"input": dummy_input}) print("ONNX 模型加载成功,输出形状:", [o.shape for o in outputs])这段代码不依赖 PyTorch,仅需onnxruntime,可在 CPU 服务器、边缘设备甚至手机端运行,真正实现“一次训练,多端部署”。
5. 常见误区与避坑指南
尽管路径逻辑清晰,但在实际操作中,仍有几个高频踩坑点值得单独强调:
5.1 误区一:“workdirs 是空的,是不是没生成?”
workdirs/目录本身是空的,不代表没生成——它只是父目录。真正的子目录名由训练启动时间动态生成,格式为YYYYMMDD_HHMMSS(如20260105_143022)。如果你在训练后立刻ls workdirs/却看到空白,大概率是因为:
- 训练尚未完成(进度条卡住或后台崩溃);
- 你误入了其他终端会话,实际训练在另一个 shell 中运行;
- 系统时间被修改过,导致时间戳异常(极少见)。
正确做法:训练启动后,用tail -f workdirs/*/train.log实时跟踪日志,看到Training finished.才算真正结束。
5.2 误区二:“我改了 config.yaml,为什么没生效?”
workdirs/*/config.yaml是训练完成后的快照记录,不是运行时配置文件。它只供你事后复盘使用,修改它对当前或下次训练均无影响。真正的训练参数来自 WebUI 界面输入,由前端传给后端脚本动态生成临时配置。
正确做法:所有参数调整(batch size、学习率等)必须在 WebUI 的「训练微调」Tab 中完成,点击“开始训练”才会生效。
5.3 误区三:“模型文件太大,是不是出错了?”
ResNet18 主干网络 + OCR 检测头的完整权重文件通常在 40–50MB 区间。如果你看到best.pth只有几 MB,或者大小与last.pth差异极大(如一个 45MB,一个 2MB),说明:
best.pth可能因磁盘满、权限不足而写入不全;- 训练中途被 kill,
last.pth是残缺状态。
正确做法:用md5sum校验两个文件是否可正常加载:
python -c "import torch; print(torch.load('workdirs/20260105_143022/best.pth').keys())"若报错EOFError或KeyError,则文件损坏,需重新训练。
6. 总结:三句话记住模型保存核心逻辑
- 位置唯一:所有训练产出物,包括最优模型
best.pth,都严格保存在workdirs/时间戳/子目录下,没有例外,也不分散; - 使用直接:只需
cp workdirs/*/best.pth models/model.pth一行命令,即可让 WebUI 全功能切换至你的微调模型; - 导出可靠:ONNX 导出功能始终基于当前
models/model.pth,确保你导出的就是刚刚验证过的那个版本。
至此,你已经掌握了 cv_resnet18_ocr-detection 模型训练成果的“寻宝地图”。下一步,不妨挑一张你业务场景中的真实图片,用新模型跑一次单图检测——当那些原本漏检的模糊小字、倾斜文本、复杂背景下的文字被精准框出时,你会真切感受到:那几十MB的best.pth文件,不只是数据,更是你定制化OCR能力的实体化身。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。