首页 > 基础资料 博客日记
高性能百度OCR ONNX Runtime C#实现
2026-05-12 22:30:01基础资料围观6次
这篇文章介绍了高性能百度OCR ONNX Runtime C#实现,分享给大家做个参考,收藏极客资料网收获更多编程知识
RapidOCRSharpOnnx
RapidOCRSharpOnnx 是一个基于OpenCV与ONNX Runtime 实现的C#推理库,参考了RapidOCR 的实现,重新使用C#实现,并做了大量性能优化与架构重新设计,方便多种ONNX Runtime 执行提供程序部署
特性
- 不依赖于具体的模型,直接导入需要的PP-OCR模型,识别指定的语言,PP-OCRv5模型支持识别106种语言,只需要将PP-OCRv5模型导出为onnx格式,就可以离线运行
- 支持的ONNX Runtime 执行提供程序:Execution Provider CPU, CUDA / TensorRT, OpenVINO, CoreML, DirectML
- 支持批量识别,并提供异步执行性能优化,大幅提高批量执行性能
- 使用OpenCVSharp4 进行图像处理操作
- 绘制识别结果图片使用SkiaSharp
- PP-OCR 版本支持:PP-OCRv5, PP-OCRv4
- 推理引擎:ONNX Runtime 是一个跨平台的机器学习模型加速器
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 resPaths = ocr.BatchForeachAsync(list.ToList(), @"D:\code\model\OCRTestImagesResults"); await foreach (var item in resPaths) { Console.WriteLine(item.TextBlocks); } }
性能测试
OCR组件库性能对比测试 CPU推理测试
| OCR library | Version | language | Inference Engine |
|---|---|---|---|
| PaddleSharp | 3.0.1 | Paddle Inference C API .NET binding | Sdcb.PaddleInference |
| PaddleOCR | 3.5.0 | python | paddlepaddle |
| RapidOCR | 3.8.1 | python | openvino |
| RapidOCRSharpOnnx | 1.0.0 | C# | 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 library | Version | language | Inference Engine | Elapsed Time |
|---|---|---|---|---|
| PaddleSharp | 3.0.1 | Paddle Inference C API .NET binding | Sdcb.PaddleInference.runtime.win64.mkl version 3.1.0.54 CPU | 48.1769s |
| PaddleOCR | 3.5.0 | python | paddlepaddle version 3.2.0 CPU | 62.6685s |
| RapidOCR | 3.8.1 | python | openvino version 2026.1.0 21367 CPU | 17.9634s |
| RapidOCRSharpOnnx | 1.0.0 | C# | Intel.ML.OnnxRuntime.OpenVino CPU version 1.24.1 | 9.2447s |
文章来源:https://www.cnblogs.com/luoht/p/20026520
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:

