RapidOCR集成PP-OCRv5_det mobile模型记录

该文章主要摘取记录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.pswp.cn/bicheng/83419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spine工具入门教程2之导入

1、导入定义 从原画转化为Spine的环节。 &#xff08;1&#xff09;选择路径&#xff0c;拖动图片导入方式 缺点&#xff1a;定位不准 【使用批量导出的方式】 在PS工具中&#xff0c;选择所有图层后右键选择导出。 在Spine工具中&#xff0c;选择路径导入图片。 然后再拖…

【03】完整开发腾讯云播放器SDK的UniApp官方UTS插件——优雅草上架插件市场-卓伊凡

【03】完整开发腾讯云播放器SDK的UniApp官方UTS插件——优雅草上架插件市场-卓伊凡 一、项目背景与转型原因 1.1 原定计划的变更 本系列教程最初规划是开发即构美颜SDK的UTS插件&#xff0c;但由于甲方公司内部战略调整&#xff0c;原项目被迫中止。考虑到&#xff1a; 技术…

戴尔AI服务器订单激增至121亿美元,但传统业务承压

戴尔科技121亿美元的AI服务器订单&#xff0c;不仅超过了公司整个2025财年的AI服务器出货量&#xff0c;更让其AI订单积压达到144亿美元的历史高位。 戴尔科技最新财报显示&#xff0c;AI服务器需求的爆炸式增长正在重塑这家老牌PC制造商的业务格局&#xff0c;但同时也暴露出…

多线程和并发之线程

线程 前面讲到进程&#xff1a;为了并发执行任务&#xff08;程序&#xff09;&#xff0c;现代操作系统才引进进程的概念 分析&#xff1a; 创建开销问题&#xff1a;创建一个进程开销&#xff1a;大 子进程需要拷贝父进程的整个地址空间 通信开销问题&#xff1a;进程间的通…

AAAI 2025论文分享│STD-PLM:基于预训练语言模型的时空数据预测与补全方法

本文详细介绍了一篇发表于人工智能顶级会议AAAI 2025的论文《STD-PLM: Understanding Both Spatial and Temporal Properties of Spatial-Temporal Data with PLM》。该论文提出了一种基于预训练语言模型&#xff08;Pre-trained Language Model‌&#xff0c;PLM&#xff09;的…

前端八股 tcp 和 udp

都是传输层协议 udp 数据报协议 不可靠面向数据包对于应用层传递的报文加上UDP首部就传给网络层 tcp 传输控制协议 可靠 会将报文分段进行传输 区别&#xff1a; 1.tcp 可靠 udp 不可靠 2.tcp 面向连接 三握四挥 udp 无连接 3.tcp面向字节流 udp面向报文 4.效率低 效率高…

MES管理系统:Java+Vue,含源码与文档,实现生产过程实时监控、调度与优化,提升制造企业效能

前言&#xff1a; 在当今竞争激烈的制造业环境中&#xff0c;企业面临着提高生产效率、降低成本、提升产品质量以及快速响应市场变化等多重挑战。MES管理系统作为连接企业上层计划管理系统与底层工业控制之间的桥梁&#xff0c;扮演着至关重要的角色。它能够实时收集、分析和处…

MSTNet:用于糖尿病视网膜病变分类的多尺度空间感知 Transformer 与多实例学习方法|文献速递-深度学习医疗AI最新文献

Title 题目 MSTNet: Multi-scale spatial-aware transformer with multi-instance learning for diabetic retinopathy classification MSTNet&#xff1a;用于糖尿病视网膜病变分类的多尺度空间感知 Transformer 与多实例学习方法 01 文献速递介绍 糖尿病视网膜病变&#…

每日八股文6.2

每日八股-6.2 Go1.GMP调度原理&#xff08;这部分多去看看golang三关加深理解&#xff09;2.GC&#xff08;同样多去看看golang三关加深理解&#xff09;3.闭包4.go语言函数是一等公民是什么意思5.sync.Mutex和sync.RWMutex6.sync.WaitGroup7.sync.Cond8.sync.Pool9.panic和rec…

【Unity】相机 Cameras

1 前言 主要介绍官方文档中相机模块的内容。 关于“9动态分辨率”&#xff0c;这部分很多API文档只是提了一下&#xff0c;具体细节还需要自己深入API才行。 2 摄像机介绍 Unity 场景在三维空间中表示游戏对象。由于观察者的屏幕是二维屏幕&#xff0c;Unity 需要捕捉视图并将…

SpringBoot(六)--- AOP、ThreadLocal

目录 前言 一、AOP基础 1.入门程序 2. AOP核心概念 3. 底层原理 二、AOP进阶 1.通知类型 抽取切入点 2. 切入点表达式 2.1 execution 2.2 annoation 2.3 连接点详解 三、ThreadLocal 前言 AOP&#xff08;面向切面编程&#xff09;&#xff0c;面向切面编程实际就…

【深度学习】 19. 生成模型:Diffusion Models

Diffusion Models Diffusion Models 简介 Diffusion 模型是一类通过逐步添加噪声并再逆向还原的方式进行图像生成的深度生成模型。其基本流程包括&#xff1a; 前向过程&#xff08;Forward Process&#xff09;&#xff1a;将真实图像逐步加噪&#xff0c;最终变为高斯噪声…

Y1——链式前向星

知识点 模版——链表的前插法 head表示头结点的下标 ver[i]表示结点i 的值 tot存储当前已经用到了哪个 add用于将x插到头结点 int head1; intt ver[N],Next[N]; int ttot-1; void add(int x){ver[tot]x;Next[tot]head;headtot; } 常见的链式前向星三种实现形式&#xff…

如何排查Redis单个Key命中率骤降?

问题现象 Redis整体命中率98%&#xff0c;但监控发现特定Key&#xff08;如user:1000:profile&#xff09;的命中率从99%骤降至40%&#xff0c;引发服务延迟上升。 排查步骤 1. 确认现象与定位Key // 通过Redis监控工具获取Key指标 public void monitorKey(String key) {Je…

自定义Shell命令行解释器

目录 1、目标 2、显示命令提示符 2.1 getenv 2.2 getcwd 2.3 putenv 3、获取用户输入的命令 4、解析命令 5、处理内建命令 6、处理外部命令 7、完整代码 7.1 myshell.cpp 7.2 Makefile 1、目标 实现一个Linux的myshell&#xff0c;有以下基本的功能。 显示命令提示…

Laplace 噪声

Laplace 噪声是一种特定概率分布&#xff08;拉普拉斯分布&#xff09;产生的随机扰动。它是差分隐私&#xff08;Differential Privacy, DP&#xff09;中最核心、最常用的噪声机制之一。它的核心作用是在不泄露个体信息的前提下&#xff0c;允许从包含敏感数据的数据库中提取…

基于空天地一体化网络的通信系统matlab性能分析

目录 1.引言 2.算法仿真效果演示 3.数据集格式或算法参数简介 4.MATLAB核心程序 5.算法涉及理论知识概要 5.1 QPSK调制原理 5.2 空天地一体化网络信道模型 5.3 空天地一体化网络信道特性 6.参考文献 7.完整算法代码文件获得 1.引言 空天地一体化网络是一种将卫星通信…

【Delphi】接收windows文件夹中文件拖拽

本文根据EmailX45的视频文件&#xff0c;进行了优化改进&#xff0c;原文参见&#xff1a;Delphi: Drag and Drop Files from Explorer into TPanel / TMemo - YouTube 在Windows中&#xff0c;如果将选择的文件拖动到Delphi程序的控件上&#xff0c;有很多实现方法&#xff0c…

基于热力学熵增原理的EM-GAN

简介 简介:提出基于热力学熵增原理的EM-GAN,通过生成器熵最大化约束增强输出多样性。引入熵敏感激活函数与特征空间熵计算模块,在MNIST/CelebA等数据集上实现FID分数提升23.6%,有效缓解模式崩溃问题。 论文题目:Entropy-Maximized Generative Adversarial Network (EM-G…

HashMap与ConcurrentHashMap详解:实现原理、源码分析与最佳实践

引言 在Java编程中&#xff0c;集合框架是最常用的工具之一&#xff0c;而HashMap和ConcurrentHashMap则是其中使用频率最高的两个Map实现。它们都用于存储键值对数据&#xff0c;但在实现机制、性能特点和适用场景上有着显著差异。 HashMap作为单线程环境下的首选Map实现&am…