背景与概述
  • PaddleOCR简介:基于飞桨的OCR工具库,支持多语言、多场景文本检测与识别
  • 自定义模型的必要性:适应特定业务场景(如特殊字体、复杂背景)
  • ONNX转换的价值:跨平台部署(TensorRT、OpenVINO等)与性能优化

环境准备与数据标注
  • 安装PaddlePaddle与PaddleOCR(指定版本兼容性)

进入以下网址下载官方程序

PaddleOcr的gitcode链接

可选择版本进行下载,以下内容基于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)

训练完后的模型为动态模型,还需要转换为静态模型

这部分可参考官方文档

paddleocr模型转换与预览

动态模型验证,训练完后可先验证动态模型是否识别正确


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
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐