Releases: sdcb/SimdPaddleOCR
Release list
SimdPaddleOCR 1.4.2
发布 SimdPaddleOCR 1.4.2。这一版把 CLS 测试集正确率拉到了 100%。
DET 长行如果整行挤进 160×80,字形会被压扁,0/180 就变成噪声。1.4.2 对宽高比超过 4:1 的行只采样左边 4×height 窗口,再按原来的 keep-aspect + RecNorm 送进网络。2:1 太短,倒着的拉丁尾巴仍会漏翻;4:1 是正确率和简单性比较合适的折中。
本机 DET 匹配行 1022/1022,CI 1020/1020。墙钟和内存相对 1.4 不变。
完整数字见 docs/perf.md。NuGet:Sdcb.SimdPaddleOCR。
SimdPaddleOCR 1.4
非常自豪地发布 SimdPaddleOCR 1.4。这一版把 1.3 没开闸的路径补上了:墙钟更快、工作集腰斩、medium 正确率贴上 C,像素也不用再先转成 BGR。
性能碉堡
图级 NHWC 从「仅 AVX2」扩到 ns2 / x64 scalar / net10 AdvSIMD。预处理直接写 NHWC,少一次输入搬家。
本机 Ryzen 7 5800X、4 worker、同一套 100 张(墙钟 n=99):
| 模型 | 路径 | 1.3 | 1.4 | 相对 |
|---|---|---|---|---|
| tiny | net10 AVX2 | 86.0 ms | 63.1 ms | 0.73× |
| tiny | ns2 | 203.1 ms | 96.5 ms | 0.48× |
| small | net10 AVX2 | 222 ms | 200 ms | 0.90× |
| medium | net10 AVX2 | 628 ms | 585 ms | 0.93× |
| medium | ns2 | 1606 ms | 874 ms | 0.54× |
CI 上 linux-arm64 N2 tiny-4w 241 → 180 ms(约快 25%);win-x64 7763 的 ns2 343 → 228 ms。AVX2 默认路径和 1.3 持平,台阶在以前吃不到 NHWC 的那些人。
内存优化
tiny 工作集峰值 804 → 515 MB,medium 2489 → 1206 MB。CI 同一把尺子:7763 817 → 515 MB,N2 840 → 572 MB,Δ WS 从大约 400 MB 掉到 100–160 MB。
正确率优化
CLS 预处理改回 PaddleOCR ClsResizeImg 保比例,细长拉丁行不再被拉成 160×80 后 0/180 翻面。本机同一 1036 行:tiny / small 没动;medium CER 0.67% → 0.26%,已经贴上 lw.PPOCR.C 的 0.24%。
像素格式
Run 默认仍是 Bgr24,也可以直接吃 RGB24 / BGRA32 / RGBA32。swizzle 发生在本来就要做的 resize / warp 里,不摊一张中间 BGR。ImageSharp 的 Rgba32、Skia / Bitmap 的 BGRA 可以原样送进来。
LINQPad
NuGet 包带 4 个脚本:imagesharp / skiasharp / opencvsharp5 / bitmap。下载示例图,tiny 模型识别,控制台输出文字。打了 linqpad-samples 标签,免费版也能用。bitmap 在 LINQPad 5 / .NET Framework 4.8 和 .NET 10 上都能跑。
完整数字和读数规则见 docs/perf.md。NuGet:Sdcb.SimdPaddleOCR。
SimdPaddleOCR 1.3.0
AVX2+FMA 上对连续卷积段走图级 NHWC;netstandard2.0 / ARM / PPOCR_NHWC=0 仍是 NCHW。正确率不变。
相对 1.2
同一 CPU、同一 ISA、PP-OCRv6 tiny、去掉 warmup 的中位墙钟(34818949921 vs 34303303418):
- win-x64(EPYC 7763 AVX2):4 worker 232 → 160 ms(约快 31%,吞吐约 1.45×)。强制
noavx512同样是 0.69×。 - win-x64
netstandard2.0(无 NHWC):361 → 343 ms,几乎没动。 - linux-arm64(Neoverse N2):273 → 241 ms(约快 12%)。
- 同 replica OpenVINO / 本库:1.2 为 0.96(OV 略快);1.3 为 1.38(本库反超)。
本机 Ryzen 7 5800X、medium 4 worker、同一 100 张:相对标签 1.2.0 1507 → 641 ms(约 0.43×,吞吐约 2.3×),CER 仍 0.68%。
当前基准(1.3)
GitHub-hosted runner,tiny,34818949921:
| 平台 | ISA | 中位 ms/图 | 工作集峰值 |
|---|---|---|---|
| win-x64 / EPYC 7763 | AVX2 | 160 | ~817 MB |
win-x64 netstandard2.0 |
AVX2(Vector,无 NHWC) |
343 | ~775 MB |
| linux-arm64 / Neoverse N2 | AdvSimd(无 NHWC) | 241 | ~840 MB |
正确率跨 Windows / Linux / macOS 与 scalar 都是 757/1022、CER 3.53%。
本机引擎对比(Ryzen 7 5800X,4 worker,仓库 dataset/ 100 张,n=99)。c 为 lw.PPOCR.C 20d0de6(2026-09-14 DLL)。墙钟是 mean ms/图。
| 模型 | 引擎 | mean ms/图 | 相对本库 | 行精确 | CER | 工作集峰值 |
|---|---|---|---|---|---|---|
| tiny | 本库 | 87.8 | 1.00 | 734/1026 | 2.71% | 803 MB |
| tiny | OpenVINO.NET | 132 | 1.51 | 644/1026 | 3.55% | 2785 MB |
| tiny | lw.PPOCR.C | 186 | 2.12 | 744/1026 | 4.01% | 539 MB |
| medium | 本库 | 641 | 1.00 | 992/1026 | 0.68% | 2430 MB |
| medium | OpenVINO.NET | 1077 | 1.68 | 810/1026 | 1.74% | 4516 MB |
| medium | lw.PPOCR.C | 2193 | 3.42 | 1004/1026 | 0.24% | 1481 MB |
small 和读数规则见 docs/perf.md。NuGet:Sdcb.SimdPaddleOCR 1.3.0。
SimdPaddleOCR 1.2.0
ARM64 上把 AdvSimd 铺进热路径;win-x64 默认 AVX2 与 1.1 持平。正确率不变。
相对 1.1
同一 CPU、同一 ISA、PP-OCRv6 tiny、去掉 warmup 的中位墙钟:
- linux-arm64(Neoverse N2):4 worker 472 → 273 ms(约快 42%,吞吐约 1.73×);1 worker 658 → 399 ms(约快 40%)。scalar 几乎没动。
- win-x64 关掉 AVX 的 Vector128:554 → 494 ms(约快 11%)。
- win-x64 默认 AVX2(EPYC 7763):233 → 238 ms,持平。
当前基准(1.2)
GitHub-hosted runner,tiny,4 次 CI 合计:
| 平台 | ISA | 中位 ms/图 | 工作集峰值 |
|---|---|---|---|
| win-x64 / EPYC 7763 | AVX2 | 238 | ~790 MB |
win-x64 netstandard2.0 |
AVX2(Vector) |
373 | ~785 MB |
| linux-arm64 / Neoverse N2 | AdvSimd | 273 | ~847 MB |
同机引擎对比(win-x64 / EPYC 7763,tiny 4 worker):
| 引擎 | 中位 ms/图 | 工作集峰值 | 行精确 | CER |
|---|---|---|---|---|
| 本库 | 224 | ~790 MB | 757/1022 | 3.53% |
| lw.PPOCR.C | 281 | ~586 MB | 759/1022 | 4.18% |
| OpenVINO.NET | 214 | ~2600 MB | 698/1022 | 3.63% |
lw.PPOCR.C 用的是 2026 年 8 月底的一份构建,不代表其最新版本。
正确率跨 Windows / Linux / macOS 与 scalar 都是 757/1022、CER 3.53%。墙钟接近 OpenVINO.NET、比该份 C 快约 26%;工作集约 OpenVINO.NET 的 1/3。
环境、ISA 阶梯和读数规则见 docs/perf.md。NuGet:Sdcb.SimdPaddleOCR 1.2.0。