2026/6/28 16:41:03
网站建设
项目流程
做暖暖网站,简洁大方的电商网站模板,关键词优化百家号,苏州网站建设服务cv_resnet18_ocr-detection训练失败#xff1f;数据格式校验步骤详解
1. 为什么训练总在第一步就报错#xff1f;
你是不是也遇到过这样的情况#xff1a;满怀期待点下“开始训练”#xff0c;结果不到两秒#xff0c;WebUI弹出一行红色错误提示——“数据集加载失败”“…cv_resnet18_ocr-detection训练失败数据格式校验步骤详解1. 为什么训练总在第一步就报错你是不是也遇到过这样的情况满怀期待点下“开始训练”结果不到两秒WebUI弹出一行红色错误提示——“数据集加载失败”“路径不存在”“标注文件解析异常”……然后训练直接中断别急着重装环境或怀疑模型本身90%以上的cv_resnet18_ocr-detection训练失败根源不在代码而在数据格式的细微偏差上。这不是玄学而是OCR检测任务的硬性约束模型不认“差不多”只认“完全符合”。ICDAR2015格式看着简单但一个空格、一行多余换行、坐标顺序错位、甚至中文标点混入txt文件都足以让训练脚本在load_gt()环节直接退出。本文不讲理论、不堆参数只带你像调试代码一样逐层校验你的训练数据用最直白的操作、最少的命令、最确定的结果把“训练失败”这个黑盒变成可定位、可修复、可复现的具体问题。我们全程基于你已有的WebUI环境操作无需额外安装工具所有检查命令均可在服务器终端一键执行。2. 数据目录结构校验先看“骨架”对不对训练前的第一道关卡是目录结构是否严格匹配ICDAR2015规范。WebUI的训练模块会按固定路径拼接读取任何一级目录名或层级偏差都会导致FileNotFoundError。2.1 标准结构再确认你的数据根目录例如/root/custom_data必须长这样custom_data/ ├── train_list.txt # 必须存在且内容为相对路径 ├── train_images/ # 必须存在不能叫train_img或images │ ├── 1.jpg # 支持jpg/png/bmp但扩展名必须小写 │ └── 2.png ├── train_gts/ # 必须存在不能叫gt或annotations │ ├── 1.txt # 文件名必须与图片名严格对应不含扩展名 │ └── 2.txt ├── test_list.txt # 可选但若存在格式必须同train_list.txt ├── test_images/ # 若test_list.txt存在则此目录必须存在 └── test_gts/ # 若test_list.txt存在则此目录必须存在关键陷阱提醒train_images/和train_gts/是两个独立目录不是嵌套关系1.jpg和1.txt的主文件名必须完全一致区分大小写1.JPG配1.txt会失败所有目录名必须是英文不能含中文、空格、特殊符号如训练图片、train images均非法。2.2 三步终端快速校验打开服务器终端进入你的数据根目录如cd /root/custom_data依次执行以下命令# 第一步检查必需目录是否存在且为目录类型 ls -ld train_images train_gts train_list.txt 2/dev/null || echo ❌ 缺少必需目录或文件train_images / train_gts / train_list.txt # 第二步检查train_list.txt中每一行的图片路径是否真实存在 while IFS read -r img_path gt_path; do [ -f $img_path ] || echo ❌ 图片路径不存在$img_path [ -f $gt_path ] || echo ❌ 标注路径不存在$gt_path done train_list.txt # 第三步检查图片与标注文件名是否严格匹配 awk {print $1} train_list.txt | sed s/\.jpg$//; s/\.png$//; s/\.bmp$// | while read img_base; do [ -f train_gts/${img_base}.txt ] || echo ❌ 标注文件名不匹配期望 train_gts/${img_base}.txt done预期正常输出无任何❌行。若出现错误提示根据提示信息直接修正对应路径或文件名。这是最常见、最容易被忽略的失败原因。3. 标注文件.txt内容校验细到每一个逗号和换行即使目录结构完美train_gts/1.txt里一个多余的空格也会让模型解析器崩溃。OCR检测要求坐标必须是整数、按顺时针顺序、严格8个数字1段文本缺一不可。3.1 正确标注格式精解以一张图中有两个文字区域为例1.txt内容应为10,20,100,20,100,60,10,60,这是一段中文 150,80,300,80,300,120,150,120,第二段文字8个数字x1,y1,x2,y2,x3,y3,x4,y4代表四边形四个顶点的坐标左上→右上→右下→左下逗号分隔只能用英文逗号不能用中文顿号、空格或制表符无空行最后一行后不能有多余空行文本部分可以是任意字符包括空格、标点但不能包含换行符坐标类型必须是非负整数不能是小数、负数或科学计数法。3.2 一行命令揪出所有格式问题在train_gts/目录下执行假设当前在/root/custom_datacd train_gts echo 标注文件格式扫描报告 for f in *.txt; do echo -n $f: # 检查是否为空文件 [ ! -s $f ] echo ❌ 空文件 continue # 检查行数每行一个文本框 line_count$(wc -l $f) # 检查每行是否恰好有9个字段8坐标1文本 field_count$(head -1 $f | tr , \n | wc -l) if [ $field_count -ne 9 ]; then echo ❌ 字段数错误期望9实际$(($field_count-1))坐标1文本 continue fi # 检查坐标是否全为非负整数 if ! head -1 $f | awk -F, {for(i1;i8;i) if($i!~/^[0-9]$/) {print ❌ 坐标非整数 $i; exit}}; then continue fi # 检查是否有中文逗号或多余空格 if grep -q $f || grep -q $f; then echo ❌ 含中文逗号或多余空格 continue fi echo 格式正确$line_count 行 done cd ..输出解读格式正确2 行该文件通过全部检查❌ 字段数错误某行逗号数量不对打开文件用文本编辑器查看❌ 坐标非整数某坐标含小数点或负号如10.5,20或-10,20❌ 含中文逗号用VS Code或Notepad切换到“显示所有字符”找到并替换为英文逗号。实操技巧用VS Code打开.txt文件按CtrlH查找中文逗号替换成,再查找\s多个空格替换成单个空格。4. 列表文件train_list.txt深度验证路径、编码、权限三合一train_list.txt是训练的“索引表”它出错会导致整个数据集无法加载。常见问题路径写成绝对路径、文件编码为UTF-8 with BOM、文件权限不足。4.1 列表文件必须满足的三个条件条件正确示例错误示例后果路径为相对路径train_images/1.jpg train_gts/1.txt/root/custom_data/train_images/1.jpg ...脚本找不到文件UTF-8无BOM编码用file train_list.txt显示UTF-8显示UTF-8 Unicode (with BOM)解析时读入乱码报错UnicodeDecodeError无执行权限ls -l train_list.txt显示-rw-r--r--显示-rwxr-xr-x部分环境拒绝读取可执行文件4.2 终端一键修复命令# 检查编码Linux/macOS file -i train_list.txt # 若显示含with BOM用iconv转为纯UTF-8 iconv -f UTF-8 -t UTF-8//IGNORE train_list.txt | sed s/\r$// train_list_fixed.txt mv train_list_fixed.txt train_list.txt # 检查路径是否为相对路径第一列不应以/开头 awk {if(substr($1,1,1)/) print ❌ 第一列是绝对路径 $1} train_list.txt # 修复权限确保可读 chmod 644 train_list.txt # 最终验证用Python模拟加载WebUI内部调用方式 python3 -c import os with open(train_list.txt, r, encodingutf-8) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) 2: print(f❌ 第{i1}行字段不足{line.strip()}) break img, gt parts[0], parts[1] if not os.path.exists(img): print(f❌ 第{i1}行图片路径不存在{img}) if not os.path.exists(gt): print(f❌ 第{i1}行标注路径不存在{gt}) break # 只检查第一行快速验证 print( train_list.txt 基础校验通过) 关键修复动作若file命令显示with BOM执行iconv命令自动清除若发现绝对路径用sed批量替换sed -i s|^/root/custom_data/|| train_list.txt权限问题直接chmod 644 train_list.txt。5. 图片文件自查尺寸、格式、损坏三重过滤模型对输入图片有隐式要求尺寸不能过小32×32、不能是损坏的JPEG、不能是CMYK色彩模式WebUI默认只支持RGB。5.1 快速筛查损坏与异常图片在train_images/目录下运行cd train_images echo 图片健康度扫描 # 查找损坏的JPEG/PNG find . \( -name *.jpg -o -name *.jpeg -o -name *.png \) -exec file {} \; | grep -E (broken|invalid|corrupted) || echo 未发现明显损坏图片 # 查找尺寸过小的图片宽或高32像素 for img in *.jpg *.png *.bmp 2/dev/null; do if [ -f $img ]; then size$(identify -format %w %h $img 2/dev/null) if [ -n $size ]; then read w h $size if [ $w -lt 32 ] || [ $h -lt 32 ]; then echo 尺寸过小$img ($w×$h) fi fi fi done # 查找非RGB模式图片CMYK/Gray for img in *.jpg *.png 2/dev/null; do if [ -f $img ]; then mode$(identify -format %r $img 2/dev/null | head -1) if [ $mode ! DirectClass ] [ $mode ! PseudoClass ]; then echo 色彩模式异常$img ($mode)建议转换为RGB fi fi done cd ..处理建议损坏图片直接从原始数据源重新导出尺寸过小用convert放大仅用于训练不影响精度convert 1.jpg -resize 100x100! 1_fixed.jpgCMYK图片批量转RGBmogrify -colorspace RGB *.jpg需安装ImageMagick。6. 终极验证用WebUI自带的校验工具跑一次WebUI其实内置了静默数据校验逻辑。与其猜错在哪不如让系统自己告诉你。6.1 启动训练前的“预检模式”在WebUI的【训练微调】Tab页填入你的数据目录路径如/root/custom_data将Batch Size临时设为1训练轮数设为1最小化耗时勾选“仅校验数据不训练”选项该选项位于参数配置区底部灰色小字提示点击“开始训练”。成功表现日志区显示绿色文字“ 数据校验通过共加载X张训练图片Y个文本框。”❌失败表现红色错误堆栈末尾明确指出文件名和行号如ValueError: invalid literal for int() on line 3 of train_gts/5.txt。6.2 根据预检日志精准修复预检日志比手动检查更权威因为它使用了与正式训练完全相同的加载器。根据日志提示若报line 3错误用sed -n 3p train_gts/5.txt查看该行按3.1节规则修正若报path not found回到2.2节命令重新检查路径拼写若报encoding error用4.2节iconv命令修复。完成修复后再次运行预检直到看到绿色提示——此时你才真正具备了启动正式训练的资格。7. 训练启动后的实时监控别让错误悄悄发生即使通过了所有校验训练过程中仍可能因显存不足、数据读取超时等导致中途失败。学会看日志能让你在问题扩大前及时干预。7.1 关键日志信号识别表日志片段含义应对措施CUDA out of memoryGPU显存不足降低Batch Size或关闭其他GPU进程DataLoader worker exited unexpectedly数据加载器崩溃检查某张图片是否损坏回溯到5.1节lossnan或lossinf梯度爆炸降低学习率5.2节中改为0.001Epoch 1/5: 0%卡住不动数据集为空或路径错误立即停止重新运行6.1节预检7.2 推荐的训练监控命令在训练启动后新开一个终端窗口执行# 实时跟踪训练日志日志默认输出到workdirs/下的最新目录 tail -f $(ls -td workdirs/*/ | head -1)train.log 2/dev/null | grep -E (Epoch|loss|ERROR|WARNING) # 监控GPU显存NVIDIA GPU watch -n 1 nvidia-smi --query-gpumemory.used --formatcsv,noheader,nounits当看到Epoch 1/5: 100%且loss值稳定下降如从2.5→1.8→1.2说明训练已进入正轨。此时你可以放心去做别的事等待模型收敛。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。