一个基于 Rust + ncnn 的 PaddleOCR 推理实验仓库。
当前工作区包含两个 crate:
ppocr-ncnn- OCR 业务层,负责文本检测、可选角度分类、文本识别、结果整理和 benchmark 输出
crates/ncnnrsncnn的 Rust FFI 和轻量封装,供ppocr-ncnn调用
仓库内已经放入一组运行示例所需的模型和测试图片,拿到仓库后可以直接跑 benchmark。
- PaddleOCR
- 本项目使用的是 PP-OCR 系列模型和字典文件
- Tencent ncnn
- 推理后端基于
ncnnC API
- 推理后端基于
ncnnrs 的更细节说明见 crates/ncnnrs/README.md。
.
├─ Cargo.toml
├─ crates/
│ └─ ncnnrs/
├─ ppocr-ncnn/
│ ├─ src/
│ └─ examples/
├─ models/
│ ├─ det/
│ ├─ rec/
│ └─ cls/
└─ inputs/
当前示例默认会在仓库根目录下查找:
models/det/PP_OCRv5_mobile_det.ncnn.parammodels/det/PP_OCRv5_mobile_det.ncnn.binmodels/rec/PP_OCRv5_mobile_rec.ncnn.parammodels/rec/PP_OCRv5_mobile_rec.ncnn.binmodels/rec/ppocrv5_dict.txtinputs/1.pnginputs/2.png
当前实现已经串起以下 OCR 流程:
- 图片预处理和补边
- 文本检测
- 透视裁剪
- 可选角度分类
- 文本识别
- 文本块拼接和耗时统计
公开入口主要是 ppocr_ncnn::prelude::* 中导出的:
OcrEngineOcrConfigOcrResultTextBlockOcrTiming
- 需要较新的 stable Rust
- 工作区使用
edition = "2024"
ncnnrs 会在编译时生成绑定,所以还需要:
- 可用的 Clang / libclang
bindgen能成功解析本地ncnn头文件
$env:NCNN_INCLUDE_DIR="path/to/ncnn"按需补充:
$env:NCNN_LIB_DIR="path/to/lib"cargo check只跑 CPU benchmark:
cargo run -p ppocr-ncnn --example cpu-only --release只跑 Vulkan benchmark:
cargo run -p ppocr-ncnn --example vulkan-only --release同时跑 CPU 和 Vulkan benchmark:
cargo run -p ppocr-ncnn --example all --releaseuse ppocr_ncnn::prelude::*;
fn main() -> anyhow::Result<()> {
let config = OcrConfig::default();
let engine = OcrEngine::new(
"models/det/PP_OCRv5_mobile_det.ncnn",
"models/rec/PP_OCRv5_mobile_rec.ncnn",
"models/rec/ppocrv5_dict.txt",
None::<&str>,
config,
)?;
let result = engine.detect_path("inputs/1.png")?;
println!("{}", result.text);
Ok(())
}说明:
det_model和rec_model既可以传完整.param/.bin路径,也可以传共享前缀,例如xxx.ncnncls_model是可选的;当前仓库里已有models/cls/,但示例默认没有启用分类模型gpu_index: None表示只在运行时禁用 GPU,不代表构建时不需要 GPU 相关头文件和库
ppocr-ncnn 目前只有一个 feature:
[features]
cpu = ["ncnnrs/cpu"]它的作用是把底层 ncnnrs 切到 CPU 运行路径,因此:
cpu-only示例需要--features cpu- 开启
cpufeature 后,GPU 查询接口会退化为 CPU-only 行为 - 这个 feature 目前不会移除编译阶段对
gpu.h和glslang.lib的依赖
- 当前
ncnnrs构建脚本明显偏向 Windows/MSVC,直接检查ncnn.lib - 还没有为 Linux/macOS 的
.a/.so/.dylib做兼容分支 cpufeature 目前不是“真正的 CPU-only 构建”- 示例默认使用仓库内置的模型目录布局,如果调整目录结构,需要同步修改路径或自定义调用代码