news 2026/7/6 8:17:21

RapidOCR 适配 PP-OCRv6 Rec 模型支持 Paddle, PyTorch 和 MNN 记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RapidOCR 适配 PP-OCRv6 Rec 模型支持 Paddle, PyTorch 和 MNN 记录

首发于:https://rapidai.github.io/RapidOCRDocs/latest/blog/2026/06/30/rapidocr-%E9%80%82%E9%85%8D-pp-ocrv6-rec-%E6%A8%A1%E5%9E%8B%E6%94%AF%E6%8C%81-paddle-pytorch-%E5%92%8C-mnn-%E8%AE%B0%E5%BD%95/

引言

rapidocr==3.9.0仅支持 ONNXRuntime 和 OpenVINO 两个推理引擎,PaddlePaddle, PyTorch, MNN 和 TensorRT 打算在下个版本(v3.9.1)都支持了。

本篇文章就是用来记录 RapidOCR PP-OCRv6 Rec 模型支持 PaddlePaddle, PyTorch, MNN 的过程,一是备忘,二是希望帮助需要的小伙伴们。

以下代码运行环境

  • OS: macOS Tahoe 26.5.1
  • Python: 3.10.14
  • PaddlePaddle: 3.1.0
  • paddle2onnx: 2.1.0
  • paddlex: 3.7.1
  • rapidocr: 3.9.0
  • MNN: 3.2.5
  • OpenVINO: 2026.2.1
  • torch: 2.7.0

支持 PaddlePaddle

得益于原始模型就是 PaddlePaddle 格式,因此支持 PaddlePaddle 推理引擎较为容易,加上 @jaminmei 提的 PR #696。我这里做的工作少了许多,由衷地感谢。

importtimeimportcv2importnumpyasnpfromdatasetsimportload_datasetfromtqdmimporttqdmfromrapidocrimportEngineType,OCRVersion,RapidOCR# 依次跑三个规格的模型model_path="modelscope/paddle/PP-OCRv6/rec/PP-OCRv6_rec_medium"dict_path="modelscope/paddle/PP-OCRv6/rec/PP-OCRv6_rec_medium/ppocrv6_dict.txt"engine=RapidOCR(params={"Rec.model_dir":model_path,"Rec.rec_keys_path":dict_path,"Rec.engine_type":EngineType.PADDLE,"Rec.ocr_version":OCRVersion.PPOCRV5,})dataset=load_dataset("SWHL/text_rec_test_dataset")test_data=dataset["test"]content=[]fori,one_datainenumerate(tqdm(test_data)):img=np.array(one_data.get("image"))img=cv2.cvtColor(img,cv2.COLOR_RGB2BGR)t0=time.perf_counter()result=engine(img,use_rec=True,use_cls=False,use_det=False)elapse=time.perf_counter()-t0 rec_text=result.txts[0]iflen(rec_text)<=0:rec_text=""elapse=0gt=one_data.get("label",None)content.append(f"{rec_text}\t{gt}\t{elapse}")withopen("pred.txt","w",encoding="utf-8")asf:forvincontent:f.write(f"{v}\n")fromtext_rec_metricimportTextRecMetric metric=TextRecMetric()pred_path="pred.txt"metric=metric(pred_path)print(metric)

最终结果汇总到文章末尾了。

支持 PyTorch

PP-OCRv6 中,PaddleOCR 官方支持 safetensors 格式,支持用 transformers 库推理。经过我的调研,发现 safetensors 格式仅仅是权重,里面并没有具体网络结构。

经过社区小伙伴的提醒,我才发现 PP-OCRv6 已经集成到了 transformers 库了。我本以为这个事情就变得简单了。后来发现 transformers 中集成了很多模型的推理,想要单独抠出 PP-OCRv6 的相关最小可执行代码,太难了。

我这里给出 transformers 库中如何使用 PP-OCRv6 rec 系列模型,代码来自 transformers 模型卡片。

fromioimportBytesIOimporthttpxfromPILimportImagefromtransformersimportAutoImageProcessor,AutoModelForTextRecognitionfromtransformers.image_utilsimportload_image model_path="PaddlePaddle/PP-OCRv6_small_rec_safetensors"model=AutoModelForTextRecognition.from_pretrained(model_path,device_map="auto")image_processor=AutoImageProcessor.from_pretrained(model_path)image_url="https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_ocr_rec_001.png"image=load_image(image_url)inputs=image_processor(images=image,return_tensors="pt").to(model.device)outputs=model(**inputs)results=image_processor.post_process_text_recognition(outputs)forresultinresults:print(result)

后来发现 PaddleOCR2Pytorch 中已经支持 PP-OCRv6 文本检测和识别模型了。哈哈哈。RapidOCR 之前支持的 PyTorch 推理,其模型都是来自这个仓库。有了这个,剩下工作就是集成和测试一下指标就可以了。感谢大佬的工作。

其中 Rec Tiny 模型,PaddleOCR2Pytorch 中实现的网络结构与 PaddleOCR 官方不同,因此我这里在rapidocr==3.9.1中,PP-OCRV6 Rec Tiny 模型指标效果很差。到现在我已经对齐了,还向 PaddleOCR2Pytorch 提了一个 PR #127。

评测代码:

importcv2importnumpyasnpfromdatasetsimportload_datasetfromtqdmimporttqdmfromrapidocrimportEngineType,ModelType,OCRVersion,RapidOCR model_path="models/PP-OCRv6_det_tiny.pth"engine=RapidOCR(params={"Det.ocr_version":OCRVersion.PPOCRV6,"Det.model_path":model_path,"Det.engine_type":EngineType.TORCH,})dataset=load_dataset("SWHL/text_det_test_dataset")test_data=dataset["test"]content=[]fori,one_datainenumerate(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.boxes dt_boxes=[]ifdt_boxesisNoneelsedt_boxes.tolist()elapse=ocr_results.elapse gt_boxes=[v["points"]forvinone_data["shapes"]]content.append(f"{dt_boxes}\t{gt_boxes}\t{elapse}")withopen("pred.txt","w",encoding="utf-8")asf:forvincontent:f.write(f"{v}\n")fromtext_det_metricimportTextDetMetric metric=TextDetMetric()pred_path="pred.txt"metric=metric(pred_path)print(metric)

支持 MNN

# 安装pipinstallMNN==3.2.5# 转换MNNConvert-fONNX--modelFilemodelscope/onnx/PP-OCRv6/rec/PP-OCRv6_rec_medium.onnx--MNNModelmodelscope/mnn/PP-OCRv6/rec/PP-OCRv6_rec_medium.mnn--bizCodeMNN MNNConvert-fONNX--modelFilemodelscope/onnx/PP-OCRv6/rec/PP-OCRv6_rec_small.onnx--MNNModelmodelscope/mnn/PP-OCRv6/rec/PP-OCRv6_rec_small.mnn--bizCodeMNN MNNConvert-fONNX--modelFilemodelscope/onnx/PP-OCRv6/rec/PP-OCRv6_rec_tiny.onnx--MNNModelmodelscope/mnn/PP-OCRv6/rec/PP-OCRv6_rec_tiny.mnn--bizCodeMNN

测试转换后的模型指标

importtimeimportcv2importnumpyasnpfromdatasetsimportload_datasetfromtqdmimporttqdmfromrapidocrimportEngineType,ModelType,OCRVersion,RapidOCR model_path="modelscope/mnn/PP-OCRv6/rec/PP-OCRv6_rec_tiny.mnn"dict_path="modelscope/paddle/PP-OCRv6/rec/PP-OCRv6_rec_tiny/ppocrv6_tiny_dict.txt"# model_path = "modelscope/torch/PP-OCRv6/rec/PP-OCRv6_rec_small.pth"# dict_path = "modelscope/paddle/PP-OCRv6/rec/PP-OCRv6_rec_small/ppocrv6_dict.txt"# model_path = "modelscope/torch/PP-OCRv6/rec/PP-OCRv6_rec_medium.pth"# dict_path = "modelscope/paddle/PP-OCRv6/rec/PP-OCRv6_rec_small/ppocrv6_dict.txt"engine=RapidOCR(params={"Rec.model_path":model_path,"Rec.rec_keys_path":dict_path,"Rec.ocr_version":OCRVersion.PPOCRV6,"Rec.engine_type":EngineType.MNN,"Rec.model_type":ModelType.TINY,})dataset=load_dataset("SWHL/text_rec_test_dataset")test_data=dataset["test"]content=[]fori,one_datainenumerate(tqdm(test_data)):img=np.array(one_data.get("image"))img=cv2.cvtColor(img,cv2.COLOR_RGB2BGR)t0=time.perf_counter()result=engine(img,use_rec=True,use_cls=False,use_det=False)elapse=time.perf_counter()-t0 rec_text=result.txts[0]iflen(rec_text)<=0:rec_text=""elapse=0gt=one_data.get("label",None)content.append(f"{rec_text}\t{gt}\t{elapse}")withopen("pred.txt","w",encoding="utf-8")asf:forvincontent:f.write(f"{v}\n")fromtext_rec_metricimportTextRecMetric metric=TextRecMetric()pred_path="pred.txt"metric=metric(pred_path)print(metric)

最终结果汇总到文章末尾了。

不同推理引擎指标汇总

在这里将 ONNXRuntime, OpenVINO, PaddlePaddle, MNN 和 PyTorch 在 PP-OCRv6 Det 模型上指标和速度都汇总起来了,便于大家选用最合适的。

TensorRT 的指标等有时间再补哈!

各个推理引擎对应不同的模型,最终指标效果如下:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 8:15:33

蓝队(Blue Team)防护技能详解

前言面向对象&#xff1a;网络安全专业学生 / 红蓝对抗备赛 内容涵盖&#xff1a;流量分析、日志分析、应急响应、威胁情报、主机排查、SIEM运营、ATT&CK应用、系统加固 每个模块均附实操示例&#xff0c;可结合靶场直接练习目录蓝队工作总览流量分析日志分析主机排查与取证…

作者头像 李华
网站建设 2026/7/6 8:14:05

llmfit:一条命令,找出你的硬件能跑哪个大模型

文章目录llmfit&#xff1a;一条命令&#xff0c;找出你的硬件能跑哪个大模型1、这玩意儿是干嘛的2、支持什么硬件3、怎么用4、评分逻辑5、社区排行榜6、硬件模拟7、适合谁llmfit&#xff1a;一条命令&#xff0c;找出你的硬件能跑哪个大模型 llmfit 在 GitHub 上已经拿到 28,…

作者头像 李华
网站建设 2026/7/6 8:13:12

PYTORCH模型可视化软件V1.0操作手册

PYTORCH模型可视化软件V1.0操作手册 A这个软件是什么)B如何分析模型结构)C如何查看分析结果) ^^^ A这个软件是什么 目录 A这个软件是什么 A这个软件是什么 A这个软件是什么 ^^^ ^ A这个软件是什么 PYTORCH模型可视化软件是什么&#xff1f; PYTORCH模型可视化软件 分析P…

作者头像 李华
网站建设 2026/7/6 8:11:31

rapidocr v3.9.1 发布

&#x1f680; 新增功能 Python&#xff1a;新增 PP-OCRv6 的 PaddlePaddle 后端支持&#xff08;#696&#xff09;&#xff0c;由开发者 JinmingMei 提交&#xff0c;提交哈希&#xff1a;29b812f支持将 PP-OCRv6 PyTorch 作为推理引擎&#xff0c;由开发者 SWHL 提交&#x…

作者头像 李华
网站建设 2026/7/6 8:08:41

Java高并发底层原理(三)—— synchronized 为什么能够保证线程安全

第3章 synchronized 为什么能够保证线程安全 上一章确认了一件事:count 由读、算、写三步组成&#xff0c;两个线程可能读到同一个旧值、算出同一个新值&#xff0c;互相覆盖。要解决这个问题&#xff0c;不是让加法变快&#xff0c;也不是减少线程&#xff0c;而是给"读—…

作者头像 李华