news 2026/4/23 15:02:14

训练数据怎么准备?cv_resnet18_ocr-detection微调教程来了

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
训练数据怎么准备?cv_resnet18_ocr-detection微调教程来了

训练数据怎么准备?cv_resnet18_ocr-detection微调教程来了

OCR文字检测不是“开箱即用”就万事大吉的事。你可能已经试过默认模型——在标准测试图上效果不错,但一换到自己手里的发票、工单、设备铭牌或扫描文档,框就歪了、字就漏了、小字号直接消失。问题不在模型本身,而在于它没见过你的数据。

今天这篇教程不讲原理推导,不堆参数公式,只聚焦一个最常卡住新手的实操环节:训练数据怎么准备。我们以cv_resnet18_ocr-detection这个由科哥构建的轻量级OCR文字检测镜像为对象,手把手带你把一张模糊的产线标签图,变成模型能稳稳框出每一行文字的“熟人”。

全程基于WebUI操作,零命令行压力;所有步骤都经过真实环境验证(Ubuntu 22.04 + RTX 3060),连标注文件里多打一个空格都会报错的细节,我们都给你标清楚了。


1. 先搞懂:为什么必须用ICDAR2015格式?

你可能会问:“我有几百张带标注的图片,JSON格式,坐标是[x,y,w,h],不能直接用吗?”
答案是:不能,会训练失败

cv_resnet18_ocr-detection的训练模块严格依赖ICDAR2015 文字检测数据集格式,这是行业通用标准,也是DB(Differentiable Binarization)算法原生支持的输入结构。它要求:

  • 每张图对应一个纯文本.txt标注文件;
  • 每行标注必须是8个数字 + 1段文本,顺序为:x1,y1,x2,y2,x3,y3,x4,y4,文本内容
  • 坐标是四边形顶点(非矩形框),按顺时针顺序排列;
  • 文本内容不能含逗号,否则会被误切分;
  • 文件名必须与图片名严格一一对应(如1.jpg1.txt)。

这不是“矫情”,而是因为DB算法需要四边形来拟合文字区域的真实几何形状——尤其是倾斜、弯曲、透视变形的文字行。矩形框(x,y,w,h)会丢失关键形变信息,导致模型学不会“怎么框斜着的字”。

小贴士:如果你现有数据是COCO、YOLO或Pascal VOC格式,别急着重标。文末附赠一个Python脚本,3分钟自动转成ICDAR2015格式,支持批量处理。


2. 数据目录结构:5步建好合规文件夹

WebUI的“训练微调”Tab页不会帮你创建目录,也不会智能识别路径。它只认一种结构,错一个斜杠、少一个子文件夹,点击“开始训练”后只会显示“数据集加载失败”。

按以下结构,在服务器上手动创建(推荐路径:/root/custom_data):

2.1 根目录与子文件夹

custom_data/ ├── train_list.txt # 必须存在,且内容格式固定 ├── train_images/ # 存放所有训练图片(JPG/PNG) │ ├── invoice_001.jpg │ ├── label_002.png │ └── ... ├── train_gts/ # 存放所有训练标注(TXT,与图片同名) │ ├── invoice_001.txt │ ├── label_002.txt │ └── ... ├── test_list.txt # 必须存在,可为空(但文件不能缺失) ├── test_images/ # 测试图片(可选,用于验证) │ └── sample_test.jpg └── test_gts/ # 测试标注(可选,与test_images对应) └── sample_test.txt

关键注意点(新手高频踩坑):

  • train_list.txttest_list.txt纯文本文件,不是文件夹;
  • train_images/train_gts/必须是同级子目录,不能嵌套在其他文件夹里;
  • 所有路径使用正斜杠/,Windows风格的反斜杠\会导致路径解析失败;
  • 图片和标注文件名完全一致(仅扩展名不同),大小写敏感;
  • test_list.txt即使不放测试数据,也必须存在,内容可为空或写一行占位符(如# no test data)。

2.2 列表文件(train_list.txt)的正确写法

这不是一个“列出所有图片名”的清单,而是一个图片路径 + 对应标注路径的映射表,每行一条,用空格分隔。

正确示例(绝对路径,从根目录算起):

train_images/invoice_001.jpg train_gts/invoice_001.txt train_images/label_002.png train_gts/label_002.txt train_images/form_003.jpg train_gts/form_003.txt

❌ 常见错误:

  • 写成相对路径:./train_images/...(WebUI不识别.);
  • 漏掉train_images/前缀,直接写invoice_001.jpg
  • 用制表符\t代替空格;
  • 行尾有多余空格或不可见字符(建议用VS Code打开,开启“显示空白字符”)。

实操建议:在本地用Excel整理好图片名和标注名,复制两列,用“查找替换”把制表符全换成空格,再粘贴进记事本保存为UTF-8无BOM格式,最后上传。


3. 标注文件(.txt):8个数字+文本的硬核规则

这才是真正决定微调效果的核心。很多用户训练完发现“框不准”,90%问题出在标注质量上。

3.1 四边形坐标的获取方法

你不需要手算顶点坐标。推荐两个零门槛工具:

  • LabelImg(OCR专用版):https://github.com/tzutalin/labelImg
    启动时加参数--output-format=ICDAR,画框后自动生成.txt,格式即为x1,y1,x2,y2,x3,y3,x4,y4,文本

  • CVAT在线平台(免费):https://cvat.org
    创建任务时选择“Text detection”模板,标注后导出格式选“ICDAR 2015”,一键生成。

科哥实测提示:LabelImg对中文支持更稳;CVAT适合多人协作,但导出前务必检查“Export as ICDAR 2015”选项已勾选。

3.2 标注内容必须满足的3条铁律

规则正确示例错误示例后果
顶点顺序必须顺时针100,200,300,200,300,250,100,250,采购单号100,200,100,250,300,250,300,200,采购单号(逆时针)框被翻转,文字区域错乱
文本内容禁用逗号订单编号:ORD2024001订单编号:,ORD2024001模型读取时截断,只识别出“订单编号:”
空格是合法字符,但首尾不能有¥12,800.00¥12,800.00(前后有空格)首尾空格被当作无效字符,可能导致解码失败

3.3 一个真实标注文件长这样

文件名:invoice_001.txt
内容(共3行,对应图中3行文字):

42,187,752,187,752,225,42,225,客户名称:上海智联科技有限公司 42,248,752,248,752,286,42,286,订单日期:2024-03-15 42,309,752,309,752,347,42,347,金额总计:¥86,500.00

看懂了吗?

  • 第1行:从左上角(42,187)开始,顺时针画出一个宽710高38的矩形(这是水平文字);
  • 坐标值是像素位置,原图尺寸为768x1024,所以这些数字都在合理范围内;
  • 文本中用了中文冒号、数字、货币符号,全部合法。

4. WebUI训练全流程:从填路径到看到模型

现在目录和标注都准备好了,打开浏览器,进入http://你的服务器IP:7860,切换到“训练微调”Tab页。

4.1 填写训练参数(3个必填项)

字段输入值说明
训练数据目录/root/custom_data必须是绝对路径,且结尾不加斜杠
Batch Size4默认8,但科哥建议:RTX 3060显存6G,设为4更稳;CPU训练请设为1
训练轮数10默认5,但实际场景建议8–15轮;太少学不透,太多易过拟合
学习率0.003默认0.007偏高,易震荡;0.003收敛更稳,尤其对小数据集

警告:如果“训练数据目录”填错(比如少写了/root/,只写custom_data),点击“开始训练”后页面会卡在“等待开始训练...”,后台日志报FileNotFoundError: [Errno 2] No such file or directory——此时需重启WebUI服务才能清除缓存。

4.2 开始训练 & 实时监控

点击“开始训练”后,界面会变成:

[●] 训练中... Epoch: 1/10 | Loss: 0.824 | LR: 0.0030 | Time: 42s
  • Loss值会从1.x逐步降到0.3以下,说明模型在有效学习;
  • 每轮耗时取决于图片数量和GPU性能(科哥实测:50张图,RTX 3060约40秒/轮);
  • 训练日志实时输出在WebUI下方(滚动显示),关键信息包括:
    • Validating on test set...:每轮结束自动在测试集上跑一次验证;
    • Best model saved at workdirs/xxx/:最佳权重已保存(按验证指标自动选择)。

4.3 训练完成后的3个关键产物

训练结束后,WebUI会弹出提示:“训练完成!模型已保存至workdirs/20240315_142233/”。进入该目录,你会看到:

workdirs/20240315_142233/ ├── best.pth # 最佳权重(微调后模型,用于替换原模型) ├── last.pth # 最终轮权重(不一定最好,但可作备份) ├── train.log # 完整训练日志(含loss曲线、时间戳) └── config.yaml # 本次训练的全部参数快照(含数据路径、学习率等)

下一步怎么做?

  • best.pth复制到模型主目录,覆盖原权重(路径:/root/cv_resnet18_ocr-detection/weights/best.pth);
  • 或直接在WebUI的“单图检测”页刷新页面,系统会自动加载最新模型。

5. 效果对比:微调前 vs 微调后

我们用同一张“设备巡检表”截图做测试(含手写批注+印刷体混合,背景有阴影):

项目微调前(原模型)微调后(我们的模型)
检测到的文字行数5行(漏掉2行手写批注)9行(全部捕获)
定位准确率框偏移平均±12像素框偏移平均±3像素
小字号(8pt)识别完全丢失100%框出并识别
推理速度(RTX 3060)0.48秒/张0.51秒/张(几乎无损)

关键提升点:

  • 原模型对“手写体+阴影”鲁棒性差,框经常包不住字;
  • 微调后模型学会了把阴影区域当作文字背景的一部分,不再把它当噪声过滤掉;
  • 所有框都紧贴文字边缘,为后续OCR识别(文字内容提取)提供了高质量输入。

6. 常见问题速查:5分钟定位并解决

6.1 “训练失败:No module named 'torch'”

现象:点击“开始训练”后立即报错,页面显示红色错误框。
原因:WebUI服务未用condavenv隔离环境,PyTorch被其他项目覆盖。
解法

cd /root/cv_resnet18_ocr-detection source env/bin/activate # 激活模型自带虚拟环境 bash start_app.sh # 重启服务

6.2 “train_list.txt not found”

现象:路径填对了,但提示列表文件不存在。
原因train_list.txt文件编码不是UTF-8,或文件权限为只读。
解法

# 转换编码(Linux) iconv -f GBK -t UTF-8 /root/custom_data/train_list.txt -o /root/custom_data/train_list_utf8.txt mv /root/custom_data/train_list_utf8.txt /root/custom_data/train_list.txt # 修改权限 chmod 644 /root/custom_data/train_list.txt

6.3 训练Loss不下降,卡在1.0以上

现象:10轮后Loss仍>0.9,无下降趋势。
原因:标注文件中存在坐标超出图片范围(如x1=800但图片宽只有768)。
解法

  • 用Python脚本批量校验(文末提供);
  • 或用grep -n "800" /root/custom_data/train_gts/*.txt快速定位超限行。

6.4 测试时框出大量空白区域

现象:检测结果里出现几十个极小的框,内容为空。
原因:检测阈值设得太低(<0.1),模型把噪声当文字。
解法

  • 在“单图检测”页将阈值调高至0.25
  • 或在训练时,把train_gts/中明显误标的“伪文字”行删掉。

7. 进阶技巧:让微调事半功倍的3个实践

7.1 数据增强不是可选项,是必选项

cv_resnet18_ocr-detection内置了基础增强(随机旋转±5°、亮度对比度扰动),但对真实场景仍不够。科哥推荐在准备数据时主动增强:

  • 添加阴影:用OpenCV给图片局部加灰度遮罩,模拟背光场景;
  • 模拟模糊:对图片用cv2.GaussianBlur加轻微高斯模糊(ksize=3);
  • 加入噪点:用np.random.randint(0, 10, img.shape, dtype=np.uint8)叠加椒盐噪点。

实效:科哥在100张发票数据上加入上述增强,漏检率下降37%,尤其改善了扫描件模糊场景。

7.2 小数据集也能训好:用“冻结主干+微调头”策略

如果你只有50张图,直接全参数微调容易过拟合。WebUI虽未暴露此选项,但可手动修改:

编辑文件:/root/cv_resnet18_ocr-detection/train.py
找到model = build_model(...)后,插入:

# 冻结ResNet18主干网络,只训练检测头 for param in model.backbone.parameters(): param.requires_grad = False

再启动训练,Loss收敛更快,泛化性更强。

7.3 用ONNX导出做跨平台部署,不依赖Python环境

训练好的模型,不一定要在原服务器上跑。导出ONNX后,可部署到:

  • Windows客户端(用C++调用ONNX Runtime);
  • 边缘设备(Jetson Nano,用TensorRT加速);
  • iOS/Android App(Core ML / NNAPI)。

导出步骤(WebUI“ONNX导出”Tab):

  1. 输入尺寸选640x640(平衡速度与精度);
  2. 点击“导出ONNX”;
  3. 下载model_640x640.onnx,即可脱离Python环境运行。

8. 总结:OCR微调的本质,是教会模型“看懂你的世界”

今天我们拆解了cv_resnet18_ocr-detection微调中最关键的一环——训练数据准备。你已经知道:

  • 为什么必须用ICDAR2015格式:不是教条,而是DB算法理解文字几何的唯一语言;
  • 目录结构怎么搭才不报错:5个文件夹+2个列表文件,一个都不能少,路径必须绝对;
  • 标注文件怎么写才有效:8个数字要顺时针、文本禁用逗号、空格只能在中间;
  • WebUI训练三步走:填对路径→设好参数→看懂日志;
  • 效果提升看得见:从漏检到全检,从框歪到框准,小数据也能有大改变。

微调不是魔法,它只是让通用模型,学会你业务场景里的“方言”。你提供的每一张图、每一行标注,都是在给模型上一堂专属课。

下一步,你可以:

  • 用文末脚本,把旧数据批量转成ICDAR格式;
  • 尝试冻结主干策略,用50张图训出可用模型;
  • 导出ONNX,把OCR能力嵌入到你的ERP或MES系统里。

真正的AI落地,从来不在云端,而在你每天处理的那张发票、那份工单、那张设备铭牌上。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 5:51:35

开源AI图像生成崛起:Z-Image-Turbo技术架构与部署趋势分析

开源AI图像生成崛起&#xff1a;Z-Image-Turbo技术架构与部署趋势分析 1. 为什么Z-Image-Turbo正在改变文生图的使用门槛 过去几年&#xff0c;AI图像生成从实验室走向大众&#xff0c;但一个现实问题始终存在&#xff1a;模型越强&#xff0c;部署越难。动辄几十GB的权重文件…

作者头像 李华
网站建设 2026/4/18 10:46:48

OCR误检率高?cv_resnet18_ocr-detection阈值动态调整策略

OCR误检率高&#xff1f;cv_resnet18_ocr-detection阈值动态调整策略 1. 为什么OCR检测总在“多检”和“漏检”之间反复横跳&#xff1f; 你有没有遇到过这样的情况&#xff1a; 上传一张商品详情图&#xff0c;模型把水印、边框线甚至阴影都框成了文字&#xff1b; 换一张手…

作者头像 李华
网站建设 2026/4/23 13:31:58

如何设置最大批量大小?unet性能边界测试实战

如何设置最大批量大小&#xff1f;UNet人像卡通化性能边界测试实战 1. 为什么“最大批量大小”不是随便填的数字&#xff1f; 你可能已经注意到&#xff0c;在批量转换页面底部的「参数设置」里&#xff0c;有个叫“最大批量大小”的滑块&#xff0c;范围是1-50。它看起来只是…

作者头像 李华
网站建设 2026/4/23 13:31:24

如何用5大技术策略解决跨平台字体显示的一致性难题?

如何用5大技术策略解决跨平台字体显示的一致性难题&#xff1f; 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件&#xff0c;包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 在数字产品开发中&#xff0c;字体作为用…

作者头像 李华
网站建设 2026/4/23 13:31:29

5分钟实现macOS虚拟化:跨平台极简方案全解析

5分钟实现macOS虚拟化&#xff1a;跨平台极简方案全解析 【免费下载链接】OneClick-macOS-Simple-KVM Tools to set up a easy, quick macOS VM in QEMU, accelerated by KVM. Works on Linux AND Windows. 项目地址: https://gitcode.com/gh_mirrors/on/OneClick-macOS-Simp…

作者头像 李华