SimdPaddleOCR
一个纯 C# 写成的完整 OCR 推理引擎。不依赖 Paddle Inference、ONNX Runtime,也不需要 OpenCV 原生库。
dotnet add package Sdcb.SimdPaddleOCR
dotnet add package Sdcb.SimdPaddleOCR.Models.ChineseV6Tiny为什么
PaddleSharp 与 OpenVINO.NET 在 AI 时代的彻底焕新
PaddleSharp 和 OpenVINO.NET 已经帮很多人把 OCR 跑进了 .NET,但它们都得背着几十上百 MB 的原生运行时:换一个平台、换一个 CPU 架构,就要换一套 native 包,部署和排错都很痛苦。
SimdPaddleOCR 换了个思路:模型用自带的托管 ONNX 解释器加载,卷积、GEMM 等算子全部用 C# 的硬件内在函数手写,运行时按 CPU 能力自动选择 AVX-512、AVX2、NEON 或纯 Vector 路径。结果是一个 NuGet 包到处跑,连 NativeAOT 和 .NET Framework 4.8 都不例外。
核心 API 只接收像素内存(BGR24 / RGB24 / BGRA32 / RGBA32),不强迫你引入任何图像库。ImageSharp、SkiaSharp、OpenCvSharp、System.Drawing,想用哪个用哪个。
青色为 2.0 新增的 GPU 后端,仅 net10.0。
上手
选你喜欢的图像库,三行代码出结果
using System.Runtime.InteropServices;
using Sdcb.SimdPaddleOCR;
using Sdcb.SimdPaddleOCR.Models.ChineseV6Tiny;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.PixelFormats;
using PaddleOcrAll ocr = await PaddleOcrAll.LoadAsync(ChineseV6TinyModels.Default);
// Clone Default:改 Configuration.Default 会丢掉 PNG/JPEG 解码器
Configuration cfg = Configuration.Default.Clone();
cfg.PreferContiguousImageBuffers = true;
using Image<Rgba32> image = await Image.LoadAsync<Rgba32>(
new DecoderOptions { Configuration = cfg }, "sample.jpg");
if (!image.DangerousTryGetSinglePixelMemory(out Memory<Rgba32> memory))
{
Rgba32[] copy = new Rgba32[image.Width * image.Height];
image.CopyPixelDataTo(copy);
memory = copy;
}
PaddleOcrResult result = ocr.Run(MemoryMarshal.AsBytes(memory.Span),
image.Width, image.Height, format: ImagePixelFormat.Rgba32);
Console.WriteLine(result.Text);using SkiaSharp;
using SKBitmap bitmap = SKBitmap.Decode("sample.jpg").Copy(SKColorType.Bgra8888);
unsafe
{
PaddleOcrResult result = ocr.Run(
new ReadOnlySpan<byte>((byte*)bitmap.GetPixels(), bitmap.RowBytes * bitmap.Height),
bitmap.Width, bitmap.Height, bitmap.RowBytes, ImagePixelFormat.Bgra32);
}using OpenCvSharp;
using Mat image = Cv2.ImRead("sample.jpg", ImreadModes.Color);
int stride = (int)image.Step();
unsafe
{
PaddleOcrResult result = ocr.Run(
new ReadOnlySpan<byte>((byte*)image.Data, stride * image.Height),
image.Width, image.Height, stride, ImagePixelFormat.Bgr24);
}using System.Drawing;
using System.Drawing.Imaging;
using Bitmap bitmap = new("sample.jpg");
BitmapData data = bitmap.LockBits(new(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
try
{
unsafe
{
PaddleOcrResult result = ocr.Run(
new ReadOnlySpan<byte>((byte*)data.Scan0, data.Stride * bitmap.Height),
bitmap.Width, bitmap.Height, data.Stride, ImagePixelFormat.Bgra32);
}
}
finally { bitmap.UnlockBits(data); }using PaddleOcrAll ocr = await PaddleOcrAll.LoadAsync(ChineseV6TinyModels.Default,
new PaddleOcrOptions
{
Detector = new PaddleOcrDetectorOptions { Backend = OcrBackend.Vulkan },
Recognizer = new PaddleOcrRecognizerOptions { Backend = OcrBackend.Vulkan },
Classifier = new PaddleOcrClassifierOptions { Backend = OcrBackend.Vulkan },
});
// 默认 OcrBackend.Auto:有满足条件的 GPU 就用,否则留在 CPU。
// macOS arm64 上把 Vulkan 换成 OcrBackend.Metal。性能
每个版本都更快、更省
数据来自仓库 docs/ 下各机型报告(去掉首张预热后的中位墙钟,同机 CPU 对比 Vulkan / Metal GPU)。CPU 数据每次 CI 都会在 Windows / Linux / macOS 多架构上重跑。
RTX 3080 Ti · 端到端 / 张
Ryzen 7 5800X CPU vs Vulkan · 100 images · 2.0
Intel Arc B580 · 端到端 / 张
CPU vs Vulkan · 三轮中位 · 2.0
工作集峰值
tiny · 4 workers
本机 CER:tiny 2.78% → 2.37%,small 0.60% → 0.41%,medium 0.67% → 0.14%。
平台
一个包,到处都能跑
- 目标框架:net10.0 与 netstandard2.0(含 .NET Framework 4.8)
- NativeAOT 兼容(IsAotCompatible)
- 模型从程序集嵌入资源直接加载,不解压、不写临时文件
- 骁龙 8 Gen 3 上实测 CPU 与 Vulkan
| OS | CPU | GPU (2.0) |
|---|---|---|
| Windows | x64x86ARM64 | Vulkan |
| Linux | x64ARM64 | Vulkan |
| macOS | x64ARM64 | Metal |
| Android | ARM64 | Vulkan |
NuGet
包与模型
累计下载 5,341
系列文章
从 0 到 2.0 的开发手记
SimdPaddleOCR 2.0:再快15倍!见证纯C#驱动的GPU性能核弹
大家好,SimdPaddleOCR 今天发布 2.0。这是项目第一次升大版本号,原因很简单:1.x 一直在折腾 CPU 上的 SIMD,2.0 加上了 GPU 后端,Windows / Linux / 安卓走 Vulkan,macOS 走 Metal。在我的 RTX 3080 Ti 上,medium
Fable 5.1操刀,内存腰斩,外星科技——SimdPaddleOCR 1.4 发布!
大家好,我非常自豪地宣布纯 C# 写的 SimdPaddleOCR 今天发布 1.4 版本,这个版本有许多重大改进,其中有一些甚至说得上是“外星科技”! 对于刚认识这个项目的朋友,先交代一下我们的硬核定位:这是一个纯 C# 实现的 PP-OCRv6 引擎。它不需要 Paddle Inference,
AVX性能暴涨135%,吊打OpenVINO.NET——SimdPaddleOCR 1.3发布!
先看性能跑分,机器是我自己的主力开发机 Ryzen 7 5800X(16 逻辑核,AVX2),Windows 11,PP-OCRv6,4 个行级 worker,仓库里会生成 100 张合成图,去掉第一张预热,统计 99 张,长这个样子: 耗时是每张图的平均毫秒。C 引擎换成了较新的 lw.PPOCR
ARM64端到端再提速40%:SimdPaddleOCR 1.2 发布!
前两天连载了 SimdPaddleOCR 的发布 和 C# 手写向量化的底层逻辑。1.1 版本在 win-x64 上已经基本站稳了脚跟,但短板也很明显:ARM64 环境下虽然能跑,但速度明显慢了一截。 现在 ARM64 早就不是小众平台了——MacBook、手机、Windows on ARM 以及越
C# 手写向量化能追上 C 吗?
昨天发布了 SimdPaddleOCR,评论区和群里最多的一类问题是:纯 C# 写的推理,凭什么比纯 C 还快? 有人觉得肯定是偷偷调了 ONNX Runtime,有人觉得是 C 那边写得太烂,还有人直接说"C# 就不该谈性能"。 这篇不谈 OCR,谈一个更朴素的问题:C# 到底有没有能力写出和 C
SimdPaddleOCR发布——一个纯 C# 的完整 OCR 推理库
今天正式发布 SimdPaddleOCR(NuGet: Sdcb.SimdPaddleOCR)。这是一个完全用 C# 编写的完整 OCR 推理引擎。它不依赖 Paddle Inference,不依赖 ONNX Runtime,也不需要附带 OpenCV 的原生动态链接库。 如果你现在去翻这个 Git
