cv_resnet18_ocr-detection训练失败?日志排查步骤详解
2026/4/3 9:21:41 网站建设 项目流程

cv_resnet18_ocr-detection训练失败?日志排查步骤详解

1. 问题定位:为什么训练会失败?

OCR文字检测模型的训练过程看似简单——选好数据、点下“开始训练”,但实际中常遇到“点击后没反应”“进度条卡住”“报错一闪而过”“workdirs里空空如也”等情况。这些都不是随机故障,而是系统在用它的方式告诉你:某处配置、路径或数据出了问题。

cv_resnet18_ocr-detection 是一个基于 ResNet-18 主干网络构建的轻量级文字检测模型,专为中文场景优化,支持端到端训练与部署。它的 WebUI 封装降低了使用门槛,但也隐藏了底层日志细节。当训练失败时,WebUI 界面往往只显示一句模糊的“训练失败”,真正线索全藏在后台日志里。

本篇不讲理论、不堆参数,只聚焦一件事:如何从零开始,一步步挖出训练失败的真实原因。无论你是刚接触 OCR 的新手,还是已部署多次的老手,只要训练卡住,这篇就是你的排障地图。


2. 日志排查四步法:从表象到根因

训练失败 ≠ 模型不行,90%以上的问题都出在环境、路径、数据或配置这四个环节。我们按发生顺序逐层下沉,每一步都附带可执行命令和判断依据。

2.1 第一步:确认训练进程是否真正启动

很多用户误以为“点了按钮=训练开始”,其实 WebUI 只是触发了一个 Python 子进程。如果进程根本没起来,后续所有排查都是徒劳。

操作方式(SSH 连入服务器):

cd /root/cv_resnet18_ocr-detection ps aux | grep "train.py\|main.py" | grep -v grep

预期输出(成功启动):

root 12345 0.1 8.2 2456789 123456 ? Sl 14:22 0:03 python train.py --data_dir /root/custom_data ...

异常情况及应对:

  • 无任何输出→ 训练进程未启动
    检查start_app.sh是否修改过,确认其中调用训练脚本的路径正确(如python tools/train.py而非python train.py
    查看 WebUI 后台日志:tail -f logs/webui.log,搜索trainsubprocess关键词,确认是否有OSError: [Errno 2] No such file or directory类错误

  • 进程存在但 CPU 占用为 0%→ 卡在数据加载阶段
    立即执行:lsof -p 12345 | grep ".txt\|images"(将12345替换为实际PID),检查是否在反复尝试打开某个文件却失败
    重点验证train_list.txt中每一行的图片路径和标注路径是否真实存在、权限可读(ls -l看权限,cat看内容)

2.2 第二步:直击核心日志 —— workdirs 下的训练日志

WebUI 所有训练任务都会在workdirs/目录下生成唯一时间戳子目录,例如workdirs/20260105_143022/。这是最权威的日志来源,比 WebUI 界面提示可靠10倍。

进入最新训练目录:

ls -t workdirs/ | head -n1 cd workdirs/$(ls -t workdirs/ | head -n1)

关键日志文件:

  • train.log:主训练流程日志(必须查看)
  • error.log:捕获的未处理异常(优先级最高)
  • config.yaml:本次实际生效的配置(验证你改的参数是否真被读取)

快速定位错误的三行命令:

# 查看最后10行,通常错误就在这里 tail -10 train.log # 搜索关键词:Error / Exception / Traceback / FileNotFoundError / KeyError grep -i "error\|exception\|traceback\|file not found\|keyerror" train.log # 若报 CUDA 相关错误,加查显存状态 nvidia-smi --query-compute-apps=pid,used_memory --format=csv

典型错误模式与解法:

错误关键词常见原因解决动作
FileNotFoundError: [Errno 2] No such file or directory: 'train_images/1.jpg'train_list.txt中路径写错,或图片实际不在该位置进入train_list.txt,用head -n3看前几行,再ls -l对应路径验证
ValueError: could not convert string to float: 'abc'标注文件.txt中某行坐标不是数字(如含中文逗号、空格、乱码)head -n5 train_gts/1.txt查看格式,确保每行是x1,y1,x2,y2,x3,y3,x4,y4,文本,且逗号为英文
RuntimeError: CUDA out of memoryBatch Size 过大或图片尺寸超限降低 Batch Size 至 4 或 2;或在 WebUI “训练微调”页将输入尺寸改为 640×640
KeyError: 'texts'标注文件为空,或train_gts/1.txt是空文件wc -l train_gts/*.txt统计行数,删掉 0 行的文件

2.3 第三步:验证数据集结构与内容合规性

ICDAR2015 格式看着简单,实操中80%的失败源于“看似对、实则错”。别跳过这一步——哪怕你已检查三遍。

执行校验脚本(无需额外安装):

cd /root/cv_resnet18_ocr-detection python tools/validate_dataset.py --data_dir /root/custom_data

如果脚本存在,它会逐项检查:目录是否存在、列表文件格式、图片可读性、标注坐标合法性、文本编码(UTF-8)。
❌ 如果脚本不存在,手动执行以下三重验证:

① 结构完整性检查:

tree -L 2 /root/custom_data # 正确输出应包含: # ├── test_gts/ # ├── test_images/ # ├── test_list.txt # ├── train_gts/ # ├── train_images/ # └── train_list.txt

② 列表文件内容检查:

# 检查 train_list.txt 前3行(注意:路径必须相对 data_dir 根目录) head -n3 /root/custom_data/train_list.txt # 正确示例: # train_images/001.jpg train_gts/001.txt # train_images/002.jpg train_gts/002.txt

③ 单个标注文件抽样检查:

# 随机选一个标注文件,看是否符合规范 head -n2 /root/custom_data/train_gts/001.txt # 正确示例(8个数字+逗号+文本,无空格): # 120,230,340,230,340,280,120,280,欢迎光临 # 450,180,620,180,620,220,450,220,全场五折

特别注意:Windows 编辑的.txt文件可能含 BOM 头或\r\n换行符,Linux 下会导致解析失败。用file -i train_gts/001.txt查看编码,用dos2unix train_gts/001.txt修复。

2.4 第四步:回溯 WebUI 配置与环境依赖

即使日志和数据都正常,也可能因 WebUI 配置或底层环境导致静默失败。

检查 WebUI 提交的参数是否被正确传递:

  • 打开workdirs/latest/config.yaml
  • 核对data_dirbatch_sizeepochs是否与你在界面上填写的一致
  • 若不一致 → WebUI 前端未正确提交,刷新页面重试,或清浏览器缓存

验证 Python 环境依赖:

cd /root/cv_resnet18_ocr-detection source venv/bin/activate # 若使用虚拟环境 pip list | grep -E "torch|opencv|numpy|pyyaml" # 必须存在且版本兼容: # torch >= 1.12.0 # opencv-python >= 4.5.0 # pyyaml >= 6.0

GPU 驱动与 CUDA 兼容性快检:

nvidia-smi # 看驱动版本 nvcc --version # 看 CUDA 编译器版本 python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())" # 最后一行必须输出 True,否则强制 CPU 训练(在 train.py 中加 --device cpu)

3. 高频陷阱与避坑指南

有些问题不会直接报错,但会让训练“看似运行,实则无效”。以下是实战中踩过的典型深坑。

3.1 标注坐标越界:图片尺寸与坐标不匹配

现象:训练能跑,loss 下降,但验证时一个框都检测不到。

原因:标注文件中的坐标值大于图片实际宽高。例如图片是640×480,但某行写了x1=1200,y1=800,...

快速检测命令:

# 获取第一张训练图尺寸 identify -format "%w %h" /root/custom_data/train_images/001.jpg # 检查对应标注文件最大坐标 awk -F',' '{print $1,$2,$3,$4,$5,$6,$7,$8}' /root/custom_data/train_gts/001.txt | \ awk '{max=$1; for(i=2;i<=8;i++) if($i>max) max=$i; print max}' | sort -n | tail -n1

若第二行数值 > 第一行宽或高 → 坐标越界。需用图像标注工具(如 LabelImg)重新导出,或脚本批量裁剪。

3.2 文本内容含非法字符:导致 JSON 序列化失败

现象:训练中途崩溃,error.log显示json.decoder.JSONDecodeError

原因:标注文本中含不可见控制字符(如\x00,\u200b)或未转义双引号。

安全清洗命令:

# 批量清理 train_gts/ 下所有 .txt 文件 for f in /root/custom_data/train_gts/*.txt; do sed -i 's/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]//g' "$f" # 删除控制字符 sed -i 's/"/\\"/g' "$f" # 转义双引号 done

3.3 权限问题:容器或非 root 用户运行时常见

现象:WebUI 可访问,单图检测正常,但训练报Permission denied

原因:workdirs/custom_data/目录属主为 root,而 WebUI 服务以普通用户启动。

一键修复:

sudo chown -R $USER:$USER /root/cv_resnet18_ocr-detection/workdirs sudo chown -R $USER:$USER /root/custom_data

4. 实战案例:一次完整排障复盘

用户反馈:在 WebUI 点击“开始训练”后,界面显示“训练失败”,workdirs/下生成了空目录,train.log为空。

排查过程:

  1. ps aux | grep train→ 无进程 → 确认未启动
  2. tail -f logs/webui.log→ 发现OSError: [Errno 2] No such file or directory: 'tools/train.py'
  3. 进入项目目录ls tools/→ 只有train.py,没有train.py(原作者命名是train.py,非tools/train.py
  4. 修改webui.py中训练命令路径,或软链接:ln -s train.py tools/train.py
  5. 重启 WebUI:bash start_app.sh
  6. 再次训练 → 成功,train.log开始滚动输出 epoch 信息

教训:WebUI 封装虽好,但必须清楚它背后调用的真实脚本路径。每次更新模型代码后,务必核对 WebUI 集成逻辑。


5. 总结:建立你的训练健康检查清单

下次再遇训练失败,别急着重装、别盲目调参。拿出这张清单,按顺序打钩:

  • □ 进程是否启动?ps aux | grep train
  • workdirs/latest/train.log最后10行有无报错?
  • train_list.txt路径是否真实存在?ls -l验证
  • □ 任一train_gts/*.txt文件是否含非数字坐标?head -n1抽样
  • config.yamldata_dir是否与你填写的完全一致?
  • nvidia-smitorch.cuda.is_available()是否都 OK?

记住:训练失败不是终点,而是模型在教你读懂它的语言。每一次报错,都在帮你加固数据质量、理清路径逻辑、看清环境边界。坚持用日志说话,你很快就能从“报错焦虑者”变成“日志翻译官”。

--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询