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,搜索train或subprocess关键词,确认是否有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 memory | Batch 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_dir、batch_size、epochs是否与你在界面上填写的一致 - 若不一致 → 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.0GPU 驱动与 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" # 转义双引号 done3.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_data4. 实战案例:一次完整排障复盘
用户反馈:在 WebUI 点击“开始训练”后,界面显示“训练失败”,
workdirs/下生成了空目录,train.log为空。
排查过程:
ps aux | grep train→ 无进程 → 确认未启动tail -f logs/webui.log→ 发现OSError: [Errno 2] No such file or directory: 'tools/train.py'- 进入项目目录
ls tools/→ 只有train.py,没有train.py(原作者命名是train.py,非tools/train.py) - 修改
webui.py中训练命令路径,或软链接:ln -s train.py tools/train.py - 重启 WebUI:
bash start_app.sh - 再次训练 → 成功,
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.yaml中data_dir是否与你填写的完全一致? - □
nvidia-smi和torch.cuda.is_available()是否都 OK?
记住:训练失败不是终点,而是模型在教你读懂它的语言。每一次报错,都在帮你加固数据质量、理清路径逻辑、看清环境边界。坚持用日志说话,你很快就能从“报错焦虑者”变成“日志翻译官”。
--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。