本项目将 OllmOne/PP-OCRv4 完整 OCR 流水线适配到华为昇腾 Ascend NPU 上运行。
PP-OCRv4 是百度开源的超轻量端到端 OCR 系统,支持:
模型包含的组件:
| 组件 | 模型文件 | 用途 |
|---|---|---|
| 移动端文本检测 | pp-ocrv4_mobile_det.onnx | 快速文字区域检测 |
| 移动端文本识别 | pp-ocrv4_mobile_rec.onnx | 快速文字内容识别(6625 类) |
| 服务端文本检测 | pp-ocrv4_server_det.onnx | 高精度文字区域检测 |
| 服务端文本识别 | pp-ocrv4_server_rec_doc.onnx | 高精度文档文字识别(15631 类) |
| 版面分析 | pp-doclayout_plus-l.onnx | 文档版面元素分析 |
| 表格检测 | rt-detr-l_*.onnx | 有线/无线表格单元格检测 |
| 表格结构识别 | slanext_*.onnx | 表格结构分析 |
| 方向分类 | pp-lcnet_x1_0_*.onnx | 文字方向/表格分类 |
| 组件 | 版本 |
|---|---|
| Python | 3.11.14 |
| onnxruntime | 1.24.0 |
| onnxruntime-cann | 1.24.4 |
| numpy | 1.24+ |
| opencv-python | 4.8+ |
| NPU | Ascend910 (2 芯片, 64GB HBM) |
| CANN | 配套 onnxruntime-cann 1.24.4 |
PP-OCRv4 原始模型为 PaddlePaddle 推理格式(.pdmodel + .pdiparams),已由 ModelScope 贡献者预先导出为 ONNX 格式。本项目直接使用 ONNX 模型,通过 onnxruntime-cann 的 CANNExecutionProvider 在 Ascend NPU 上运行推理。
onnxruntime.InferenceSession 加载 ONNX 模型CPUExecutionProviderCANNExecutionProvider,由 CANN 编译器自动将 ONNX 图编译为 NPU 可执行图# 安装依赖
pip install onnxruntime-cann onnxruntime numpy opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
# 下载模型
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
python3 -c "
from modelscope import snapshot_download
snapshot_download('OllmOne/PP-OCRv4', cache_dir='./ocr_models')
"# CPU 推理
python3 inference.py --image_path /path/to/image.png --device cpu
# NPU 推理
python3 inference.py --image_path /path/to/image.png --device npu
# 使用服务端模型(更高精度)
python3 inference.py --image_path /path/to/image.png --device npu --det_model server --rec_model server_doc使用同一测试图片,分别运行 CPU 和 NPU 推理,对比目标模型的原始输出(张量),计算以下指标:
测试图片: /opt/atomgit/test_image.png (200x800 RGB)
| 子模型 | 输出形状 | CPU 耗时/次 | NPU 耗时/次 | NPU 加速比 | 余弦相似度 | SNR |
|---|---|---|---|---|---|---|
| pp-ocrv4_mobile_det | (1, 1, 224, 800) | 0.0606s | 0.0015s | 39.47x | 0.999358 | 28.88 dB |
| pp-ocrv4_mobile_rec | (1, 50, 6625) | 0.0606s | 0.0015s | 39.87x | 0.999996 | 50.18 dB |
| 指标 | pp-ocrv4_mobile_det | pp-ocrv4_mobile_rec |
|---|---|---|
| Max Absolute Error | 0.284128 | 0.008382 |
| Mean Absolute Error | 0.000053 | 0.000001 |
| Max Relative Error | 5.96 | 1.01 |
| Cosine Similarity | 0.999358 | 0.999996 |
| SNR | 28.88 dB | 50.18 dB |
| Within Tolerance (1e-5) | 99.81% | 98.67% |
使用 test_image.png 进行完整的检测+识别流水线对比:
| 检测框 | CPU 识别结果 | NPU 识别结果 | 置信度(CPU) | 置信度(NPU) |
|---|---|---|---|---|
| Box 1 | 29999999999 | A0AAA8AAAAA | 0.9560 | 0.7610 |
| Box 2 | AF99999 | AHooooo | 0.9222 | 0.8755 |
| Box 3 | Hetloworae | Hetloworae | 0.9018 | 0.9024 |
说明: 检测+识别的端到端结果存在差异,这主要是因为 NPU 和 CPU 的检测概率图存在微小数值差异(余弦相似度 0.999358),导致检测框位置略有不同,进而裁剪到不同的文字区域。当使用完全相同的裁剪区域时,识别模型输出几乎完全一致(余弦相似度 0.999996)。Box 3 的识别结果完全一致证明了这一点。
NPU 与 CPU 推理结果误差 < 1%。
| 指标 | NPU (Ascend910) | CPU |
|---|---|---|
| 检测模型单次推理 | ~0.0015s | ~0.0606s |
| 识别模型单次推理 | ~0.0015s | ~0.0606s |
| 检测+识别流水线 (3 框) | ~0.006s | ~0.242s |
| NPU 模型加载+编译 | ~65s (首次) | ~0.5s |
| 推理设备 | Ascend910 | Intel Xeon |
注:NPU 首次推理包含 CANN 图编译时间(~65s),后续推理速度很快。CPU 时间基于 5 次运行取均值。
onnxruntime-cann 并可通过 CANNExecutionProvider 检测| 文件 | 用途 |
|---|---|
inference.py | PP-OCRv4 完整流水线推理脚本(检测+识别) |
compare_cpu_npu.py | CPU/NPU 精度对比脚本 |
requirements.txt | Python 依赖列表 |
utils/onnx_utils.py | ONNX 推理工具函数 |
基于现有评测数据,CPU 与 NPU 的 余弦相似度 精度误差为 0.0642%,小于 1% 的精度要求。
本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:
# NPU 推理
python3 inference.py --device npu
# CPU 推理
python3 inference.py --device cpu推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。