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


    RapidOCRSharpOnnx 是一个基于OpenCV与ONNX Runtime 实现的PaddleOCR 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-OCRv5PP-OCRv4
    • 推理引擎:ONNX Runtime 是一个跨平台的机器学习模型加速器

    OCR 示例

    res_book

    res_csharp

    res_yongledadian

     

     

     

    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
    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

    Snipaste_2026-05-12_22-11-36

     

    PaddleOCR 测试结果

    CPU 推理时间 : 62.6685s

    Snipaste_2026-05-12_22-12-18

     

    RapidOCR 测试结果

    CPU 推理时间 : 17.9634s

    Snipaste_2026-05-12_22-12-44

     

    RapidOCRSharpOnnx 测试结果

    CPU 推理时间 : 9.2447s

    Snipaste_2026-05-12_22-13-29

     

    性能测试结果

    OCR libraryVersionlanguageInference EngineElapsed 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
  • 相关阅读:
    【无标题】
    动态内存管理(malloc calloc realloc free)--- C语言
    变电站机器人的控制部分
    Mysql 关于count()函数的记录
    Java中泛型——类型擦除
    CC2530中文数据手册
    docker服务部署、迁移与备份、dockerfile、私有仓库
    《深入浅出OCR》第二章:OCR技术发展与分类
    麻雀优化算法SSA及其改进策略
    算法复杂度这一篇就够了
  • 原文地址:https://www.cnblogs.com/luoht/p/20026520