最好用的图文识别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 安装必要工具和依赖:
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 模型进行推理:
以下代码演示 PaddleOCR 的推理流程:
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 模型进行推理:
以下代码演示 ONNX 模型的推理流程:
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 模型推理效率更高,适合大规模自动化处理场景。
相关文章:

最好用的图文识别OCR -- PaddleOCR(2) 提高推理效率(PPOCR模型转ONNX模型进行推理)
在实际推理过程中,使用 PaddleOCR 模型时效率较慢,经测试每张图片的检测与识别平均耗时超过 5 秒,这在需要大规模自动化处理的场景中无法满足需求。为此,我尝试将 PaddleOCR 模型转换为 ONNX 格式进行推理,以提升效率。…...

Redis--20--大Key问题解析
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 大Key问题1.什么是 Redis 大 Key?在 Redis 中,大 Key 是指单个键值对的数据量非常大,可能包含大量数据。 2. Redis大Key的危害3.…...

新版2024AndroidStudio项目目录结构拆分
如题 下载了最新版的android studio 发现目录结构和以前不一样 自动帮你合并了 如何层层抽丝剥茧呢 按照一下步骤即可解决问题!...

STM32内置Flash
一、原理 利用flash存储用户数据需要注意查看,用户数据是否会覆盖芯片运行程序。 IAP(在程序中编程)利用程序修改程序本身,和OTA是一个原理。IAP在程序中编程支持任意一种通信下载。 ICP(在电路中编程,通…...

华为路由器、交换机、AC、新版本开局远程登录那些坑(Telnet、SSH/HTTP避坑指南)
关于华为设备远程登录配置开启的通用习惯1、HTTP/HTTPS相关服务 http secure-server enablehttp server enable 2、Telnet服务telnet server enable3、SSH服务stelnet server enablessh user admin authentication-type password 「模拟器、工具合集」复制整段内容 链接&…...

【Linux】深入理解进程信号机制:信号的产生、捕获与阻塞
🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 时间不语,却回答了所有问题 目录 📚前言 📚一、信号的本质 📖1.异步通信 📖2.信…...

前端基础技术全解析:从HTML前端基础标签语言开始,逐步深入CSS样式修饰、JavaScript脚本控制、Ajax异步通信以及WebSocket持久通信
目录 前言: 1.前端技术html简单了解: 1.1HTML代码是由标签构成的。 1.2.HTML 文件基本结构 1.3.HTML 常见标签 标题标签: 段落标签: p 文本格式化标签 图片标签: 超链接标签: a 测试代码: 展示效果: 表单…...

Linux存储管理之核心秘密(The Core Secret of Linux Storage Management)
Linux存储管理之核心秘密 如果你来自Windows环境,那么Linux处理和管理存储设备的方式对你而言可能显得格外不同。我们知道,Linux的文件系统并不采用Windows那样的物理驱动器表示方式(如C:、D:或E:),而是构建了一个以&…...
excel精简使用工具
1.获取sheet1的行填充到sheet2的列 希望在 Excel 中使用 INDEX 函数从不同的列中提取数据,并且每一行都引用不同的列。为了实现这个目标,你可以使用 COLUMN 函数来动态获取列的偏移量。 为了避免手动输入每个单元格的公式,你可以使用以下公…...
Flutter鸿蒙化 在鸿蒙应用中添加Flutter页面
前言 今天这节课我们讲一下 在鸿蒙应用中添加Flutter页面。 作用: 之前有很多朋友和网友问我鸿蒙能不能使用Flutter开发,他们的项目已经用Flutter开发成熟了有什么好的方案呢,今天讲到这个就可以很好的解决他们的问题,例如我们正式项目中可能是一部分native 开发 一部分…...
为什么页面无法正确显示?都有哪些HTML和CSS相关问题?
页面无法正确显示可能由多种原因导致,通常与HTML和CSS的结构、语法错误、浏览器兼容性、资源加载等问题有关。以下是一些常见的原因及其解决方法,结合实际项目代码示例进行讲解: 1. HTML 结构错误 HTML 标签的缺失或错误可能导致页面无法正…...
如何制作一份出色的公司介绍PPT?
制作一份公司介绍的PPT需要精心设计,以确保内容既专业又吸引人。以下是一个基本的框架和一些建议,帮助您创建一份有效的公司介绍PPT: PPT标题页 标题:公司全称(可使用公司Logo作为背景或嵌入标题中)副标题…...
Selenium 进行网页自动化操作的一个示例,绕过一些网站的自动化检测。python编程
这段代码是使用 Selenium 进行网页自动化操作的一个示例,主要目的是在加载网页时执行一些自定义的 JavaScript 代码,并等待页面上某个元素的出现。以下是代码的详细解释: ### 代码解释 #### 导入必要的模块 python from selenium.webdriver…...
HashMap和HashTable的区别
1、HashMap是线程不安全的,HashTable是线程安全的 HashMap:Fail-fast 机制。表示快速失败,在集合遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出ConcurrentModificationException异常,从而导致遍历失…...
使用redis来进行调优有哪些方案?
Redis的调优方案可以从多个方面进行,以下是一些常见的优化方法及代码示例: 1.使用管道(Pipelining) 管道技术可以减少客户端与Redis之间的交互次数,从而提高性能。在批量操作时,通过管道可以一次性发送多个…...
macOS 中,默认的 Clang 编译器和 Homebrew 安装的 GCC 都不包含 bits/stdc++.h 文件
在 macOS 中,默认的 Clang 编译器和 Homebrew 安装的 GCC 都不包含 bits/stdc.h 文件,因为它是一个 非标准 的头文件,主要由 MinGW 和某些 Linux 平台的 GCC 提供。 解决方案 : 手动创建 bits/stdc.h 1. 创建文件夹和文件 在你的 GCC 标准…...
2012mfc,自绘列表控件
原文 使用常用控件版本4.70中的自定义绘画功能自定义列表控件的外观. 介绍 常见控件的4.70版引入了一项叫自定义绘画的功能. 可按轻量易用的自画版本对待自定义绘画.易用性来自,即只需处理一条消息(NM_CUSTOMDRAW),且你可让窗口为你干活,因此你不必完成物主绘画中的所有粗活…...
vue3运行时执行过程步骤
在 Vue 3 中,运行时的执行过程是一个复杂但高效的机制,主要包括初始化应用、渲染、响应式更新和销毁等阶段。以下是 Vue 3 运行时的执行过程的核心步骤和流程: 1. 应用初始化 1.1 创建 Vue 应用 调用 createApp 方法,创建一个 V…...
常用的AT命令,用于查看不同类型的网络信息
文章目录 1. ATCSQ:2. ATCREG:3. ATCOPS:4. ATCGATT:5. ATCGPADDR: 在AT命令集中,用于查看网络信息的命令有多种,具体取决于所使用的设备和模块。以下是一些常用的AT命令࿰…...
Vue3组件通讯——自定义事件(子->父)
需求如下: 1.在子组件中,当用户点击提交按钮后,更新数据库 2.数据更新成功后,子组件通知父组件getUserInfo函数,重新获取数据,同步更新 3.子组件等待getUserInfo函数执行完毕后,调用init函数…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...