如何自定义训练数据集?cv_resnet18_ocr-detection格式要求
OCR文字检测模型的实用价值,很大程度上取决于它能否适应你的具体业务场景——而标准预训练模型在复杂版式、特殊字体、低质量扫描件或行业专用符号面前,往往力不从心。这时候,“训练微调”就不是可选项,而是必经之路。本文不讲抽象理论,不堆砌公式,只聚焦一个最实际的问题:你手头有一批自己的图片和标注,该怎么组织它们,才能让 cv_resnet18_ocr-detection 这个镜像真正“学会”识别你的文字?从目录结构、文件命名、坐标格式到常见踩坑点,全部用大白话讲清楚。
1. 为什么必须严格遵循 ICDAR2015 格式?
你可能会想:“我直接把图片和txt扔进一个文件夹不就行了吗?”——不行。这不是开发者“故意设门槛”,而是模型训练流程本身决定的硬性约束。
这个镜像底层使用的是基于DB(Differentiable Binarization)算法的检测框架,它的数据加载器(DataLoader)被写死为只认一种输入模式:ICDAR2015 格式。这就像一台精密仪器,只接受特定规格的螺丝刀。你给它一把扳手,它不是“转得慢”,而是根本无法启动。
ICDAR2015 是国际公认的文本检测基准数据集,它的格式已成为行业事实标准。采用此格式,意味着:
- 模型能准确解析每张图对应哪个标注文件;
- 训练脚本能自动区分训练集与测试集;
- 坐标系统与模型内部的特征图尺度对齐,避免因尺寸错位导致的训练崩溃。
所以,格式不是“建议”,而是“协议”。跳过这一步,后面所有操作都是空中楼阁。
2. 数据集目录结构:四层嵌套,缺一不可
镜像文档里给出的目录树是权威指南,但光看树形容易忽略关键细节。我们把它拆解成“人话版”操作清单:
custom_data/ ← 你起的名字,但路径里不能有中文、空格、特殊符号! ├── train_list.txt ← 必须叫这个名字,不能是train.txt或list_train.txt ├── train_images/ ← 必须叫这个名字,小写,带下划线 │ ├── 1.jpg ← 图片名可以是数字、英文、下划线,但不能有中文、空格、括号 │ └── 2.png ← 支持jpg/png/bmp,但建议统一用jpg ├── train_gts/ ← 必须叫这个名字,gts是ground truth缩写 │ ├── 1.txt ← 文件名必须和图片名完全一致(不含后缀) │ └── 2.txt ← 内容是纯文本坐标,不是json,不是xml ├── test_list.txt ← 同样必须叫这个名字 ├── test_images/ ← 同样必须叫这个名字 │ └── 3.jpg ← 测试图片,数量建议不少于训练图的10% └── test_gts/ ← 同样必须叫这个名字 └── 3.txt ← 对应的测试标注2.1 关键细节说明
- 路径安全第一:整个
custom_data目录的绝对路径,例如/root/custom_data,不能包含任何中文、空格、&、#、$等字符。Linux系统对路径非常敏感,一个空格就能让训练脚本报“File not found”。 - 文件名一致性:
train_images/1.jpg和train_gts/1.txt的1必须完全相同。大小写也要一致(IMG1.jpg和img1.txt是两个不同文件)。 - 列表文件是“索引”:
train_list.txt不是存图片,而是存“去哪里找图片和标注”的地址。它的内容是两列,用空格分隔:
注意:路径是相对于train_images/1.jpg train_gts/1.txt train_images/2.jpg train_gts/2.txtcustom_data/目录的,不是绝对路径;没有引号;每一行结尾不能有多余空格。
3. 标注文件(.txt):四点坐标,一行一框
这是最容易出错的一环。很多用户以为“只要把文字框出来就行”,结果训练时直接报错退出。核心规则就一条:每个文本框,必须且只能用一行,写满8个数字加一个文本内容。
3.1 正确格式详解
以一张图里有两个文字框为例,1.txt文件内容应为:
10,20,100,20,100,60,10,60,发票抬头 150,80,300,80,300,120,150,120,金额:¥12,800.00我们来逐段拆解这一行:
10,20:第一个点的 x, y 坐标(左上角)100,20:第二个点的 x, y 坐标(右上角)100,60:第三个点的 x, y 坐标(右下角)10,60:第四个点的 x, y 坐标(左下角)发票抬头:该框内识别到的文字内容(可为空,但逗号不能少)
提示:这四个点必须按顺时针顺序排列,从左上角开始。如果顺序乱了(比如按逆时针),模型会把框“拧”成一个奇怪的形状,训练效果极差。
3.2 常见错误与修正
| 错误示例 | 问题分析 | 正确写法 |
|---|---|---|
10 20 100 20 100 60 10 60 发票抬头 | 用空格分隔,不是逗号 | 10,20,100,20,100,60,10,60,发票抬头 |
10,20,100,20,100,60,10,60,"发票抬头" | 文本加了英文双引号 | 10,20,100,20,100,60,10,60,发票抬头 |
10,20,100,20,100,60,10,60, | 文本内容为空,但末尾多了一个逗号 | 10,20,100,20,100,60,10,60,(正确,空内容就留空) |
10,20,100,20,100,60,发票抬头 | 只写了6个数字,缺2个 | 10,20,100,20,100,60,10,60,发票抬头 |
3.3 特殊情况处理
- 无文字内容的框:比如只检测logo区域、印章轮廓,不需要识别文字。此时,最后一个字段留空即可:
50,100,200,100,200,150,50,150, - 模糊/不确定的框:如果某个区域你拿不准是不是文字,宁可不标。乱标噪声数据比不标危害更大。
- 极小文字框:坐标值不能为负数,也不能超过图片宽高。如果框的宽度或高度小于5像素,建议合并到邻近框,或舍弃。
4. 列表文件(.txt):路径是相对的,不是绝对的
train_list.txt的作用,是告诉训练程序:“请去train_images/目录下找1.jpg,然后去train_gts/目录下找1.txt”。
因此,里面的路径必须是相对于custom_data/目录的相对路径。
4.1 正确 vs 错误对比
假设你的完整路径是/root/custom_data/,那么:
正确(相对路径):
train_images/1.jpg train_gts/1.txt train_images/2.jpg train_gts/2.txt❌ 错误(绝对路径,会报错):
/root/custom_data/train_images/1.jpg /root/custom_data/train_gts/1.txt❌ 错误(路径名写错):
images/1.jpg gts/1.txt # 缺少了 "train_" 前缀4.2 生成列表文件的快捷方法
手动写几百行太痛苦。推荐用一段极简Python脚本自动生成(保存为gen_list.py,放在custom_data/目录下运行):
import os # 生成 train_list.txt with open("train_list.txt", "w") as f: for img_name in sorted(os.listdir("train_images")): if img_name.lower().endswith((".jpg", ".png", ".bmp")): base_name = os.path.splitext(img_name)[0] f.write(f"train_images/{img_name} train_gts/{base_name}.txt\n") # 生成 test_list.txt(同理) with open("test_list.txt", "w") as f: for img_name in sorted(os.listdir("test_images")): if img_name.lower().endswith((".jpg", ".png", ".bmp")): base_name = os.path.splitext(img_name)[0] f.write(f"test_images/{img_name} test_gts/{base_name}.txt\n")运行后,train_list.txt和test_list.txt就自动生成好了,零出错。
5. 训练前的最后检查清单
在WebUI里点击“开始训练”之前,请务必对照以下清单逐项确认。90%的训练失败都源于这里:
- [ ]路径无误:你在WebUI中输入的“训练数据目录”是
/root/custom_data,而不是/root/custom_data/(末尾斜杠有时会引发问题,建议不加)。 - [ ]文件存在:
train_list.txt和test_list.txt确实存在于custom_data/目录下。 - [ ]图片可读:用
ls -l custom_data/train_images/看下图片文件大小是否 > 0KB,避免空文件。 - [ ]标注匹配:随机打开一个
train_gts/1.txt,再打开对应的train_images/1.jpg,用画图软件粗略比对坐标是否大致框住了文字。 - [ ]编码统一:所有
.txt文件必须是UTF-8 编码(无BOM)。Windows记事本默认是ANSI,极易出错。请用 VS Code、Notepad++ 或 Sublime Text 打开并另存为 UTF-8。
警告:如果
train_gts/1.txt里有中文,但文件编码是GBK,训练时会直接报UnicodeDecodeError,进程退出。这是新手最高频的报错原因。
6. WebUI训练参数设置:不是越大越好
镜像提供了三个可调参数,但它们之间有强关联,盲目调高可能适得其反:
| 参数 | 推荐值 | 为什么这么选 | 风险提示 |
|---|---|---|---|
| Batch Size | 4 或 8 | 默认8适合GTX 1060级别显卡。如果你的GPU显存小(<4GB),必须降到4甚至2,否则训练启动就OOM(内存溢出) | 设为16,显存不够,训练直接崩溃 |
| 训练轮数(Epoch) | 5–10 | 这是一个微调(Fine-tune)任务,不是从零训练。原模型已在大量数据上预训练,5轮足够让权重适应你的新数据 | 设为50,模型会过拟合你的小数据集,泛化能力暴跌 |
| 学习率 | 0.001–0.007 | 0.007是默认值,适合大多数场景。如果你的数据量很少(<100张),建议降到0.001,让模型更“温柔”地学习 | 设为0.1,权重更新幅度过大,loss曲线剧烈震荡,最终不收敛 |
简单口诀:“小数据,小学习率;小显存,小Batch;微调任务,少Epoch”。
7. 训练完成后的验证:别急着部署
模型训练完,workdirs/下会生成一堆文件。最关键的验证步骤,不是看log里loss降了多少,而是立刻用单图检测功能,跑一张你用来训练的图。
- 如果检测结果和你标注的框基本重合,文字也识别出来了 → 成功。
- 如果一个框都检测不到 → 回头检查标注格式、路径、编码。
- 如果框歪了、漏了、多了 → 检查坐标顺序、列表文件是否漏行、图片分辨率是否远超训练尺寸(如训练用800x600,你传了4000x3000的图)。
记住:训练只是第一步,验证才是闭环的最后一环。没有验证的训练,等于没做。
8. 总结:自定义训练的本质,是建立“信任契约”
你提供给模型的数据,不是冷冰冰的文件,而是一份“信任契约”:
- 你承诺:我的图片清晰、标注精准、格式规范;
- 模型承诺:它会认真“看懂”这些例子,并把学到的规律,迁移到你未来上传的每一张新图上。
这份契约的基石,就是 ICDAR2015 格式。它看似繁琐,实则是为了确保双方“说同一种语言”。当你严格按照本文的目录、文件、坐标、编码要求准备好数据,剩下的,就交给那个紫色界面里的“开始训练”按钮。它背后,是 ResNet18 的稳健特征提取,是 DB 算法的可微分二值化,更是科哥为你封装好的、开箱即用的工程化诚意。
现在,你的数据集,准备好了吗?
--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。