你有没有遇到过这种情况——想把截图、扫描件或一份 PDF 里的文字提取出来,用在线 OCR 一上传,敏感信息就交出去了;想本地跑一个,结果发现要装 Python、装 OpenCV、装 ONNX Runtime……依赖装了一屏幕,模型下了半天,最后还不一定能跑起来。
今天五哥要给大家介绍的 lw.PPOCR.C,就是来终结这个麻烦的——一个用纯 C 语言写的 PP-OCR 文字识别推理引擎,部署端零依赖,Windows、Linux、浏览器、Android 全平台都能跑,还贴心地提供了单文件离线 HTML 版,双击就能用,识别过程全程不出本机。
📌 lw.PPOCR.C 是什么?
lw.PPOCR.C 是开发者「天天代码码天天」在 GitHub 上开源的 PP-OCR 轻量级推理运行时,MIT 协议。它做的事情说起来很简单:把百度 PP-OCRv6 的检测、方向分类、识别三个模型,转换成自定义的 LWM 格式,然后用一份不依赖任何第三方运行时的纯 C 代码跑起来。
它的处理流程长这样:
PP-OCR ONNX 模型
→ 开发期转换器
→ 平台无关的 .lwm 模型
→ 纯 C 推理运行时
→ DET 文字检测 → CLS 方向分类 → REC 文字识别
注意一个关键定位:它不是通用深度学习推理框架,就是一个专注把 PP-OCR 跑好、跑快、跑得省心的 OCR 运行时。正因如此,它才能做到部署端不装 Python、不装 OpenCV、不装 ONNX Runtime / OpenVINO / TensorRT / protobuf,编译出来就是干干净净的库和可执行文件。
✨ 主要功能
- 🔍 完整 OCR 流水线——文字检测(DET)→ 方向分类(CLS,可选)→ 文字识别(REC),也各自提供独立的 C API;
- 🧩 纯 C11 核心——公共 ABI 不暴露 C++、STL 或任何第三方库类型,集成进各种老项目都不尴尬;
- 🚀 SIMD 自动分派——支持 x86 SSE2/AVX2、ARM NEON、龙芯 LSX,运行时自动检测,不支持就回退标量;
- 🧵 多线程并行——检测完成后,多个文字行由独立 worker 并行识别,原生 64 位默认吃满 CPU(最多 8 线程);
- 📐 自适应识别宽度——按文字行宽高比自动选择 192/320/480/640/960 的识别宽度,长文本精度和速度兼顾;
- 🔒 边界安全——模型加载带结构和校验和检查,内存容量不足返回明确错误,不在接口两侧交叉释放内存;
- 💾 调用方拥有内存——输入输出缓冲区全部由调用者管理,嵌入式场景用着放心。
🌐 最省心的用法:单文件离线 OCR,双击就用
如果你不是开发者,只想找个不联网、不注册、不上传的 OCR 工具,这个项目简直是为你想好了——Release 里直接下载 *-ocr-demo.html,一个 HTML 文件,双击就能在浏览器里完成 OCR,不需要启动任何服务。
别看它只是一个 HTML,功能相当齐全:
- 🖼️ 图片 OCR——文件选择、拖拽、甚至
Ctrl+V直接粘贴截图都行,粘贴只做本地预览,剪贴板图片永远不会上传; - 📄 本地 PDF OCR——内嵌 PDF.js 及其 JBIG2、OpenJPEG 解码器,扫描版 PDF 也能离线渲染识别,支持当前页或整本顺序识别;
- 📋 结果导出——可复制纯文本,也能导出 UTF-8 TXT 或带坐标、置信度的版本化 JSON;
- 📖 阅读顺序可选——横排从左到右、竖排从右到左(古籍排版)、竖排从左到右,处理竖排书页也不乱序;
- 📱 手机可用——默认 Tiny 模型体积小,手机浏览器也能跑。
⚡ 性能快照:Tiny 模型百毫秒级
项目 README 给出了本机实测数据(AMD Ryzen 7 7735H、AVX2 后端、500×500 测试图、REC 最大宽度 960),取多轮中位数:
| 模型 | 1 worker | 4 workers | 1 worker 峰值内存 |
|---|---|---|---|
| Tiny(默认) | 111.32 ms | 54.86 ms | 100.7 MiB |
| Small | 373.19 ms | 215.39 ms | 274.9 MiB |
| Medium | 1,275.58 ms | 1,013.85 ms | 1,078.5 MiB |
Tiny 模型单线程 111ms、开 4 个 worker 只要 55ms,内存占用 100 MiB 出头——这个量级放进桌面软件、NAS 小服务甚至嵌入式设备里都没有压力。当然这是特定机器的快照,实际耗时以你自己的环境为准。
📦 全平台产物一览
作者把各种使用场景的产物都准备齐了,去 GitHub Releases 按需下载:
| 用途 | 下载文件 | 说明 |
|---|---|---|
| 双击即用的离线 OCR | *-ocr-demo.html | Tiny,普通用户首选 |
| 网页集成 OCR | *-web-sdk.js | LwPpocr SDK,Tiny/Small/Medium 同一套 API |
| 原生 C/C++ | *-windows-x64-msvc.zip / *-linux-x86_64.tar.gz | 内置 Tiny 模型 |
| Android | *-android-arm64.aar / demo.apk | arm64-v8a,minSdk 21,完全离线 |
| 桌面 Java | *-java-jni-*.zip/tar.gz | Java 8+ 控制台接入 |
| Node.js | *-node-wasm.zip | Node 18+ 原始 WASM 包 |
| 切换模型 | *-ppocrv6-{tiny,small,medium}-runtime.zip | 带 manifest 和哈希的模型包 |
值得一提的是,当前稳定版 v1.0.0 对 Tiny 模型冻结了 C ABI v1 和 WASM Host ABI v1,也就是说依赖它的项目可以放心升级,接口不会突然变脸。Small 和 Medium 目前还是可选的 Preview 变体。
🔧 开发者怎么接入?
对开发者来说,lw.PPOCR.C 的集成方式非常直接。核心库只接收解码好的 BGR8 像素,图片解码(JPEG/PNG)由你自己的应用负责,这样核心保持零依赖。C 命令行完整 OCR 一行搞定:
.\build\Release\lw-ocr-ppm.exe ^ .\build\models\det.lwm ^ .\build\models\cls.lwm ^ .\build\models\rec.lwm ^ .\build\models\ppocr_keys.txt ^ .\build\models\sample.ppm
想做本地 OCR 服务?默认构建会附带一个基于 cpp-httplib 的原生 HTTP 服务,不依赖 .NET:
.\build\bin\lw.PPOCR.C.HttpServer.exe --host 127.0.0.1 --port 8787
浏览器打开 http://127.0.0.1:8787/,选张图片就能测试。接口接受二进制 P6 PPM 或 Base64 编码的请求体,拿来做局域网 OCR API 很顺手。当然,如果要暴露到公网,记得在前面加一层带认证和限流的反向代理。
C API 的调用套路也很规矩:*_options_init 初始化选项 → 用模型路径创建句柄 → 空缓冲区查询容量 → 传入 BGR8 像素和输出缓冲区 → 检查 lw_status → *_free 释放。所有结构体都带 struct_size 版本字段,为以后 ABI 扩展留好了后路。编译只需要 CMake 3.20+ 和一个支持 C11 的编译器。
🎯 模型怎么选?
| 模型 | 定位 | 适用场景 |
|---|---|---|
| Tiny | 默认、稳定支持 | 手机、嵌入式、批量截图,速度内存双优 |
| Small | Preview | 精度要求稍高,需在目标设备实测后启用 |
| Medium | Preview | 桌面优先,精度最高但耗时内存明显上涨 |
五哥的建议:直接从 Tiny 开始,绝大多数场景够用;真觉得识别率不满意再上 Small,Medium 留给桌面端精扫。
🤔 还有什么要注意的?
- 图片解码自理——核心库只吃 BGR8 像素,JPEG/PNG 解码要自己在应用层搞定(浏览器 Demo、WinForms、Java 示例里都已备好);
- LWM 仍是内部 Preview 格式——从 0.1.x 升级要整体替换同一版本的模型、字典和二进制,别混着用;
- 平台验证分层——Windows x64 / Linux x64 是首要平台,ARM64、龙芯、Android 属于 CI 验证或 Preview 层次,上实体机前记得先测;
- 老系统友好——WinForms Demo 面向 .NET Framework 3.5,运行时还能兼容 Windows 7 x86,维护老设备的同学狂喜。
📝 总结
OCR 这件事,云服务做得早也好、效果也好,但「截图上传」这个动作本身就把一部分用户挡在了门外。lw.PPOCR.C 用一份纯 C 代码把 PP-OCR 做成了零依赖、可冻结 ABI、全平台分发的本地推理运行时,思路相当清爽。
如果你符合下面任意一个场景,值得一试:
- 🎯 想要一个双击就用、数据不出本机的 OCR 工具——直接下 ocr-demo.html;
- 🖥️ 在做桌面软件、NAS 服务、嵌入式程序,想内嵌文字识别又不想拖一堆运行时;
- 🤖 想给自动化脚本、RAG 知识库做本地 PDF/截图文字提取的前置管道;
- 💰 受够了商业 OCR 的按次收费和 API 限额。
MIT 开源、v1.0.0 稳定版已就位,有什么理由不试试呢?😄