PaddleOCR训练自定义模型及转换ONNX全流程
背景与概述
- PaddleOCR简介:基于飞桨的OCR工具库,支持多语言、多场景文本检测与识别
- 自定义模型的必要性:适应特定业务场景(如特殊字体、复杂背景)
- ONNX转换的价值:跨平台部署(TensorRT、OpenVINO等)与性能优化
环境准备与数据标注
- 安装PaddlePaddle与PaddleOCR(指定版本兼容性)
进入以下网址下载官方程序

可选择版本进行下载,以下内容基于2.7版本。
创建虚拟环境,python版本3.12.4.
(base) C:\Users\zh>conda create --name my_ppocr python=3.12.4
添加刚刚创建的虚拟环境

打开程序后可在根目录下看到requirements.txt为依赖环境

打开本地终端在python对应paddleocr虚拟环境中安装依赖包

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --force-reinstall
在paddleocr下有目录PPOCRLabel,为官方的标注文件。PPOCRLabel下也有requirements.txt依赖环境需要安装。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r PPOCRLabel/requirements.txt
再安装paddlepaddle的gpu版本,这个是基础依赖
python -m pip install paddlepaddle-gpu==2.6.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
可以把PPOCRLabel中"lang"的默认值改为"ch",显示中文界面

运行PPOCRLabel如果numpy报错,可以降级到1.26.4
pip uninstall numpy -y
pip install numpy==1.26.4 -i https://pypi.tuna.tsinghua.edu.cn/simple
打开后点击文件,点击打开目录选择需要打标签的数据集文件夹

选择自动标注点击ok等待自动标注完成,如果中文识别不出,重新选择模型识别
然后从第一张开始检查,漏打标的按下Q框出字体,打标文字错误的,点击方框,在右边修改,并对每一个方框给出关键词列表(点击编辑点击更改box关键词信息)。最后删除无用信息,切换下一张快捷键为D。
全部打标完成之后,点击文件选择导出标记结果,再点击文件选择导出识别结果,完成后再文件夹多出四个文件fileState,Label,rec_gt, crop_img。其中crop_img中的图片用来训练文字识别模型,fileState记录图片的打标完成与否,Label为训练文字检测模型的标签,rec_gt为训练文字识别模型的标签。

————————————————
模型训练流程
对数据标注后,开始训练时我们还需要对数据进一步处理,在PaddleOCR根目录下建立train_data文件夹,并且将打标签生成的文件和图片放在该文件夹下。

修改训练集、验证集、测试集比例运行即可

输入指令之后,在train_data文件夹下会出现以下文件,其中det是用来训练文字检测的数据集,rec是用来训练文字识别的数据集。此时可以删去drivingData。

下载官方模型做训练的基础模型。
OCR 流程的模块独立性PP-OCR 的核心流程是 检测(det) → 方向分类(cls) → 识别(rec),这三个模块是解耦的,彼此之间仅通过标准化的文本框坐标 / 图像数据交互,只要输入输出格式兼容,就可以单独替换任意一个模块:
- det 模型:负责定位图片中的文本区域,输出文本框坐标
- cls 模型:(可选)纠正文本方向(如 90°/180° 旋转)
- rec 模型:将文本框内的图像转换为文字,仅依赖输入图像的尺寸 / 格式,与 det/cls 的具体权重无关
在下面网站下载官方训练模型,注意不是推理模型。
PaddleOCR/doc/doc_ch/models_list.md · 飞桨PaddlePaddle/PaddleOCR - AtomGit | GitCode
检测训练模型如下:

识别训练模型如下:

- 配置模型文件

找到对应的配置文件yml下载,并修改一下参数




我们需要手动更改的地方主要有以下几个地方。



- 启动训练命令示例:
# coding:utf8 import sys import os import paddle # 1. 添加PaddleOCR根路径 PADDLEOCR_ROOT = r"D:\PP-OCR\PaddleOCR-release-2.7" sys.path.insert(0, PADDLEOCR_ROOT) # 2. 强制CPU训练 + 禁用分布式 sys.argv = [ "train.py", "-c", r"D:\PP-OCR\PaddleOCR-release-2.7\pretrain_models\laser.yml", "-o", "Global.distributed=False", "-o", "Global.use_gpu=False", "-o", "Global.device='cpu'" ] # 3. 手动指定CPU paddle.device.set_device("cpu") print("✅ 已切换到CPU训练") # 4. 导入并运行 from tools import program from tools.train import main, set_seed config, device, logger, vdl_writer = program.preprocess(is_train=True) config['Global']['distributed'] = False config['Global']['use_gpu'] = False # config['Global']['use_gpu'] = True seed = config['Global']['seed'] if 'seed' in config['Global'] else 1024 set_seed(seed) main(config, device, logger, vdl_writer, seed)
训练完后的模型为动态模型,还需要转换为静态模型
这部分可参考官方文档
动态模型验证,训练完后可先验证动态模型是否识别正确
import os
from paddleocr import PaddleOCR
import cv2
# 加载最优模型
ocr = PaddleOCR(
rec_model_dir='./output/rec_ppocr_v3/best_accuracy', # 最优模型路径
rec_image_shape='3,48,320', # 和训练配置一致
use_gpu=False, # CPU模式
lang='ch' # 中英混合识别,纯英文可改为'en'
)
# 测试任意图片(替换为你的实际图片路径)
test_img_paths = [
r"D:\PP-OCR\PaddleOCR-release-2.7\train_data\rec\val\00005954_crop_1.jpg",
]
for img_path in test_img_paths:
result = ocr.ocr(img_path, det=False, rec=True)
print(f"\n📸 测试图片:{img_path}")
print(f"✅ 模型识别结果:{result[0][0] if result else '识别失败'}")
# 对比真实标注
with open(r"./train_data/rec/val.txt" if "val" in img_path else r"./train_data/rec/train.txt", "r", encoding="UTF-8") as f:
for line in f:
if os.path.basename(img_path) in line:
print(f"✅ 真实标注内容:{line.split('\t')[1].strip()}")
模型导出为推理格式
动态模型转换为静态模型也需要yml配置,我们复制训练的yml后只需要修改训练模型和输出目录即可
save_inference_dir: ./inference/ch_PP-OCRv3_rec_official_0212 # 导出目录
pretrained_model: r'D:\PP-OCR\PaddleOCR-release-2.7\output\rec_ppocr_v3\best_model' #训练权重路径
输出文件说明:inference.pdmodel(计算图)、inference.pdiparams(权重)
- 导出为Paddle原生推理模型:
python tools/export_model.py -c configs/rec/xxx.yml -o Global.pretrained_model=./output/rec/best_accuracy
ONNX格式转换
- 安装依赖:paddle2onnx、onnxruntime
- 转换命令示例:
paddle2onnx --model_dir ./inference --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./onnx_model.onnx - ONNX模型验证:使用ONNXRuntime加载测试推理结果一致性
未完待续
参考资料
- PaddleOCR官方文档、ONNX转换工具GitHub仓库
- 相关论文与性能优化最佳实践
- 其中原理参考博主
Gaomagic
原文链接:https://blog.csdn.net/qq_52852432/article/details/131817619
更多推荐



所有评论(0)