RapidOCRSharpOnnx 1.1.1
dotnet add package RapidOCRSharpOnnx --version 1.1.1
NuGet\Install-Package RapidOCRSharpOnnx -Version 1.1.1
<PackageReference Include="RapidOCRSharpOnnx" Version="1.1.1" />
<PackageVersion Include="RapidOCRSharpOnnx" Version="1.1.1" />
<PackageReference Include="RapidOCRSharpOnnx" />
paket add RapidOCRSharpOnnx --version 1.1.1
#r "nuget: RapidOCRSharpOnnx, 1.1.1"
#:package RapidOCRSharpOnnx@1.1.1
#addin nuget:?package=RapidOCRSharpOnnx&version=1.1.1
#tool nuget:?package=RapidOCRSharpOnnx&version=1.1.1
RapidOCRSharpOnnx
🚀a high performance, cross-platform PaddleOCR C# inference library base on OpenCV and ONNX Runtime. Referring to the RapidOCR project, it is a python version of the C# implementation with a redesigned and optimized architecture.
Features
- Supported Languages PP-OCRv5 provides multilingual text recognition capabilities covering 106 languages, please refer to the documentation: PP-OCRv5 Multilingual Text Recognition.
- Execution Provider CPU, CUDA / TensorRT, OpenVINO, CoreML, DirectML
- Batch processing images Preprocess and Inference are executed asynchronously with Producer/Consumer pattern
- High Performance Inference Memory reuse, GPU Inference with I/O Binding
- Image Processing OpenCvSharp4
- Draw Result Image SkiaSharp
- Inference Engine ONNX Runtime is a cross-platform inference and training machine-learning accelerator.
- PP-OCR Versions Includes support for: PP-OCRv5, PP-OCRv4
Example Images:
<div align="center">
| OCR Demo |
|---|
| <img src="https://github.com/meloht/RapidOCRSharpOnnx/blob/master/ExampleImages/res_book.png?raw=true" height="411" > |
| <img src="https://github.com/meloht/RapidOCRSharpOnnx/blob/master/ExampleImages/res_csharp.png?raw=true" height="750"> |
| <img src="https://github.com/meloht/RapidOCRSharpOnnx/blob/master/ExampleImages/res_yongledadian.png?raw=true" height="787"> |
</div>
Usage
1. Export model to ONNX format:
For convert the pre-trained PP-OCR model to ONNX format, please refer to the the documentation: Obtaining ONNX Models, or download from rapid-ocr Model List.
2. Load the ONNX model with C#:
Install Nuget packages RapidOCRSharpOnnx, OnnxRuntime, OpenCvSharp4.runtime
CPU Inference
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 Inference
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 Inference
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 Inference
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 Inference
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));
Use the following C# code to load the model and run basic prediction
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()}");
Batch processing images
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("------------------------------------------------------------");
}
Batch processing images foreach api
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);
}
Custom font to draw result image
private static void TestImage()
{
string imgPath = @"E:\Hp\ai-image\ADFtools\headerText.png";
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";
string font = @"C:\Windows\Fonts\msyh.ttc";
using RapidOCRSharp ocr = new RapidOCRSharp(new ExecutionProviderDirectML(new OcrConfig(detectPath, recogPath, font, OCRVersion.PPOCRV5, clsPath), _deviceId));
string savePath = $"res_{Path.GetFileName(imgPath)}";
var result = ocr.RecognizeText(imgPath, savePath);
Console.WriteLine($"result: {result.ToString()}");
}
Performance Test
| 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 |
Performance Test PC
| Hardware | Summary |
|---|---|
| Windows | Windows 11 Pro OS Version 25H2 |
| CPU | Intel Core Ultra 9 285k 3.7GHz |
| RAM | DDR5 128GB speed 4400MT/s |
| Storage | SSD 2TB |
Performance Test Data
Images: 60 images (image size: 1180x92)
PP-OCR Model: ch_PP-OCRv5_det_mobile, ch_PP-OCRv5_rec_mobile, ch_PP-LCNet_x0_25_textline_ori_cls_mobile
PaddleSharp test result
CPU inference time: 48.1769278s
<img width="1331" height="847" alt="image" src="https://github.com/user-attachments/assets/87515077-e9c2-48b2-9e43-6b145e1c7a7a" />
RapidOCRSharpOnnx test result
CPU inference time: 9.2447871s
<img width="1477" height="874" alt="image" src="https://github.com/user-attachments/assets/eee41ffe-f0a7-48af-b934-74e290ee6196" />
PaddleOCR test result
CPU inference time: 62.668516899924725s
<img width="1009" height="911" alt="image" src="https://github.com/user-attachments/assets/b367749f-3c37-4326-bb30-ea4fcb52315d" />
RapidOCR test result
CPU inference time: 17.963430000003427 s
<img width="997" height="1093" alt="image" src="https://github.com/user-attachments/assets/79ab7dd5-0311-42ea-aa03-ed5695ff5fae" />
Performance Test Result
| 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 |
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Clipper2 (>= 2.0.0)
- Microsoft.ML.OnnxRuntime.Managed (>= 1.26.0)
- OpenCvSharp4 (>= 4.13.0.20260528)
- SkiaSharp (>= 3.119.4)
-
net8.0
- Clipper2 (>= 2.0.0)
- Microsoft.ML.OnnxRuntime.Managed (>= 1.26.0)
- OpenCvSharp4 (>= 4.13.0.20260528)
- SkiaSharp (>= 3.119.4)
-
net9.0
- Clipper2 (>= 2.0.0)
- Microsoft.ML.OnnxRuntime.Managed (>= 1.26.0)
- OpenCvSharp4 (>= 4.13.0.20260528)
- SkiaSharp (>= 3.119.4)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
RapidOCRSharpOnnx 1.1.1 font load bug fix