news 2026/10/1 21:35:16

C#高性能OCR识别库:SimdPaddleOCR本地部署教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#高性能OCR识别库:SimdPaddleOCR本地部署教程

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.ChineseV6TinyPP-OCRv6 Tiny
Sdcb.SimdPaddleOCR.Models.ChineseV6SmallPP-OCRv6 Small
Sdcb.SimdPaddleOCR.Models.ChineseV6MediumPP-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 等示例,可以直接作为实际项目的参考。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 21:34:12

GEO代运营怎么报价?用Python拆分问题库、复测和引用验收

GEO代运营怎么报价&#xff1f;用Python拆分问题库、复测和引用验收 GEO代运营报价不能只看“每月多少钱”。真正需要比较的是&#xff1a;服务方接手多少目标问题&#xff0c;覆盖哪些平台&#xff0c;做几轮基线和复测&#xff0c;是否整理事实与证据&#xff0c;是否生产内容…

作者头像 李华
网站建设 2026/10/1 21:33:56

我真实的内容创作出海经历

最近一年&#xff0c;我也在探索海外内容创作的方法和思路&#xff0c;发现几个有意思的点&#xff0c;我也给大家分享一下。欧美国家地区的读者阅读习惯和我们还是有很大差异的。我们现在越来越喜欢读短平快的内容&#xff0c;甚至出现了AI摘要这种快捷操作入口&#xff0c;但…

作者头像 李华
网站建设 2026/10/1 21:33:10

【C++进阶】C++ 11(下)

目录 1 可变参数模板 2 emplace 系列接口 3 C11 类新语法&#xff1a;default、delete 4 lambda 表达式 捕获规则 5 std::function 包装器 6 std::bind 适配器 小结 1 可变参数模板 C11 支持可变参数模板&#xff0c;使用...代表参数包。分为模板参数包、函数参数包。…

作者头像 李华
网站建设 2026/10/1 21:32:16

聚合增长GEO靠谱吗,技术实力与创新能力如何

当AI开始替客户做决定&#xff0c;你的品牌被看见了吗深夜十一点&#xff0c;苏州一家机械制造企业的老板还坐在办公室里。他刚试着在豆包里输入工业撕碎机哪家厂商实力强&#xff0c;屏幕上给出的推荐名单里&#xff0c;没有自己的公司。可他分明记得&#xff0c;五年前&#…

作者头像 李华