C#高性能OCR识别库:SimdPaddleOCR本地部署教程
SEO关键词:C# OCR、SimdPaddleOCR、PP-OCRv6、C#文字识别、.NET OCR、PaddleOCR、OCR本地部署、NuGet OCR、.NET 10 OCR
文章摘要:
本文介绍一个纯 C# 实现的 PP-OCRv6 推理库——Sdcb.SimdPaddleOCR。它不依赖 Paddle Inference、ONNX Runtime 或 OpenCV 原生库,并针对 SIMD、GEMM 等算子进行了优化,同时支持 Windows、Linux、macOS 等多平台环境。本文记录安装方式、图片读取、OCR识别、本地模型加载以及常见性能问题。
大家好 这里是「代码简单说」
最近看到一个比较适合 C#/.NET 项目的 OCR 方案:Sdcb.SimdPaddleOCR。
它最大的特点是直接使用纯 C# 完成 PP-OCRv6 推理,并且自带托管 ONNX 解释器,不需要额外依赖 Paddle Inference、ONNX Runtime 或 OpenCV 原生库。
一、SimdPaddleOCR是什么
Sdcb.SimdPaddleOCR是一个面向 .NET 的 PP-OCRv6 推理库,项目重点放在高性能和低内存占用上。
它采用多平台手写 Kernel、GEMM 等算子,并根据当前运行环境自动选择合适的 SIMD 指令集。
简单来说,如果你正在开发:
C#桌面软件 ASP.NET Core项目 .NET OCR接口 WPF/WinForms工具 跨平台OCR应用 本地文字识别工具都可以考虑直接使用这个库。
另外,它并不负责图片解码,核心 API 直接接收像素内存,因此不会强制引入 ImageSharp、SkiaSharp 或 OpenCvSharp。默认支持 BGR24,也可以直接传入 RGB24、BGRA32、RGBA32。
二、安装NuGet包
最简单的方式是创建一个 .NET 项目,然后安装核心包、模型包以及图片处理库。
这里以 PP-OCRv6 Chinese Tiny 模型为例:
dotnet add package Sdcb.SimdPaddleOCR dotnet add package Sdcb.SimdPaddleOCR.Models.ChineseV6Tiny dotnet add package SixLabors.ImageSharp--version 3.1.11其中:
Sdcb.SimdPaddleOCR:OCR 推理核心Sdcb.SimdPaddleOCR.Models.ChineseV6Tiny:PP-OCRv6 Chinese Tiny 模型SixLabors.ImageSharp:用于图片读取
模型本身通过程序集嵌入资源加载,不需要先解压到临时目录。
三、C#调用OCR进行文字识别
官方推荐的 ImageSharp 3 示例大致如下:
usingSystem.Runtime.InteropServices;usingSdcb.SimdPaddleOCR;usingSdcb.SimdPaddleOCR.Models.ChineseV6Tiny;usingSixLabors.ImageSharp;usingSixLabors.ImageSharp.PixelFormats;usingPaddleOcrAllocr=awaitPaddleOcrAll.LoadAsync(ChineseV6TinyModels.Default);usingImage<Rgba32>image=awaitImage.LoadAsync<Rgba32>("sample.jpg");Rgba32[]?packedCopy=null;if(!image.DangerousTryGetSinglePixelMemory(outMemory<Rgba32>memory)){packedCopy=newRgba32[checked(image.Width*image.Height)];image.CopyPixelDataTo(packedCopy);memory=packedCopy;}PaddleOcrResultresult=ocr.Run(MemoryMarshal.AsBytes(memory.Span),image.Width,image.Height,format:ImagePixelFormat.Rgba32);Console.WriteLine(result.Text);这里比较关键的一点是,Run()并不要求你先把图片转换成另外一张 BGR 图片,而是直接处理已有的交错像素内存。
四、ImageSharp连续内存问题
使用 ImageSharp 时,有一个问题比较容易踩坑。
默认情况下,大图片的像素可能会被分配器拆成多个 4MB 块,因此:
DangerousTryGetSinglePixelMemory()不一定能够拿到完整连续的像素缓冲区。
官方建议创建独立的Configuration:
staticDecoderOptionsCreateDecoderOptions(){Configurationconfiguration=Configuration.Default.Clone();configuration.PreferContiguousImageBuffers=true;returnnewDecoderOptions{Configuration=configuration};}如果仍然不是连续内存,再使用:
image.CopyPixelDataTo(packedCopy);需要注意,不建议直接修改Configuration.Default,否则可能影响 PNG/JPEG 解码器。
五、也可以配合SkiaSharp
如果项目本身使用 SkiaSharp,同样可以直接调用 OCR。
例如:
usingSkiaSharp;SKBitmapbitmap=SKBitmap.Decode("sample.jpg")??thrownewInvalidDataException("无法读取图片");if(bitmap.ColorType!=SKColorType.Bgra8888){bitmap=bitmap.Copy(SKColorType.Bgra8888)??thrownewInvalidDataException("无法转换到 BGRA");}intstride=bitmap.RowBytes;unsafe{PaddleOcrResultresult=ocr.Run(newReadOnlySpan<byte>((byte*)bitmap.GetPixels(),stride*bitmap.Height),bitmap.Width,bitmap.Height,stride,ImagePixelFormat.Bgra32);}项目还提供了 OpenCvSharp5、System.Drawing 等调用方式,可以根据现有项目技术栈选择图片处理方案。
六、支持哪些模型
除了 Tiny,项目还提供了 Small 和 Medium 等模型包:
| NuGet包 | 说明 |
|---|---|
Sdcb.SimdPaddleOCR | 纯托管 OCR 推理核心 |
Sdcb.SimdPaddleOCR.Models.ChineseV6Tiny | PP-OCRv6 Tiny |
Sdcb.SimdPaddleOCR.Models.ChineseV6Small | PP-OCRv6 Small |
Sdcb.SimdPaddleOCR.Models.ChineseV6Medium | PP-OCRv6 Medium |
Sdcb.SimdPaddleOCR.Models.TextLineOrientation | 文本行方向分类模型 |
模型组合包括 DET、REC、字典以及可选的 CLS。模型也可以通过 Stream 方式加载。
七、使用自己的本地OCR模型
除了 NuGet 自带模型,也可以直接指定本地 ONNX 模型:
usingPaddleOcrAllocr=awaitPaddleOcrAll.LoadAsync(detectionPath:"models/det.onnx",classificationPath:"models/cls.onnx",recognitionPath:"models/rec.onnx",dictionaryPath:"models/ppocr_keys.txt");这样就可以把 OCR 模型放在项目自己的models目录中,更适合需要自定义模型或者离线运行的项目。
八、支持.NET哪些环境
当前核心包目标框架包括:
net10.0 netstandard2.0因此除了 .NET 10,也可以兼容 .NET Framework 4.8 等支持netstandard2.0的环境。
官方支持的 CI 架构包括:
Windows x64 / x86 / ARM64 Linux x64 / ARM64 macOS x64 / ARM64.NET 10 运行时还可以根据 CPU 自动探测 AVX、AVX2、AVX-512、VNNI 等指令集。没有对应指令集时,则会回退到 Vector 或标量实现。
九、OCR性能怎么样
这个项目比较值得关注的地方就是性能。
官方在 1.4.2 版本中进一步优化了图级 NHWC、SIMD 内核以及内存使用。
以 Ryzen 7 5800X、4 worker、100 张图片测试的数据来看:
Tiny 86.0 ms → 63.1 ms Small 222 ms → 200 ms Medium 628 ms → 585 ms同时 Tiny 模型的工作集峰值也明显下降,例如 win-x64 环境从约 817 MB 降到了约 515 MB。
所以对于需要大量图片 OCR 的本地 C# 程序来说,这种纯 .NET 推理方案还是比较有意思的。
十、调试模式为什么OCR特别慢
如果你发现:
Release运行正常 Debug运行特别慢不要急着怀疑 OCR 模型。
官方说明,调试器可能在模块加载时取消 JIT 优化,使计算密集型代码无法获得正常的运行时优化。
Visual Studio 可以检查:
工具 → 选项 → 调试 → 常规 → 在模块加载时取消 JIT 优化将其关闭后重新启动调试会话。
十一、Native AOT需要注意AVX2
如果使用 x64 Native AOT 发布,官方建议在可执行项目中加入:
<IlcInstructionSet>avx2</IlcInstructionSet>否则可能按照 SSE2 / 128-bitVector<T>基线编译,从而导致 AVX2 内核无法发挥作用。
不过这个配置并不是所有电脑都能直接使用,没有 AVX2 的 CPU 不应该强行设置。
十二、适合哪些项目
从技术路线来看,这个项目比较适合:
.NET桌面OCR软件 ASP.NET Core OCR接口 WPF/WinForms OCR工具 批量图片文字识别 本地离线OCR 跨平台OCR程序 需要低依赖的C#项目尤其是已经在使用 .NET 技术栈,又不希望额外部署复杂原生 OCR 运行时的项目,可以关注一下这个方案。
十三、项目地址
项目名称:
Sdcb.SimdPaddleOCR
GitHub:
https://github.com/sdcb/SimdPaddleOCR
NuGet:
https://www.nuget.org/packages/Sdcb.SimdPaddleOCR
项目采用 Apache License 2.0。不过需要注意,仓库中的 PP-OCRv6 模型资源、第三方依赖等拥有各自的来源和许可证,实际分发时需要按照项目中的第三方说明处理。
总结
如果你正在寻找一个C#/.NET 原生OCR方案,Sdcb.SimdPaddleOCR可以作为一个值得研究的选择。
它的核心特点可以概括为:
纯C#推理 PP-OCRv6 无需Paddle Inference 无需ONNX Runtime 多平台 支持SIMD 支持Native AOT 低内存占用 支持本地模型对于 C# 开发者来说,最大的价值并不只是“能识字”,而是可以比较自然地把 OCR 能力直接集成进现有的 .NET 应用中。
原项目还提供了 ASP.NET Core、Avalonia、WPF、WinForms 等示例,可以直接作为实际项目的参考。