当前位置: 首页 > news >正文

高性能百度OCR ONNX Runtime C#实现

OCR 示例

RapidOCRSharpOnnx使用

1 导出模型为onnx格式

如何转换PP-OCR模型为onnx格式,可以参考PP-OCR官网Obtaining ONNX Models, 或者直接从RapidOCR的魔塔社区下载Model List.

2 安装RapidOCRSharpOnnx组件并加载模型

Install Nuget packages RapidOCRSharpOnnx, OnnxRuntime, OpenCvSharp4.runtime

CPU 推理

dotnet add package RapidOCRSharpOnnx dotnet add package OpenCvSharp4.runtime.win dotnet add package Microsoft.ML.OnnxRuntime
using RapidOCRSharp ocr = new RapidOCRSharp(new ExecutionProviderCPU(new OcrConfig(detectPath, recPath, LangRec.CH, OCRVersion.PPOCRV5, clsMobilePath)));

CoreML 推理

dotnet add package RapidOCRSharpOnnx dotnet add package OpenCvSharp4.runtime.osx.10.15-x64 dotnet add package Microsoft.ML.OnnxRuntime
using RapidOCRSharp ocr = new RapidOCRSharp(new ExecutionProviderCoreML(new OcrConfig(detectPath, recPath, LangRec.CH, OCRVersion.PPOCRV5, clsMobilePath)));

CUDA/TensorRT 推理

dotnet add package RapidOCRSharpOnnx dotnet add package OpenCvSharp4.runtime.win dotnet add package Microsoft.ML.OnnxRuntime.Gpu.Windows
using RapidOCRSharp ocr = new RapidOCRSharp(new ExecutionProviderCUDA(new OcrConfig(detectPath, recogPath, LangRec.CH, OCRVersion.PPOCRV5, clsPath), deviceId)); using RapidOCRSharp ocr = new RapidOCRSharp(new ExecutionProviderTensorRT(new OcrConfig(detectPath, recogPath, LangRec.CH, OCRVersion.PPOCRV5, clsPath), deviceId));

DirectML 推理

dotnet add package RapidOCRSharpOnnx dotnet add package OpenCvSharp4.runtime.win dotnet add package Microsoft.ML.OnnxRuntime.DirectML
using RapidOCRSharp ocr = new RapidOCRSharp(new ExecutionProviderDirectML(new OcrConfig(detectPath, recogPath, LangRec.EN, OCRVersion.PPOCRV5, clsPath), deviceId));

OpenVINO 推理

dotnet add package RapidOCRSharpOnnx dotnet add package OpenCvSharp4.runtime.win dotnet add package Intel.ML.OnnxRuntime.OpenVino
using RapidOCRSharp ocr = new RapidOCRSharp(new ExecutionProviderOpenVINO(new OcrConfig(detectPath, recogPath, LangRec.EN, OCRVersion.PPOCRV5, clsPath), IntelDeviceType.NPU));

基本的API使用

using RapidOCRSharp ocr = new RapidOCRSharp(new ExecutionProviderDirectML(new OcrConfig(detectPath, recogPath, LangRec.EN, OCRVersion.PPOCRV5, clsPath), _deviceId)); string savePath = $"res_{Path.GetFileName(imgPath)}"; var result = ocr.RecognizeText(imgPath, savePath); Console.WriteLine($"result: {result.ToString()}");

批量识别图片

using RapidOCRSharp ocr = new RapidOCRSharp(new ExecutionProviderDirectML(new OcrConfig(detectPath, recogPath, LangRec.CH, OCRVersion.PPOCRV5, clsPath), _deviceId)); var list = Directory.GetFiles(@"C:\code\model\OCRTestImages"); Stopwatch sw = new Stopwatch(); sw.Start(); var resPath = ocr.BatchParallelAsync(list.ToList(), saveDir, receiveAction: ReceiveResult); sw.Stop(); Console.WriteLine($"BatchAsync Time: {sw.ElapsedMilliseconds} ms"); private static void ReceiveResult(OcrBatchResult batchResult) { Console.WriteLine(batchResult.ToString()); Console.WriteLine("------------------------------------------------------------"); }

批量识别使用Foreach API

private static async Task TestBatchForeachAsync() { string detectPath = @"D:\code\RapidOCRSharpOnnx\RapidOCRSharpOnnx.TestCommon\Models\ch_PP-OCRv5_det_mobile.onnx"; string recogPath = @"D:\code\RapidOCRSharpOnnx\RapidOCRSharpOnnx.TestCommon\Models\ch_PP-OCRv5_rec_mobile.onnx"; string clsPath = @"D:\code\RapidOCRSharpOnnx\RapidOCRSharpOnnx.TestCommon\Models\ch_PP-LCNet_x0_25_textline_ori_cls_mobile.onnx"; using RapidOCRSharp ocr = new RapidOCRSharp(new ExecutionProviderDirectML(new OcrConfig(detectPath, recogPath, LangRec.CH, OCRVersion.PPOCRV5, clsPath), _deviceId)); var list = Directory.GetFiles(@"D:\code\model\OCRTestImages"); var res = ocr.BatchForeachAsync(list.ToList(), @"D:\code\model\OCRTestImagesResults"); await foreach (var item in res) { Console.WriteLine(item.TextBlocks); } }

性能测试

OCR组件库性能对比测试 CPU推理测试

OCR libraryVersionlanguageInference Engine
PaddleSharp3.0.1Paddle Inference C API .NET bindingSdcb.PaddleInference
PaddleOCR3.5.0pythonpaddlepaddle
RapidOCR3.8.1pythonopenvino
RapidOCRSharpOnnx1.0.0C#Intel.ML.OnnxRuntime.OpenVino

测试电脑

Windows 11 Pro OS Version 25H2

CPU: Intel Core Ultra 9 285k 3.7GHz

内存:DDR5 128GB speed 4400MT/s

硬盘:SSD 2TB

测试数据

图片: 60 张图片 (图片大小: 1180x92)

PP-OCR 模型: ch_PP-OCRv5_det_mobile, ch_PP-OCRv5_rec_mobile, ch_PP-LCNet_x0_25_textline_ori_cls_mobile

PaddleSharp 测试结果

CPU 推理时间 : 48.1769278s

PaddleOCR 测试结果

CPU 推理时间 : 62.6685s

RapidOCR 测试结果

CPU 推理时间 : 17.9634s

RapidOCRSharpOnnx 测试结果

CPU 推理时间 : 9.2447s

性能测试结果

OCR libraryVersionlanguageInference EngineElapsed Time
PaddleSharp3.0.1Paddle Inference C API .NET bindingSdcb.PaddleInference.runtime.win64.mkl version 3.1.0.54 CPU48.1769s
PaddleOCR3.5.0pythonpaddlepaddle version 3.2.0 CPU62.6685s
RapidOCR3.8.1pythonopenvino version 2026.1.0 21367 CPU
http://www.jsqmd.com/news/1130378/

相关文章:

  • REPENTOGON终极探索:以撒脚本扩展器的深度配置与功能揭秘
  • NVR场景语音对讲 - cann/docs
  • Motion Canvas:用代码创造专业级矢量动画的现代解决方案
  • Shopware 6:5步轻松搭建你的现代化开源电商平台
  • WavTap进阶技巧:提升Mac音频录制质量的5个方法
  • ProperTree:跨平台plist编辑器,告别配置文件格式兼容烦恼
  • AgentKit 与 MCP 集成指南:打造企业级智能体应用
  • File Viewer扩展开发指南:如何自定义新的文件格式渲染器
  • 如何在3分钟内快速搭建AI音乐创作平台:Suno-API完全指南
  • OpCore-Simplify:3步自动化OpenCore EFI配置,黑苹果安装效率提升95%
  • SMUDebugTool:锐龙处理器深度调试与性能优化的终极指南 [特殊字符]
  • 开源革命:OpenCore Legacy Patcher让老Mac重获新生的终极指南
  • Biopython终极指南:生物信息学数据分析的完整解决方案
  • 如何快速上手CorridorKey:AI绿幕抠像的5个专业技巧与常见问题解决方案
  • 简单快速提升视频流畅度:Flowframes AI视频插帧完整指南
  • 拯救者笔记本终极性能优化指南:3步释放C盘空间并提升系统效能
  • 终极指南:如何通过二进制补丁实现Windows微信/QQ/TIM防撤回功能
  • Stout与CloudFront集成:如何配置SSL证书和自定义域名
  • Apollo自动驾驶技术栈深度解析:从ROS到CyberRT的架构演进与实时性能优化
  • PandaWiki:企业级智能知识库系统的架构与实施指南
  • 如何免费将OBS直播转为专业RTSP流:面向初学者的完整实战指南
  • Kokoro TTS自动化脚本编写:批量处理大量文件的完整方案
  • 基于混沌系统与DNA编码的图像加密算法原理与Matlab实现
  • 揭秘sprocketnes架构:Rust如何实现高性能NES游戏机模拟的10个关键技术
  • 解锁2.5G网络性能:Realtek RTL8125 DKMS驱动终极指南
  • 终极游戏模组管理指南:用XXMI启动器打造个性化游戏体验
  • Shopware 6完整部署指南:5步搭建专业电商平台
  • Real-Time C++中的裸机编程艺术:无需操作系统的嵌入式开发终极指南
  • CTF命令执行绕过实战:从空格过滤到无回显外带的7种核心姿势
  • Serverless Node.js Starter完全指南:快速构建现代无服务器应用