最好用的图文识别OCR -- PaddleOCR(2) 提高推理效率(PPOCR模型转ONNX模型进行推理)

在实际推理过程中,使用 PaddleOCR 模型时效率较慢,经测试每张图片的检测与识别平均耗时超过 5 秒,这在需要大规模自动化处理的场景中无法满足需求。为此,我尝试将 PaddleOCR 模型转换为 ONNX 格式进行推理,以提升效率。以下是模型转换与使用的完整过程记录。


基于项目

本次转换基于 GitHub 上的 OnnxOCR 项目,仓库地址如下:
https://github.com/jingsongliujing/OnnxOCR

项目的介绍图如下:

优化后的代码参考: https://github.com/CKboss/pp_onnx

本文使用到的模型转换工具: Paddle2ONNX


1. 环境准备

1.1 安装必要工具和依赖:

bash 复制代码
pip install paddle2onnx
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

1.2 下载模型与相关资源:

PaddleOCR官方模型列表:https://paddlepaddle.github.io/PaddleOCR/latest/ppocr/model_list.html

以下为本文用到的模型及其下载地址:

分别下载并解压上面的模型列表 & 字典文件 & 中文字体 留作备用

1.3 配置PaddleOCR的运行环境

参考上一篇文章中的 PaddleOCR 高精度版本 配置:
最好用的图文识别OCR -- PaddleOCR(1) 快速集成


2. 模型转换

下载 OnnxOCR 项目代码:

bash 复制代码
git clone https://github.com/jingsongliujing/OnnxOCR.git

转换 PaddleOCR 模型为 ONNX:

使用之前下载好的模型文件开始进行模型转换,以下命令用于将 PaddleOCR 的检测、识别和方向分类模型分别转换为 ONNX 格式。

bash 复制代码
# 检测模型转换
paddle2onnx --model_dir ./ch_PP-OCRv4_det_server_infer \
             --model_filename inference.pdmodel \
             --params_filename inference.pdiparams \
             --save_file ./ch_PP-OCRv4_server_det.onnx \
             --opset_version 11 --enable_onnx_checker True

# 识别模型转换
paddle2onnx --model_dir ./ch_PP-OCRv4_rec_server_infer \
             --model_filename inference.pdmodel \
             --params_filename inference.pdiparams \
             --save_file ./ch_PP-OCRv4_server_rec.onnx \
             --opset_version 11 --enable_onnx_checker True

# 方向分类模型转换
paddle2onnx --model_dir ./ch_ppocr_mobile_v2.0_cls_infer \
             --model_filename inference.pdmodel \
             --params_filename inference.pdiparams \
             --save_file ./ch_ppocr_mobile_v2.0_cls.onnx \
             --opset_version 11 --enable_onnx_checker True

模型文件的最终存放结构如下:


3. 转换后效果测试

测试图片示例:
使用 PaddleOCR 模型进行推理:

以下代码演示 PaddleOCR 的推理流程:

python 复制代码
from paddlex import create_pipeline
import cv2
import time

time1 = time.time()
pipeline = create_pipeline(pipeline="../OCR.yaml",device='cpu')

image = cv2.imread("../tb-img/img9.webp")
output = pipeline.predict(image)
time_count = time.time() - time1

for res in output:
    print(res.get("rec_text"),res.get("dt_scores"))
print(f'------------------------ 总花费时间: {time_count} 秒----------------------')
使用转换后的 ONNX 模型进行推理:

以下代码演示 ONNX 模型的推理流程:

python 复制代码
import cv2
import time
from onnxocr.onnx_paddleocr import ONNXPaddleOcr,sav2Img
from pathlib import Path

# 获取当前文件所在的目录
module_dir = Path(__file__).resolve().parent
ch_model = {
    "det_model_dir": f'{module_dir}/onnxocr/models/ppocrv4/det/ch/ch_PP-OCRv4_server_det.onnx',
    "rec_model_dir": f'{module_dir}/onnxocr/models/ppocrv4/rec/ch/ch_PP-OCRv4_server_rec.onnx',
    "cls_model_dir": f'{module_dir}/onnxocr/models/ppocrv4/cls/ch_ppocr_mobile_v2.0_cls.onnx',
    "rec_char_dict_path": f'{module_dir}/onnxocr/models/ppocrv4/rec_char_dict/ppocr_keys_v1.txt',
    "vis_font_path":f'{module_dir}/onnxocr/fonts/simfang.ttf'
}

time1 = time.time()

model = ONNXPaddleOcr(
    use_angle_cls=True, 
    use_gpu=False,
    det_model_dir=ch_model["det_model_dir"],
    rec_model_dir=ch_model["rec_model_dir"],
    cls_model_dir=ch_model["cls_model_dir"],
    rec_char_dict_path=ch_model["rec_char_dict_path"],
    vis_font_path=ch_model["vis_font_path"],
    drop_score=0.1,
    )

resized_img = cv2.imread("../tb-img/img9.webp")
# 调整尺寸
# resized_img = cv2.resize(resized_img, (960, 960))
result = model.ocr(resized_img)
time_count = time.time() - time1

for res in result[0]:
    print(res[1][0],res[1][1])
print(f'------------------------ 总花费时间: {time_count} 秒----------------------')

结论

通过将 PaddleOCR 模型转换为 ONNX 格式,可以显著提升推理速度。测试显示,在相同硬件环境下,ONNX 模型推理效率更高,适合大规模自动化处理场景。

相关推荐
耿雨飞几秒前
Python 后端开发技术博客专栏 | 第 03 篇 面向对象编程进阶 -- 从 SOLID 原则到 Python 特色 OOP
开发语言·python·面向对象·oop
m0_678485452 分钟前
c++如何提取系统环境变量并直接保存到txt日志中_getenv与ofstream【实战】
jvm·数据库·python
源码站~4 分钟前
基于python的校园代跑(跑腿)系统
开发语言·python
BugShare4 分钟前
一个用 Rust 编写的、速度极快的 Python 包和项目管理器
开发语言·python·rust
qq_342295826 分钟前
Go语言怎么嵌入静态文件_Go语言embed嵌入文件教程【秒懂】
jvm·数据库·python
耿雨飞10 分钟前
Python 后端开发技术博客专栏 | 第 04 篇 Python 内存管理与垃圾回收 -- 从引用计数到分代回收
开发语言·python·垃圾回收
qq_2069013912 分钟前
如何在Linux上源码编译安装MySQL_CMake配置与依赖包安装
jvm·数据库·python
2401_8716965219 分钟前
CSS如何解决Flex布局在老版本安卓机兼容性_使用autoprefixer工具
jvm·数据库·python
qq_2069013920 分钟前
c++怎么把多个变量一次性写入二进制文件_结构体对齐与write【实战】
jvm·数据库·python
weixin_5806140020 分钟前
golang如何给图片添加水印_golang图片添加水印解析
jvm·数据库·python