做 OCR,一定要安装 Python、OpenCV、ONNX Runtime,或者搭一套后端服务吗?
不一定。
最近我一直在做一个比较"极简"的 OCR 项目------lw.PPOCR.C。

它的目标很直接:
用尽可能少的运行时依赖,把 PP-OCRv6 Tiny 的完整 OCR 推理链真正跑起来。
到了刚刚发布的 v0.1.0-preview.4,这个项目又向前走了一步。
现在不仅可以继续下载一个 ocr-demo.html,双击直接 OCR,还正式增加了一个可以嵌入普通网页的 JavaScript OCR SDK。
也就是说,同一套 OCR 内核现在有了两种使用方式:
普通用户:下载一个 HTML,直接用。
开发者:引入一个 JS 文件,直接把 OCR 集成进自己的网页。
而图片和 OCR 推理都可以留在本地浏览器中完成。
01 一个 HTML,就是一个完整 OCR 工具
这是我一直很想保留的使用方式。
在 Release 中下载:
lw.PPOCR.C-0.1.0-ocr-demo.html
然后直接双击。
没有安装程序。
没有 Python 环境。
不需要启动 HTTP 服务。
也不需要额外放 .wasm、.lwm 或模型文件。
因为这个 HTML 里面已经内嵌了:
- WebAssembly OCR Runtime
- DET 文本检测模型
- CLS 方向分类模型
- REC 文本识别模型
- OCR 字典
- 页面 UI
- OCR 导出功能
整个文件大约 10 MB。
打开之后,选择一张图片,就可以在浏览器里完成:
DET → CLS → REC
完整 OCR 流程。
识别完成后可以直接:
复制文本、导出 TXT、导出结构化 JSON。
手机端也做了专门适配,可以从相册选择图片,也可以直接调用相机拍照识别。
对我来说,这种形式最大的意义不是"炫技",而是简单。
有时候你只是临时想从一张截图、扫描件或者照片里提取文字。
如果为了这件事还要:
安装软件 → 配环境 → 下载模型 → 启动服务 → 上传图片
整个链路其实已经比 OCR 本身更复杂了。
而单 HTML 的体验就是:
下载 → 双击 → OCR。
02 图片不需要上传到服务器
ocr-demo.html 的 OCR 推理运行在浏览器本地。
选择图片以后,图片不会为了 OCR 被上传到一个远程识别服务器。
模型也已经打包在文件内部。
这意味着,它特别适合一些不希望把图片发送到第三方服务器的场景,例如:
合同截图、内部资料、票据、研发文档、聊天截图以及临时扫描件等。
当然,它不是在宣传一种绝对意义上的"安全产品"。
它真正解决的是一个很具体的问题:
OCR 这一步,本身不需要依赖远程服务器。
03 preview.4 最大的变化:OCR 正式变成 JS SDK
之前的 ocr-demo.html 更像一个完整应用。
它很好用,但开发者如果想把 OCR 能力放到自己的网页里,就不够优雅。
所以在 v0.1.0-preview.4 中,我把 Web 层重新拆了一次。
现在架构变成了:
Pure C Runtime
↓
Web ABI
↓
WebAssembly
↓
lw-ppocr.js
↓
你的网页 / ocr-demo.html
也就是说:
OCR Demo 不再自己实现一套 WASM 调用。
相反,Demo 本身也变成了 JavaScript SDK 的一个使用者。
这件事很重要。
因为从这一版开始,浏览器 OCR 不再只是"一个 Demo 页面",而是有了真正可以复用的开发接口。
Release 中现在会同时提供:
lw.PPOCR.C-0.1.0-ocr-demo.html
以及:
lw.PPOCR.C-0.1.0-web-sdk.js
前一个给普通用户。
后一个给开发者。
04 网页里调用 OCR,现在只需要几行代码
SDK 的接口刻意做得比较简单。
核心流程只有:
ini
const ocr = await LwPpocr.create({
useCls: true,
maxImageSide: 1600
});
const result = await ocr.recognize(file);
console.log(result.lines);
ocr.destroy();
recognize() 目前支持:
File、Blob、ImageData 和 HTMLCanvasElement。
返回的是结构化结果。
例如:
yaml
{
result_version: 1,
source: "article.png",
image: {
width: 1920,
height: 1080
},
timing: {
decode_ms: 5.2,
inference_ms: 86.7,
total_ms: 94.1
},
lines: [
{
text: "识别文字",
box: [...],
det_score: 0.97,
rec_score: 0.99
}
]
}
这意味着你可以很容易继续做:
OCR 搜索、文档索引、表单提取、截图工具、浏览器插件、知识库录入、图片翻译以及自己的 OCR 前端。
而不需要自己接触:
WASM 内存、指针、HEAP、模型加载、RGBA → BGR 转换等底层细节。
05 OCR 默认还能跑在后台 Worker
浏览器里做本地 AI 推理有一个比较现实的问题:
推理时间稍微长一点,主页面就可能卡住。
所以这次 SDK 里把 Web Worker 也一起做了。
正常情况下:
网页主线程负责 UI,
OCR Runtime 和 WASM 放到 Blob Worker 中运行。
因此在识别过程中,页面仍然可以保持响应。
如果某些浏览器或本地安全策略不允许创建 Blob Worker,SDK 还会自动退回到主线程兼容模式。
这里没有使用 WASM pthread。
所以也不要求开发者为了 OCR 专门配置 SharedArrayBuffer、COOP、COEP 这一套环境。
对于一个"下载 JS 就能用"的 OCR SDK 来说,我更希望它首先是简单的。
06 单文件 HTML 并没有因为 SDK 化而消失
这一点特别说明一下。
做 JS SDK,并不是要把原来的单 HTML 版本替换掉。
恰恰相反。
现在构建流程变成:
先生成:
lw-ppocr.js
然后再把这份 SDK、Demo UI 和页面资源重新全部打进:
ocr-demo.html
因此最后的 ocr-demo.html 依然是:
一个真正完整的单文件离线 OCR 应用。
未来即使继续增加 ES Module、npm、Vue/React 示例,我也希望一直保留这个版本。
因为它是 lw.PPOCR.C 很重要的一个特点:
开发者可以集成,普通用户也可以直接用。
07 不只是 Web,这一版还补了很多工程化工作
preview.3 → preview.4 实际上不仅仅增加了一个 JavaScript 文件。
这段时间还继续补了不少底层和测试工作。
例如:
C# WinForms Demo 的 OCR 结果导出;
HTTP Demo 的结构化结果能力;
更完整的 OCR Golden Corpus;
与 OpenCV DNN 的正确性对照;
完整 OCR Pipeline 的持续性能分析;
WASM 重复推理和内存稳定性测试;
浏览器 SDK 独立自动测试;
单 HTML UI 独立自动测试。
我越来越希望这个项目不是:
"这张测试图片能跑起来。"
而是:
每一次优化之后,都有办法判断它到底有没有把 OCR 搞坏。
尤其是 SIMD、MatMul、卷积、动态宽度 REC 这些优化,很多代码看上去"更快",实际跑完整 OCR 后未必真的更好。
所以现在项目里会更强调:
Correctness first,measurement-driven optimization。
先保证结果,再谈性能。
08 lw.PPOCR.C 到底是什么?
如果第一次看到这个项目,可以简单理解成:
一个面向 PP-OCRv6 Tiny 的轻量级纯 C OCR 推理 Runtime。
当前主要支持:
DET 文本检测
CLS 文本方向分类
REC 文本识别
以及完整:
DET → CLS → REC OCR Pipeline
原生端提供 C API,并针对 CPU 做了 Scalar、SSE2、AVX2 等优化。
Web 端则通过 WebAssembly 运行。
部署时不要求 Python,也不依赖 OpenCV、ONNX Runtime、OpenVINO、TensorRT 或 protobuf。
需要特别说明的是:
它并不是一个"通用 ONNX Runtime"。
目标不是支持世界上所有神经网络。
当前更关注的是:
把 PP-OCRv6 Tiny 这一条 OCR 路径做好、做稳、做轻。
09 谁可能会喜欢这个项目?
如果你的需求是:
"我要训练 OCR 模型。"
那 PaddleOCR 原项目显然更加合适。
但如果你的问题变成:
"模型已经有了,我怎么把 OCR 很轻地部署出去?"
那么 lw.PPOCR.C 可能值得看看。
尤其是这些场景:
想在纯 C/C++ 程序中集成 OCR;
想做体积比较小的 Windows OCR 工具;
不想部署 Python Runtime;
想把 OCR 放进一个普通网页;
希望图片尽量留在本地;
想做离线网页工具;
想研究一个从 ONNX → 自定义模型格式 → C Runtime → WASM 的完整推理链。
这些都是这个项目目前比较适合探索的方向。
10 v0.1.0-preview.4 现在已经可以下载
本次 Release 提供:
Windows x64 MSVC 版本;
Linux x86_64 版本;
单文件离线 OCR HTML;
单文件 Browser OCR JavaScript SDK;
以及相应的 SHA-256 校验文件。
如果只是想体验:
优先下载 ocr-demo.html。
双击即可。
如果准备开发:
下载 web-sdk.js,从 LwPpocr.create() 开始。
项目目前仍然是 preview 阶段。
API、模型格式和一些工程设计仍然可能继续调整,因此暂时还没有把它称作稳定版。
但目前完整 OCR、原生 Runtime、WebAssembly、单 HTML、Web SDK 这几条链路已经基本连接起来了。
写在最后
lw.PPOCR.C 一开始其实只是想回答一个问题:
PP-OCR 能不能不用一大套运行环境,直接用 C 跑起来?
后来问题慢慢变成:
能不能跑快一点?
再后来是:
能不能完整跑 DET、CLS、REC?
然后是:
能不能打包成一个 HTML?
而现在又变成:
能不能让别人只引入一个 JS 文件,就把 OCR 放进自己的网页?
v0.1.0-preview.4 算是这个过程中的一个小节点。
现在:
一个 HTML,可以是 OCR 工具。
一个 JS,也可以是 OCR SDK。
底层仍然是同一个纯 C OCR Runtime。
如果你对纯 C 推理、OCR 部署、WebAssembly、本地 AI 工具或者轻量级模型运行时感兴趣,欢迎试试 lw.PPOCR.C。
项目开源在 GitHub:
lxw112190/lw.PPOCR.C
也欢迎提交 Issue、测试不同图片,或者告诉我:
你希望一个轻量级 OCR Runtime 下一步还能做什么?
如果觉得项目有用,也欢迎点一个 Star ⭐。
这会是项目继续迭代很大的动力。