news 2026/4/17 22:03:32

训练完成后模型保存在哪?workdirs目录下找

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
训练完成后模型保存在哪?workdirs目录下找

训练完成后模型保存在哪?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.pthlast.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」。

因此,标准的微调+部署流程应为三步闭环:

  1. 训练→ 在 WebUI 中配置数据集并启动训练
  2. 部署cp workdirs/*/best.pth models/model.pth+ 重启服务
  3. 导出→ 在 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())"

若报错EOFErrorKeyError,则文件损坏,需重新训练。

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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 13:28:48

如何用OCR技术解决文档数字化需求?cv_resnet18_ocr-detection给出答案

如何用OCR技术解决文档数字化需求?cv_resnet18_ocr-detection给出答案 在日常办公、档案管理、教育资料整理甚至电商商品信息录入中,我们常常面临一个重复又耗时的难题:把纸质文档、扫描件、截图里的文字“搬”到电脑里。手动敲字效率低、易…

作者头像 李华
网站建设 2026/4/18 8:36:08

远程监控设备报警设计:蜂鸣器模块解决方案

以下是对您提供的技术博文进行 深度润色与结构重构后的终稿 。全文已彻底去除AI生成痕迹,采用资深嵌入式系统工程师第一人称视角写作,语言自然、逻辑严密、节奏张弛有度,兼具教学性、实战性与思想纵深感。文中所有技术细节均严格基于原始内…

作者头像 李华
网站建设 2026/4/18 8:05:32

升级Qwen-Image-Edit-2511后,修图速度提升50%

升级Qwen-Image-Edit-2511后,修图速度提升50% 你有没有过这样的体验: 点下“删除水印”按钮,等了8秒才出图; 批量处理20张商品图,队列卡在第三张不动; 客户催着要改稿,你盯着进度条心里发毛………

作者头像 李华
网站建设 2026/4/18 8:33:46

51单片机蜂鸣器驱动电路设计:NPN三极管应用详解

以下是对您提供的博文内容进行深度润色与结构重构后的技术文章。我以一位深耕嵌入式硬件十余年的工程师视角,摒弃模板化表达、去除AI腔调,用真实项目经验的语言重写全文——不堆砌术语,不空谈原理,只讲“为什么这么设计”、“踩过…

作者头像 李华
网站建设 2026/4/2 22:38:18

RTX3060也能跑!麦橘超然优化显存占用真实可行

RTX3060也能跑!麦橘超然优化显存占用真实可行 你是不是也遇到过这样的困扰:想本地跑一个高质量的AI绘图模型,结果刚下载完权重,显存就爆了?RTX 3060(12GB)明明不算差,却连 Flux.1 的…

作者头像 李华