2026/4/17 20:44:36
网站建设
项目流程
巩固网站访客量,接单网官网,互联网行业和制造业项目商业计划书的不同侧重点,宝安网站建设推广训练数据格式错误#xff1f;cv_resnet18_ocr-detection ICDAR2015适配指南
1. 问题背景#xff1a;为什么你的训练数据会报错#xff1f;
你是不是也遇到过这种情况#xff1a;满怀期待地准备好自己的图片和标注#xff0c;兴冲冲点下“开始训练”#xff0c;结果界面…训练数据格式错误cv_resnet18_ocr-detection ICDAR2015适配指南1. 问题背景为什么你的训练数据会报错你是不是也遇到过这种情况满怀期待地准备好自己的图片和标注兴冲冲点下“开始训练”结果界面突然弹出一行红字——“数据加载失败”或者“标签格式不匹配”别急这大概率不是模型的问题而是你的训练数据格式没对上号。cv_resnet18_ocr-detection这个OCR文字检测模型虽然强大但它对输入的数据结构有明确要求。它默认采用的是ICDAR2015 数据集的标准格式。如果你的数据长得很像但又不太一样比如文件命名乱了、坐标顺序反了、文本内容没处理好那训练过程就会直接卡住。本文就是为了解决这个问题而写。我们将手把手带你搞清楚 ICDAR2015 到底是什么样子怎么把你的自定义数据集调整成它能“读懂”的样子确保你上传后一次通过顺利进入训练环节。2. ICDAR2015 标准数据结构详解2.1 完整目录结构长什么样一个标准的 ICDAR2015 风格数据集应该具备以下目录结构your_dataset/ ├── train_list.txt # 训练样本列表 ├── test_list.txt # 测试样本列表 ├── train_images/ # 存放所有训练图片 │ ├── img_1.jpg │ ├── img_2.jpg │ └── ... ├── train_gts/ # 存放训练图片对应的标注文件 │ ├── gt_img_1.txt │ ├── gt_img_2.txt │ └── ... ├── test_images/ # 存放测试图片 │ └── ... └── test_gts/ # 存放测试图片的标注 └── ...注意命名规则图片名可以是任意合法名称如100.jpg,doc_scan_01.png对应的标注文件必须以gt_开头并与图片同名.jpg→gt_*.txt2.2 标注文件txt到底该怎么写每张图片对应一个.txt文件里面每一行代表图中的一个文本框。正确格式如下x1,y1,x2,y2,x3,y3,x4,y4,文本内容x1,y1左上角坐标x2,y2右上角坐标x3,y3右下角坐标x4,y4左下角坐标最后一部分是该区域的文字内容可为空示例120,50,200,50,200,80,120,80,欢迎光临 300,100,500,100,500,130,300,130,全场8折起关键细节提醒坐标之间用英文逗号,分隔不能有空格文本内容部分允许为空例如...,abc或...,表示忽略该区域每行一个文本框多行即多个框文件编码建议使用 UTF-8避免中文乱码2.3 列表文件的作用与写法train_list.txt和test_list.txt是告诉模型“去这些路径下找图片和标签”。每行格式为相对路径/到图片 相对路径/到标注文件示例内容train_images/img_1.jpg train_gts/gt_img_1.txt train_images/img_2.jpg train_gts/gt_img_2.txt正确路径使用正斜杠/即使在 Windows 上也要统一❌ 错误混用反斜杠\或缺少空格分隔3. 常见数据格式错误及修复方法3.1 错误一标注文件命名不规范现象系统提示“找不到 ground truth 文件”或“路径不存在”原因图片叫1.jpg但标注叫1.txt缺了gt_前缀或者反过来标注叫gt_1.png.txt图片叫1.png解决方案运行以下脚本批量重命名标注文件cd your_dataset/train_gts for file in *.txt; do mv $file gt_$file done注意如果已有gt_前缀请先判断是否重复添加3.2 错误二坐标格式混乱现象训练时报错ValueError: could not convert string to float或检测框错位常见错误形式使用空格代替逗号100 200 300 400 ...多余空格100, 200, 300, 400,...坐标顺序不对非顺时针四点修复建议使用 Python 脚本清洗数据def clean_line(line): parts line.strip().replace( , ).split(,) if len(parts) 9: return None # 忽略无效行 coords ,.join(parts[:8]) text ,.join(parts[8:]) # 兼容含逗号的文本 return f{coords},{text}3.3 错误三列表文件路径错误现象日志显示“File not found”但实际文件存在典型问题写成了绝对路径/root/data/...而代码期望相对路径路径分隔符用了\Windows 风格解决方式统一转换为 Linux 风格路径import os with open(train_list.txt, r) as f: lines f.readlines() with open(train_list_fixed.txt, w) as f: for line in lines: img_path, gt_path line.strip().split() img_path img_path.replace(\\, /) gt_path gt_path.replace(\\, /) f.write(f{img_path} {gt_path}\n)3.4 错误四文本内容包含特殊字符未转义现象读取时崩溃或跳过某些样本问题来源包含换行符、制表符、引号等不可见字符使用了全角符号干扰解析处理建议在保存.txt文件前做预处理推荐将文本内容包裹在双引号内如100,100,200,100,200,150,100,150,价格¥199.004. 如何验证你的数据集是否合规光改完还不够得确认真的“达标”了。这里提供两个实用方法。4.1 方法一手动抽样检查随机打开几个gt_*.txt文件看是否满足每行至少9个字段8个坐标 1个文本坐标都是数字且用英文逗号连接文本部分合理无乱码4.2 方法二编写简易校验脚本import os def validate_dataset(data_dir): errors [] list_file os.path.join(data_dir, train_list.txt) with open(list_file, r) as f: for i, line in enumerate(f): try: img_path, gt_path line.strip().split() img_full os.path.join(data_dir, img_path) gt_full os.path.join(data_dir, gt_path) if not os.path.exists(img_full): errors.append(f[Line {i1}] Image not found: {img_full}) if not os.path.exists(gt_full): errors.append(f[Line {i1}] GT file not found: {gt_full}) with open(gt_full, r, encodingutf-8) as gf: for j, gline in enumerate(gf): parts gline.strip().replace( , ).split(,) if len(parts) 9: errors.append(f[GT {gt_path}, Line {j1}] Too few fields) for k in range(8): float(parts[k]) # 尝试转浮点 except Exception as e: errors.append(f[Line {i1}] Parse error: {str(e)}) return errors # 使用示例 errs validate_dataset(/root/custom_data) if errs: for e in errs: print(e) else: print( 数据集格式合规)运行这个脚本如果有任何报错就按提示逐条修复。5. 自定义数据集转换实战案例假设你现在有一批截图标注工具导出的是 JSON 格式想转成 ICDAR2015 兼容格式。5.1 原始数据结构{ image: screenshot_01.jpg, annotations: [ { bbox: [100, 200, 150, 50], // x, y, w, h text: 登录 } ] }5.2 转换思路目标是把(x, y, w, h)转为四个角点坐标顺时针左上(x, y)右上(x w, y)右下(x w, y h)左下(x, y h)5.3 转换脚本示例import json import os def convert_json_to_icdar(json_dir, img_dir, output_dir): os.makedirs(os.path.join(output_dir, train_images), exist_okTrue) os.makedirs(os.path.join(output_dir, train_gts), exist_okTrue) list_lines [] for json_file in os.listdir(json_dir): if not json_file.endswith(.json): continue with open(os.path.join(json_dir, json_file), r, encodingutf-8) as f: data json.load(f) image_name data[image] base_name os.path.splitext(image_name)[0] txt_name fgt_{base_name}.txt # 复制图片到目标目录 os.system(fcp {os.path.join(img_dir, image_name)} {os.path.join(output_dir, train_images)}) # 写入标注文件 with open(os.path.join(output_dir, train_gts, txt_name), w, encodingutf-8) as f: for ann in data[annotations]: x, y, w, h ann[bbox] text ann.get(text, ) line f{x},{y},{xw},{y},{xw},{yh},{x},{yh},{text}\n f.write(line) # 添加到列表文件 list_lines.append(ftrain_images/{image_name} train_gts/{txt_name}) # 生成 train_list.txt with open(os.path.join(output_dir, train_list.txt), w) as f: f.write(\n.join(list_lines)) print( 转换完成)运行后你就得到了符合要求的训练数据包可以直接用于微调。6. WebUI 中如何正确配置训练参数回到cv_resnet18_ocr-detection的 WebUI 界面在【训练微调】Tab 中填写以下信息参数填写示例说明训练数据目录/root/custom_data必须包含train_list.txt和train_images/等子目录Batch Size8显存不足可降至4或2训练轮数 (Epoch)10一般 5~20 足够学习率0.007不建议轻易改动点击“开始训练”后可在输出日志中观察是否成功加载样本数量。若显示Loaded X samples说明数据已被正确识别。7. 总结避免训练失败的关键 checklist7.1 数据准备自查清单所有训练图片放入train_images/目录每张图对应一个gt_*.txt标注文件标注文件中每行格式为x1,y1,x2,y2,x3,y3,x4,y4,text无多余空格、使用英文逗号分隔train_list.txt中路径正确使用/分隔所有路径为相对路径非绝对路径文件编码为 UTF-8支持中文运行校验脚本确认无报错只要严格按照 ICDAR2015 的格式组织数据cv_resnet18_ocr-detection模型就能顺利读取并启动训练。不要再让“格式错误”耽误你的时间现在就开始整理你的数据吧获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。