RapidOCR集成PP-OCRv5_det mobile模型记录

article/2025/9/6 18:20:28

该文章主要摘取记录RapidOCR集成PP-OCRv5_mobile_det记录,涉及模型转换,模型精度测试等步骤。原文请前往官方博客:

https://rapidai.github.io/RapidOCRDocs/main/blog/2025/05/26/rapidocr%E9%9B%86%E6%88%90pp-ocrv5_det%E6%A8%A1%E5%9E%8Bmobileserver%E8%AE%B0%E5%BD%95/

引言

来自PaddleOCR官方文档:

PP-OCRv5 是PP-OCR新一代文字识别解决方案,该方案聚焦于多场景、多文字类型的文字识别。在文字类型方面,PP-OCRv5支持简体中文、中文拼音、繁体中文、英文、日文5大主流文字类型,在场景方面,PP-OCRv5升级了中英复杂手写体、竖排文本、生僻字等多种挑战性场景的识别能力。在内部多场景复杂评估集上,PP-OCRv5较PP-OCRv4端到端提升13个百分点。

以下代码运行环境

  • OS: macOS Sequoia 15.5
  • Python: 3.10.14
  • PaddlePaddle: 3.0.0
  • paddle2onnx: 2.0.2.rc1
  • paddlex: 3.0.0
  • rapidocr: 2.1.0

1. 模型跑通

该步骤主要先基于PaddleX可以正确使用PP-OCRv5_mobile_det模型得到正确结果。

该部分主要参考文档:docs

安装paddlex:

pip install "paddlex[ocr]==3.0.0"

测试PP-OCRv5_mobile_det模型能否正常识别:

运行以下代码时,模型会自动下载到 /Users/用户名/.paddlex/official_models 下。

测试图:link


from paddlex import create_model# mobile
model = create_model(model_name="PP-OCRv5_mobile_det")# server
model = create_model(model_name="PP-OCRv5_server_det")output = model.predict(input="images/general_ocr_001.png", batch_size=1)
for res in output:res.print()res.save_to_img(save_path="./output/")res.save_to_json(save_path="./output/res.json")

预期结果如下,表明成功运行:

在这里插入图片描述

2. 模型转换

该部分主要参考文档: docs

转换PP-OCRv5_mobile_det

PaddleX官方集成了paddle2onnx的转换代码:

paddlex --install paddle2onnx
pip install onnx==1.16.0paddlex --paddle2onnx --paddle_model_dir models/official_models/PP-OCRv5_mobile_det --onnx_model_dir models/PP-OCRv5_mobile_det

输出日志如下,表明转换成功:

Input dir: models/official_models/PP-OCRv5_mobile_det
Output dir: models/PP-OCRv5_mobile_det
Paddle2ONNX conversion starting...
[Paddle2ONNX] Start parsing the Paddle model file...
[Paddle2ONNX] Use opset_version = 14 for ONNX export.
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.
2025-05-26 21:53:00 [INFO]      Try to perform constant folding on the ONNX model with Polygraphy.
[W] 'colored' module is not installed, will not use colors when logging. To enable colors, please install the 'colored' module: python3 -m pip install colored
[I] Folding Constants | Pass 1
[I]     Total Nodes | Original:   925, After Folding:   502 |   423 Nodes Folded
[I] Folding Constants | Pass 2
[I]     Total Nodes | Original:   502, After Folding:   502 |     0 Nodes Folded
2025-05-26 21:53:08 [INFO]      ONNX model saved in models/PP-OCRv5_mobile_det/inference.onnx.
Paddle2ONNX conversion succeeded
Copied models/official_models/PP-OCRv5_mobile_det/inference.yml to models/PP-OCRv5_mobile_det/inference.yml
Done

3. 模型推理验证

验证PP-OCRv5_mobile_det模型

该部分主要是在RapidOCR项目中测试能否直接使用onnx模型。要点主要是确定模型前后处理是否兼容。从PaddleOCR config文件中比较PP-OCRv4和PP-OCRv5 mobile det文件差异:
在这里插入图片描述

从上图中可以看出,配置基本一模一样,因此现有rapidocr前后推理代码可以直接使用。

from rapidocr import RapidOCRmodel_path = "models/PP-OCRv5_mobile_det/inference.onnx"
engine = RapidOCR(params={"Det.model_path": model_path})img_url = "https://img1.baidu.com/it/u=3619974146,1266987475&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=516"
result = engine(img_url)
print(result)result.vis("vis_result.jpg")

在这里插入图片描述

4. 模型精度测试

测试集text_det_test_dataset包括卡证类、文档类和自然场景三大类。其中卡证类有82张,文档类有75张,自然场景类有55张。缺少手写体、繁体、日文、古籍文本、拼音、艺术字等数据。因此,该基于该测评集的结果仅供参考。

欢迎有兴趣的小伙伴,可以和我们一起共建更加全面的测评集。

该部分主要使用TextDetMetric和测试集text_det_test_dataset来评测。

相关测试步骤请参见TextDetMetric的README,一步一步来就行。我这里简单给出关键代码:

其中,计算 pred.txt 代码如下:(仅列出了Exp1的代码,Exp2和Exp3的代码请前往官方博客阅读)

(Exp1)RapidOCR框架+ONNXRuntime格式模型:

import cv2
import numpy as np
from datasets import load_dataset
from tqdm import tqdmfrom rapidocr import EngineType, ModelType, OCRVersion, RapidOCRengine = RapidOCR(params={"Det.ocr_version": OCRVersion.PPOCRV5,"Det.engine_type": EngineType.ONNXRUNTIME,"Det.model_type": ModelType.MOBILE,}
)dataset = load_dataset("SWHL/text_det_test_dataset")
test_data = dataset["test"]content = []
for i, one_data in enumerate(tqdm(test_data)):img = np.array(one_data.get("image"))img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)ocr_results = engine(img, use_det=True, use_cls=False, use_rec=False)dt_boxes = ocr_results.boxesdt_boxes = [] if dt_boxes is None else dt_boxes.tolist()elapse = ocr_results.elapsegt_boxes = [v["points"] for v in one_data["shapes"]]content.append(f"{dt_boxes}\t{gt_boxes}\t{elapse}")with open("pred.txt", "w", encoding="utf-8") as f:for v in content:f.write(f"{v}\n")

计算指标代码:

from text_det_metric import TextDetMetricmetric = TextDetMetric()
pred_path = "pred.txt"
metric = metric(pred_path)
print(metric)

指标汇总如下(以下指标均为CPU下计算所得):

Exp模型推理框架模型格式Precision↑Recall↑H-mean↑Elapse↓
1PP-OCRv5_mobile_detPaddleXPaddlePaddle0.78640.80180.79400.1956
2PP-OCRv5_mobile_detRapidOCRPaddlePaddle0.78610.82660.80580.5328
3PP-OCRv5_mobile_detRapidOCRONNXRuntime0.78610.82660.80580.1653
4PP-OCRv4_mobile_detRapidOCRONNXRuntime0.83010.86590.8476-
5PP-OCRv5_server_detPaddleXPaddlePaddle0.83470.85830.84632.1450
6PP-OCRv5_server_detRapidOCRPaddlePaddle
7PP-OCRv5_server_detRapidOCRONNXRuntime0.73940.84420.78832.0628
8PP-OCRv4_server_detRapidOCRONNXRuntime0.79220.81280.7691-

从以上结果来看,可以得到以下结论:

  1. Exp1和Exp2相比,H-mean差异不大,说明文本检测 前后处理代码可以共用

  2. Exp2和Exp3相比,mobile模型转换为ONNX格式后,指标几乎一致,说明 模型转换前后,误差较小,推理速度也有提升

  3. Exp3和Exp4相比,mobile整体指标弱于PP-OCRv4的。因为测评集集中在中英文的印刷体,手写体少些,因此仅供参考。

  4. Exp6直接跑,会报以下错误,暂时没有找到原因。如有知道的小伙伴,欢迎留言告知。

    5%|████████▏                                                                                                                                                     | 11/212 [00:42<13:11,  3.94s/it][1]    61275 bus error  python t.py/Users/xxxxx/miniconda3/envs/py310/lib/python3.10/multiprocessing/resource_tracker.py:224: UserWarning: resource_tracker: There appear to be 1 leaked semaphore objects to clean up at shutdown
    warnings.warn('resource_tracker: There appear to be %d '
    
  5. 因为Exp6暂时没有找到原因,粗略将Exp5和Exp7相比,可以看到PP-OCRv5 server模型转换为ONNX格式后,H-mean下降了5.8% ,但是转换方式和mobile的相同,具体原因需要进一步排查。如有知道的小伙伴,欢迎留言告知。

  6. Exp7和Exp8相比,PP-OCRv5 server模型提升很大(H-mean提升7.72%)。不排除用到了测评集数据。

最终建议:

  • 如果是单一中英文场景,建议用PP-OCRv4系列
  • 如果是中英日、印刷和手写体混合场景,建议用PP-OCRv5系列

上述表格中基于ONNXRuntime的结果已经更新到开源OCR模型对比中。

5. 集成到rapidocr中

该部分主要包括将托管模型到魔搭、更改rapidocr代码适配等。

托管模型到魔搭

该部分主要是涉及模型上传到对应位置,并合理命名。注意上传完成后,需要打Tag,避免后续rapidocr whl包中找不到模型下载路径。

我这里已经上传到了魔搭上,详细链接参见:link

更改rapidocr代码适配

该部分主要涉及到更改default_models.yaml和paddle.py的代码来适配。

同时,需要添加对应的单元测试,在保证之前单测成功的同时,新的针对性该模型的单测也能通过。

我这里已经做完了,小伙伴们感兴趣可以去看看源码。

写在最后

至此,该部分集成工作就基本完成了。这部分代码会集成到rapidocr==3.0.0中。版本号之所以从v2.1.0到v3.0.0,原因是:语义化版本号。

我在集成过程中,发现v2.1.0中字段不太合理,做了一些改进,动了外部API,因此只能升大版本号。请大家在使用过程中,注意查看最新文档→ docs 。


http://www.hkcw.cn/article/aqMumyjGcl.shtml

相关文章

【深度学习】13. 图神经网络GCN,Spatial Approach, Spectral Approach

图神经网络 图结构 vs 网格结构 传统的深度学习&#xff08;如 CNN 和 RNN&#xff09;在处理网格结构数据&#xff08;如图像、语音、文本&#xff09;时表现良好&#xff0c;因为这些数据具有固定的空间结构。然而&#xff0c;真实世界中的很多数据并不遵循网格结构&#x…

从“无差别降噪”到“精准语音保留”:非因果优化技术为助听设备和耳机降噪注入新活力

在复杂环境中保持清晰语音感知一直是助听设备与消费级耳机的核心挑战。传统主动降噪&#xff08;ANC&#xff09;技术虽能抑制环境噪声&#xff0c;但会无差别削弱所有声音&#xff0c;导致用户难以听清目标方向的语音&#xff08;如对话者&#xff09;。近年来&#xff0c;开放…

家庭路由器改装,搭建openwrt旁路由以及手机存储服务器,实现外网节点转发、内网穿透、远程存储、接入满血DeepSeek方案

大家好&#xff0c;也是好久没有发文了&#xff0c;最近在捣鼓一些比较有趣的东西&#xff0c;打算跟大家分享一下&#xff01; 先聊一下我的大致方案嘛&#xff0c;最近感觉家里路由器平时一直就只有无线广播供网的功能&#xff0c;感觉这么好的一下嵌入式设备产品不应该就干这…

【Linux】shell脚本的变量与运算

目录 一.变量 1.1什么是变量 1.2变量的命名 1.3变量的调用 1.4字符的转义 1.5变量的取消 二.变量的类型 2.1函数级变量 2.2环境级变量 2.3用户级变量 2.4系统级变量 2.5常见的系统变量 三..特殊变量及定义 3.1用命令的执行结果定义变量 3.2传参变量 3.3交互式传…

Linux进程概念

一.冯诺依曼体系结构 冯诺依曼体系结构是当代计算机的基本结构&#xff0c;它主要包括几个板块&#xff0c;输入设备&#xff0c;输出设备&#xff0c;存储器&#xff0c;运算器和控制器。 下面是简略版的图解析&#xff1a; 输入设备主要包含鼠标&#xff0c;键盘&#xff0…

[9-2] USART串口外设 江协科技学习笔记(9个知识点)

1 2 3 智能卡、IrDA和LIN是三种不同的通信技术&#xff0c;它们在电子和汽车领域中有着广泛的应用&#xff1a; • 智能卡&#xff08;Smart Card&#xff09;&#xff1a; • 是什么&#xff1a;智能卡是一种带有嵌入式微处理器和存储器的塑料卡片&#xff0c;可以存储和处理数…

低代码——表单生成器以form-generator为例

主要执行流程说明&#xff1a; 初始化阶段 &#xff1a; 接收表单配置对象formConf深拷贝配置&#xff0c;初始化表单数据和验证规则处理每个表单组件的默认值和特殊配置&#xff08;如文件上传&#xff09; 渲染阶段 &#xff1a; 通过render函数创建el-form根组件递归渲染表…

奥威BI+AI——高效智能数据分析工具,引领数据分析新时代

随着数据量的激增&#xff0c;企业对高效、智能的数据分析工具——奥威BIAI的需求日益迫切。奥威BIAI&#xff0c;作为一款颠覆性的数据分析工具&#xff0c;凭借其独特功能&#xff0c;正在引领数据分析领域的新纪元。 一、‌零报表环境下的极致体验‌ 奥威BIAI突破传统报表限…

grid网格布局

使用flex布局的痛点 如果使用justify-content: space-between;让子元素两端对齐&#xff0c;自动分配中间间距&#xff0c;假设一行4个&#xff0c;如果每一行都是4的倍数那没任何问题&#xff0c;但如果最后一行是2、3个的时候就会出现下面的状况&#xff1a; /* flex布局 两…

基于 GitLab CI + Inno Setup 实现 Windows 程序自动化打包发布方案

在 Windows 桌面应用开发中&#xff0c;实现自动化构建与打包发布是一项非常实用的工程实践。本文以我在开发PackTes项目时的为例&#xff0c;介绍如何通过 GitLab CI 配合 Inno Setup、批处理脚本、Qt 构建工具&#xff0c;实现版本化打包并发布到共享目录的完整流程。 项目地…

江西某石灰石矿边坡自动化监测

1. 项目简介 该矿为露天矿山&#xff0c;开采矿种为水泥用石灰岩&#xff0c;许可生产规模200万t/a&#xff0c;矿区面积为1.2264km2&#xff0c;许可开采深度为422m&#xff5e;250m。矿区地形为东西一北东东向带状分布&#xff0c;北高南低&#xff0c;北部为由浅变质岩系组…

星海掘金:校园极客的Token诗篇(蓝耘MaaS平台)——从数据尘埃到智能生命的炼金秘录

hi&#xff0c;我是云边有个稻草人 目录 前言 一、初识蓝耘元生代MaaS平台&#xff1a;零门槛体验AI服务 1.1 从零开始——平台注册与环境搭建 1.2 平台核心功能 1.3 蓝耘平台的优势在哪里&#xff1f; 二、知识库构建新篇章&#xff1a;从零碎资料到智能语义仓库的蜕变…

测试概念 和 bug

一 敏捷模型 在面对在开发项目时会遇到客户变更需求以及合并新的需求带来的高成本和时间 出现的敏捷模型 敏捷宣言 个人与交互重于过程与工具 强调有效的沟通 可用的软件重于完备的文档 强调轻文档重产出 客户协作重于合同谈判 主动及时了解当下的要求 相应变化…

14. 最长公共前缀

以示例1为例 从左到右依次比较每个字符&#xff1a; 第一个字符都是f&#xff0c;当前最长公共前缀为"f"第二个字符都是l&#xff0c;当前最长公共前缀更新为"fl"第三个字符不一致&#xff0c;因此最终最长公共前缀确定为"fl" 具体实现思路&am…

【CF】Day69——⭐Codeforces Round 897 (Div. 2) D (图论 | 思维 | DFS | 环)

D. Cyclic Operations 题目&#xff1a; 思路&#xff1a; 非常好的一题 对于这题我们要学会转换和提取条件&#xff0c;从特殊到一般 我们可以考虑特殊情况先&#xff0c;即 k n 和 k 1时&#xff0c;对于 k 1&#xff0c;我们可以显然发现必须满足 b[i] i&#xff0c;而…

[9-1] USART串口协议 江协科技学习笔记(13个知识点)

1 2 3 4全双工就是两个数据线&#xff0c;半双工就是一个数据线 5 6 7 8 9 10 TTL&#xff08;Transistor-Transistor Logic&#xff09;电平是一种数字电路中常用的电平标准&#xff0c;它使用晶体管来表示逻辑状态。TTL电平通常指的是5V逻辑电平&#xff0c;其中&#xff1a;…

2025年- H57-Lc165--994.腐烂的橘子(图论,广搜)--Java版

1.题目描述 2.思路 3.代码实现 import java.util.LinkedList; import java.util.Queue;public class H994 {public int orangesRotting(int[][] grid) {//1.获取行数int rowsgrid.length;int colsgrid[0].length;//2.创建队列用于bfsQueue<int[]> quenew LinkedList<…

RK3568DAYU开发板-平台驱动开发--UART

1、程序介绍 本程序是基于OpenHarmony标准系统编写的平台驱动案例&#xff1a;UART 系统版本:openharmony5.0.0 开发板:dayu200 编译环境:ubuntu22 部署路径&#xff1a; //sample/06_platform_uart 2、基础知识 2.1、UART简介 UART指异步收发传输器&#xff08;Univer…

【东枫科技】KrakenSDR 测向快速入门指南

本快速入门指南旨在帮助您使用运行在 Raspberry Pi 4/5 或 Orange Pi 5B (OPI5B)&#xff08;带 WiFi 型号&#xff09;上的 KrakenSDR 尽快连接到测向应用程序。不过&#xff0c;请务必阅读本手册的其余部分&#xff0c;以了解无线电测向的工作原理。 你需要什么 本指南假设…

每日算法-250529

2909. 元素和最小的山形三元组 II 题目 思路 数组, 前后缀分解 解题过程 对于寻找满足特定条件的三元组 (nums[i], nums[j], nums[k]) 且 i < j < k 的问题&#xff0c;一个常见的思路是枚举中间元素 nums[j]。 确定目标&#xff1a;我们要找的是和最小的 “山形三元组…