news 2026/5/1 23:32:58

cv_resnet18_ocr-detection模型训练微调指南:使用自定义数据集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cv_resnet18_ocr-detection模型训练微调指南:使用自定义数据集

cv_resnet18_ocr-detection模型训练微调指南:使用自定义数据集

1. 从零开始:为什么需要训练自己的OCR检测模型?

你可能已经体验过cv_resnet18_ocr-detection这个OCR文字检测模型,它开箱即用,识别效果不错。但当你把它用在你的实际业务中时,可能会遇到一些“水土不服”的情况。

比如,你想用它来识别:

  • 你公司内部特有的票据或表单
  • 某个特定行业的手写单据
  • 特殊字体或特殊布局的文档
  • 在特定光照或背景下的文字

这时候,你会发现通用模型的表现可能不尽如人意。它可能漏掉一些关键信息,或者把不该识别的东西也框出来了。这就是为什么我们需要“训练微调”——让模型学会认识你的数据,适应你的场景。

简单来说,训练微调就是给模型“开小灶”。我们不用从头开始教它(那需要海量数据和计算资源),而是在它已经学会的“通用文字识别”基础上,用我们自己的数据再教它一些“特殊技能”。

2. 准备工作:你的数据集应该长什么样?

在开始训练之前,最重要的一步就是准备数据。cv_resnet18_ocr-detection要求的数据格式是ICDAR2015格式,这是OCR领域一个比较通用的标准格式。

2.1 数据集目录结构

你的数据集文件夹应该按照下面的结构来组织:

你的数据集文件夹/ ├── train_list.txt # 训练集文件列表 ├── train_images/ # 训练图片文件夹 │ ├── 001.jpg │ ├── 002.jpg │ └── 003.jpg ├── train_gts/ # 训练标注文件夹 │ ├── 001.txt │ ├── 002.txt │ └── 003.txt ├── test_list.txt # 测试集文件列表 ├── test_images/ # 测试图片文件夹 │ └── 004.jpg └── test_gts/ # 测试标注文件夹 └── 004.txt

几个关键点:

  • train_imagestest_images:存放你的图片文件,支持JPG、PNG等常见格式
  • train_gtstest_gts:存放对应的标注文件,每个图片对应一个.txt文件
  • train_list.txttest_list.txt:告诉模型哪些图片用于训练,哪些用于测试

2.2 标注文件格式详解

每个标注文件(比如001.txt)的内容格式是这样的:

71,27,226,27,226,72,71,72,文字内容1 331,130,489,130,489,180,331,180,文字内容2 50,200,150,200,150,250,50,250,文字内容3

每一行代表一个文本框,包含9个信息:

  • 前8个数字:文本框四个角点的坐标(x1,y1,x2,y2,x3,y3,x4,y4)
  • 第9个:这个文本框里的文字内容

坐标的顺序很重要,必须是顺时针方向:

(x1,y1) —— (x2,y2) | | (x4,y4) —— (x3,y3)

2.3 列表文件格式

train_list.txt文件的内容示例:

train_images/001.jpg train_gts/001.txt train_images/002.jpg train_gts/002.txt train_images/003.jpg train_gts/003.txt

格式说明:

  • 每行一条记录
  • 第一部分:图片的相对路径
  • 第二部分:对应标注文件的相对路径
  • 中间用一个空格分隔

2.4 数据准备工具推荐

如果你没有现成的标注数据,或者需要标注新的图片,这里有几个好用的工具:

在线标注工具:

  • Label Studio:功能强大的开源标注平台,支持OCR标注
  • Roboflow:提供在线标注和数据集管理

本地标注工具:

  • LabelImg:简单易用的矩形框标注工具
  • PPOCRLabel:PaddleOCR官方标注工具,专门为OCR设计

快速创建示例数据:如果你只是想先试试训练流程,可以用下面的Python代码快速生成一个简单的测试数据集:

import os import cv2 import numpy as np # 创建目录结构 os.makedirs("demo_data/train_images", exist_ok=True) os.makedirs("demo_data/train_gts", exist_ok=True) os.makedirs("demo_data/test_images", exist_ok=True) os.makedirs("demo_data/test_gts", exist_ok=True) # 创建训练数据 for i in range(3): # 创建一张白色背景的图片 img = np.ones((300, 400, 3), dtype=np.uint8) * 255 # 在图片上写文字 cv2.putText(img, f"测试文字{i+1}", (50, 100+i*50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 2) # 保存图片 img_path = f"demo_data/train_images/{i+1:03d}.jpg" cv2.imwrite(img_path, img) # 创建标注文件(模拟的文本框坐标) gt_path = f"demo_data/train_gts/{i+1:03d}.txt" with open(gt_path, 'w', encoding='utf-8') as f: # 根据文字位置估算文本框 x1, y1 = 40, 80+i*50 x2, y2 = 200, 80+i*50 x3, y3 = 200, 120+i*50 x4, y4 = 40, 120+i*50 f.write(f"{x1},{y1},{x2},{y2},{x3},{y3},{x4},{y4},测试文字{i+1}\n") # 创建列表文件 with open("demo_data/train_list.txt", 'w', encoding='utf-8') as f: for i in range(3): f.write(f"train_images/{i+1:03d}.jpg train_gts/{i+1:03d}.txt\n") print("示例数据集创建完成!")

3. 实战训练:在WebUI中微调你的模型

准备好数据后,我们就可以开始训练了。cv_resnet18_ocr-detection提供了一个非常友好的WebUI界面,让训练过程变得简单直观。

3.1 启动训练服务

首先,确保你已经启动了WebUI服务:

cd /root/cv_resnet18_ocr-detection bash start_app.sh

然后在浏览器中打开:http://你的服务器IP:7860

3.2 进入训练微调页面

在WebUI的顶部,你会看到几个标签页,点击**"训练微调"**标签,进入训练界面。

界面主要分为三个部分:

  1. 数据集配置区域:设置你的数据路径
  2. 训练参数区域:调整训练的超参数
  3. 训练控制区域:开始/停止训练按钮和状态显示

3.3 配置训练参数

让我们一个个来看这些参数是什么意思,以及怎么设置:

训练数据目录

  • 这是什么:你准备好的数据集所在的文件夹路径
  • 怎么填:比如/root/my_ocr_data或者./demo_data
  • 注意:路径要写绝对路径,或者相对于项目根目录的相对路径

Batch Size(批次大小)

  • 这是什么:一次训练喂给模型多少张图片
  • 默认值:8
  • 怎么调
    • 如果你的显卡内存小(比如4GB),设为4或2
    • 如果显卡内存大(比如12GB以上),可以设为16或32
    • 一般设为8是一个比较平衡的选择

训练轮数

  • 这是什么:整个数据集要训练多少遍
  • 默认值:5
  • 怎么调
    • 如果你的数据量少(比如几百张),可以设10-20轮
    • 如果数据量大(几千张),5-10轮通常就够了
    • 注意:轮数太多可能导致过拟合(模型只记住了训练数据,不会泛化)

学习率

  • 这是什么:模型学习新知识的速度
  • 默认值:0.007
  • 怎么调
    • 如果训练过程中loss下降很慢,可以适当调大(比如0.01)
    • 如果loss波动很大或不下降,可以调小(比如0.001)
    • 一般先用默认值,观察效果再调整

3.4 开始训练

配置好参数后,点击**"开始训练"**按钮。你会看到状态显示"等待开始训练...",然后变成"训练中..."。

训练过程中,你可以在终端查看实时日志:

[INFO] 开始第1轮训练... [INFO] 训练进度: 10/50, Loss: 0.4523 [INFO] 训练进度: 20/50, Loss: 0.3214 ... [INFO] 第1轮训练完成,验证集准确率: 0.85

训练时间参考:

  • 100张图片,训练5轮:约10-15分钟(GPU)
  • 1000张图片,训练10轮:约1-2小时(GPU)
  • 如果没有GPU,时间会延长3-5倍

3.5 监控训练进度

虽然WebUI界面没有实时显示训练曲线,但你可以通过以下方式监控训练情况:

查看训练日志:

# 查看最新的训练日志 tail -f /root/cv_resnet18_ocr-detection/workdirs/latest_training.log

检查生成的模型文件:训练完成后,模型会保存在workdirs/目录下:

workdirs/ └── 你的训练任务_时间戳/ ├── best_model.pth # 效果最好的模型权重 ├── latest_model.pth # 最后一轮的模型权重 ├── config.yaml # 训练配置 └── training_log.txt # 训练日志

4. 训练技巧与最佳实践

4.1 数据质量决定模型上限

图片质量要求:

  • 分辨率适中:建议800×600到1920×1080之间
  • 文字清晰可辨:避免过度模糊、压缩严重的图片
  • 光照均匀:避免过暗、过亮或反光严重的图片
  • 格式统一:尽量使用JPG或PNG格式

标注质量检查:

  • 文本框要紧密包围文字,不要留太多空白
  • 对于倾斜文字,要用四边形准确框出
  • 标注的文字内容要完全准确,包括标点符号
  • 对于难以辨认的文字,宁可标注为"###"(忽略),也不要猜

4.2 数据增强:让小数据集发挥大作用

如果你的数据量不够多,可以通过数据增强来"创造"更多训练样本。你可以在训练前对图片进行一些变换:

import cv2 import numpy as np from PIL import Image import imgaug.augmenters as iaa # 创建一个数据增强序列 augmenter = iaa.Sequential([ iaa.Affine( rotate=(-5, 5), # 随机旋转-5到5度 translate_percent={"x": (-0.1, 0.1), "y": (-0.1, 0.1)}, # 随机平移 scale=(0.9, 1.1) # 随机缩放 ), iaa.GaussianBlur(sigma=(0, 1.0)), # 轻微高斯模糊 iaa.AdditiveGaussianNoise(scale=(0, 0.05*255)), # 添加高斯噪声 iaa.Multiply((0.8, 1.2)), # 调整亮度 iaa.LinearContrast((0.8, 1.2)), # 调整对比度 ]) # 对图片和标注框同时进行增强 def augment_image_and_boxes(image, boxes): # boxes格式: [[x1,y1,x2,y2,x3,y3,x4,y4], ...] keypoints = [] for box in boxes: # 将每个框的4个点作为关键点 for i in range(0, 8, 2): keypoints.append(ia.Keypoint(x=box[i], y=box[i+1])) # 应用增强 aug_image, aug_keypoints = augmenter(image=image, keypoints=keypoints) # 转换回框格式 aug_boxes = [] for i in range(0, len(aug_keypoints), 4): box = [] for j in range(4): box.append(int(aug_keypoints[i+j].x)) box.append(int(aug_keypoints[i+j].y)) aug_boxes.append(box) return aug_image, aug_boxes

4.3 训练策略调整

学习率调度:如果训练到后期loss不再下降,可以尝试动态调整学习率:

# 在训练代码中添加学习率调度 from torch.optim.lr_scheduler import StepLR # 每3轮学习率减半 scheduler = StepLR(optimizer, step_size=3, gamma=0.5) # 在每个epoch结束后调用 scheduler.step()

早停策略:如果连续几轮验证集效果没有提升,就提前停止训练,避免过拟合:

best_accuracy = 0 patience = 3 # 容忍轮数 no_improve_count = 0 for epoch in range(num_epochs): # 训练一个epoch train_loss = train_one_epoch() # 在验证集上测试 val_accuracy = validate() # 保存最好的模型 if val_accuracy > best_accuracy: best_accuracy = val_accuracy torch.save(model.state_dict(), 'best_model.pth') no_improve_count = 0 else: no_improve_count += 1 # 如果连续patience轮没有提升,停止训练 if no_improve_count >= patience: print(f"早停触发,在第{epoch+1}轮停止训练") break

4.4 解决常见训练问题

问题1:训练loss不下降

  • 可能原因:学习率太大或太小
  • 解决方案:尝试调整学习率,或者使用学习率预热

问题2:过拟合(训练集效果好,测试集效果差)

  • 可能原因:模型太复杂或数据太少
  • 解决方案:增加数据增强、使用Dropout、减少训练轮数

问题3:训练速度太慢

  • 可能原因:Batch Size太小或没有用GPU
  • 解决方案:增大Batch Size(在显存允许范围内)、确保使用GPU训练

问题4:显存不足

  • 可能原因:图片太大或Batch Size太大
  • 解决方案:减小图片尺寸、减小Batch Size、使用梯度累积

5. 训练后的模型使用与评估

5.1 加载微调后的模型

训练完成后,你可以在WebUI中使用新训练的模型:

  1. 在"单图检测"或"批量检测"页面
  2. 模型会自动加载workdirs/目录下最新的权重
  3. 或者你可以手动指定模型路径

如果你想在代码中加载微调后的模型:

import torch from models.resnet18_ocr import ResNet18OCR # 加载模型结构 model = ResNet18OCR() # 加载微调后的权重 checkpoint = torch.load('/root/cv_resnet18_ocr-detection/workdirs/你的训练任务/best_model.pth') model.load_state_dict(checkpoint['model_state_dict']) # 切换到评估模式 model.eval()

5.2 评估模型效果

训练完成后,你需要评估模型在实际数据上的表现:

定量评估指标:

  • 精确率(Precision):检测出的框中,有多少是真正的文字
  • 召回率(Recall):所有真正的文字,有多少被检测出来了
  • F1分数:精确率和召回率的调和平均

定性评估方法:

  1. 准备一批测试图片(不要和训练集重复)
  2. 用训练好的模型进行检测
  3. 人工检查检测结果:
    • 有没有漏检(该检测的没检测到)
    • 有没有误检(不是文字的也被框出来了)
    • 文本框的位置准不准
    • 对于倾斜文字,框的贴合度如何

评估代码示例:

def evaluate_model(model, test_loader): model.eval() total_precision = 0 total_recall = 0 total_f1 = 0 num_samples = 0 with torch.no_grad(): for images, targets in test_loader: # 模型预测 predictions = model(images) # 计算评估指标 precision, recall, f1 = calculate_metrics(predictions, targets) total_precision += precision total_recall += recall total_f1 += f1 num_samples += 1 avg_precision = total_precision / num_samples avg_recall = total_recall / num_samples avg_f1 = total_f1 / num_samples print(f"平均精确率: {avg_precision:.4f}") print(f"平均召回率: {avg_recall:.4f}") print(f"平均F1分数: {avg_f1:.4f}") return avg_precision, avg_recall, avg_f1

5.3 模型效果不佳怎么办?

如果微调后的模型效果不理想,可以尝试以下方法:

1. 检查数据质量

  • 标注是否准确?有没有漏标或错标?
  • 图片质量是否太差?考虑进行预处理(去噪、增强对比度等)

2. 调整训练参数

  • 增加训练轮数(如果欠拟合)
  • 减小学习率(如果loss波动大)
  • 增加数据增强(如果数据量少)

3. 尝试不同的模型初始化

  • 从不同的预训练权重开始
  • 尝试冻结部分层,只训练最后几层

4. 调整检测阈值在WebUI中调整检测阈值:

  • 如果漏检多,降低阈值(如0.1)
  • 如果误检多,提高阈值(如0.3)

6. 进阶技巧:持续改进你的OCR模型

6.1 增量训练:让模型越来越聪明

当你有了新的数据,不需要从头开始训练:

# 加载之前训练好的模型 checkpoint = torch.load('previous_model.pth') model.load_state_dict(checkpoint['model_state_dict']) optimizer.load_state_dict(checkpoint['optimizer_state_dict']) # 用新数据继续训练 train_with_new_data(model, new_data_loader, optimizer)

6.2 难例挖掘:重点攻克识别难点

找出模型识别不好的样本,重点训练:

  1. 用当前模型在测试集上推理
  2. 找出识别错误的样本(漏检、误检、识别错误)
  3. 把这些难例加入训练集重新训练
  4. 重复这个过程,模型会越来越强

6.3 多阶段训练策略

对于复杂场景,可以分阶段训练:

阶段1:基础训练

  • 数据:通用文字图片
  • 目标:让模型学会基本的文字检测

阶段2:领域适应

  • 数据:你的业务场景图片
  • 目标:让模型适应你的特定场景

阶段3:精细调优

  • 数据:难例+高质量标注
  • 目标:提升在难点样本上的表现

6.4 模型集成:多个模型投票决定

如果单个模型效果有限,可以训练多个模型,然后集成:

# 训练多个不同初始化的模型 models = [] for i in range(3): model = ResNet18OCR() # 用不同的随机种子初始化 torch.manual_seed(i) # 训练模型... models.append(model) # 推理时集成 def ensemble_predict(models, image): all_predictions = [] for model in models: pred = model(image) all_predictions.append(pred) # 投票或平均结果 final_prediction = combine_predictions(all_predictions) return final_prediction

7. 总结

通过这篇指南,你应该已经掌握了如何使用自定义数据集训练和微调cv_resnet18_ocr-detection模型。让我们回顾一下关键要点:

数据准备是基础:高质量、格式正确的数据是成功训练的前提。记住ICDAR2015格式的要求,确保标注准确。

参数调整有技巧:Batch Size、学习率、训练轮数这些参数不是固定的,需要根据你的数据和硬件情况灵活调整。

监控训练很重要:不要设好参数就放任不管,要观察loss变化,及时调整策略。

评估模型要全面:既要看定量指标(精确率、召回率),也要做定性检查(人工看结果)。

持续改进是王道:模型训练不是一劳永逸的,通过增量训练、难例挖掘等方法,可以让模型越来越适应你的需求。

训练自己的OCR模型可能一开始会觉得有点复杂,但一旦走通整个流程,你会发现它带来的价值是巨大的。一个针对你业务场景优化的OCR模型,识别准确率可能比通用模型高出20%-30%,这在实际应用中意味着更少的人工校对、更高的自动化程度。

现在,你可以开始收集你的数据,动手训练属于你自己的OCR检测模型了。记住,最好的学习方式就是动手实践。从一个小数据集开始,体验整个训练流程,然后逐步扩大数据规模,优化模型效果。


获取更多AI镜像

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

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

强烈收藏!网安全阶段学习路线 + 工具杂项合集,一站式吃透

1. 安全法(笔者认为学习网络安全前首先得学这个) 不是这个↑ 网络安全法律:了解网络安全相关的法律法规和伦理标准。 合规性与标准:学习ISO 27001、GDPR等安全标准和合规要求。 2. 基础知识 计算机网络基础:了解网…

作者头像 李华
网站建设 2026/4/14 14:50:16

联想平板全场景操作指南|新手老手都能用的官方视频教程合集

很多联想平板用户都有这样的困扰:刚入手时,不知道如何快速设置网络、分屏多任务、连接外设,只能对着说明书反复琢磨;用久了之后,想解锁手写笔批注、平板投屏、文件同步等进阶功能,却找不到靠谱的教程&#…

作者头像 李华