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

news/2025/1/8 8:25:34/

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


基于项目

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

项目的介绍图如下:
OnnxOCR 项目介绍

优化后的代码参考: https://github.com/CKboss/pp_onnx
本文使用到的模型转换工具: Paddle2ONNX


1. 环境准备

1.1 安装必要工具和依赖:

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

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

  • 中文检测模型:ch_PP-OCRv4_server_det
    下载链接

  • 中文识别模型:ch_PP-OCRv4_server_rec
    下载链接

  • 文本方向分类模型:ch_ppocr_mobile_v2.0_cls
    下载链接

  • 中文字典:ppocr_keys_v1
    下载链接

  • 中文字体:simfang.ttf
    下载链接

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

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


2. 模型转换

下载 OnnxOCR 项目代码:

git clone https://github.com/jingsongliujing/OnnxOCR.git

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

# 检测模型转换
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__95">使用 PaddleOCR 模型进行推理:

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

python">from paddlex import create_pipeline
import cv2
import timetime1 = 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() - time1for res in output:print(res.get("rec_text"),res.get("dt_scores"))
print(f'------------------------ 总花费时间: {time_count} 秒----------------------')
ONNX__115">使用转换后的 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() - time1for res in result[0]:print(res[1][0],res[1][1])
print(f'------------------------ 总花费时间: {time_count} 秒----------------------')

结论

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


http://www.ppmy.cn/news/1561506.html

相关文章

CV-MLLM经典论文解读|OneLLM: One Framework to Align All Modalities with Language

论文标题: OneLLM: One Framework to Align All Modalities with Language OneLLM:一个框架,将所有模态与语言对齐 论文链接: Pink: Unveiling the Power of Referential Comprehension for Multi-modal LLMs论文下载 论文作…

基于SPring Boot的高校就业招聘系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

Ubuntu 、Debian(Kali) 、Centos 命令区别(三剑客)

1、安装 Ubuntu从软件源 安装: apt-get install XXX (包名)Debian(Kali)从软件源 安装: apt-get install xxx (包名) CentOS从软件源 安装: yum install XXX XXX (包名) 2、包的信息 Debian(Kali)从软件源 安装: apt-cache sea…

GitHub的简单操作

引言 今天开始就要开始做项目了,上午是要把git搭好。搭的过程中遇到好多好多的问题。下面就说一下git的简单操作流程。我们是使用的GitHub,下面也就以这个为例了 一、GitHub账号的登录注册 https://github.com/ 通过这个网址可以来到GitHub首页 点击中间绿色的S…

番外篇-CSS3新增特性

CSS3是CSS的第三个版本,引入了许多新的特性和功能。以下是一些CSS3新增的特性: 1. 变换(Transform):可以通过旋转、缩放、倾斜和平移等变换操作改变元素的外观和位置。 2. 过渡(Transition)&a…

【linux系统之redis6】redis的基础命令使用及springboot连接redis

redis的基础命令很多,大部分我们都可以在官网上找到,真的用的时候可以去官网找,不用全部记住这些命令 redis通用的基础命令的使用 代码测试 string类型常见的命令 key值的结构,可以区分不同的需求不同的业务名字 hash类型 创建…

【EI会议征稿】2025图像处理和深度学习国际学术会议(IPDL 2025)

重要信息 时间:2025年4月11-13日 大会地点:中国-成都 首轮截稿:2024年12月31日 接受/拒稿通知:投稿后约3~8天 收录检索:EI Compendex,Scopus 点击查看会议主页:2025图像处理和深度学习国际…

蓝桥杯 第十五届 研究生组 第二题 召唤数学精灵

问题描述: 数学家们发现了两种用于召唤强大的数学精灵的仪式,这两种仪式分别被称为累加法仪式 A(n) 和累乘法仪式 B(n)。累加法仪式 A(n) 是将从 1 到 n 的所有数字进行累加求和,即:A(n)12⋯n累乘法仪式 B(n) 则是将从 1 到 n 的所…