g
gcw_AVRCax4T/onnxocr_model
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

OnnxOCR-NPU

基于昇腾 Ascend NPU 的 PP-OCRv4/v5 ONNX 推理引擎,支持文本检测、识别与方向分类的端到端 OCR 推理。

模型信息

属性值
模型名称OnnxOCR (PP-OCRv4 / PP-OCRv5)
任务类型文字检测与识别 (OCR)
框架ONNX → PyTorch (onnx2torch) on Ascend NPU
原始模型PaddleOCR / OnnxOCR
模型来源supersong/onnxocr_model (ModelScope)
硬件平台Huawei Ascend 910
CANN 版本8.5.1
适配方式ONNX 标准化 + onnx2torch 转换 + torch_npu 部署

模型说明

OnnxOCR 是基于 ONNX Runtime 的高性能多语言文字检测与识别项目。本项目将其 ONNX 模型适配到昇腾 Ascend NPU 上,通过以下技术路线实现:

  1. ONNX 标准化: 将 Paddle 导出的 Constant 节点转换为标准 Initializer
  2. onnx2torch 转换: 将 ONNX 计算图转换为 PyTorch FX GraphModule
  3. torch_npu 部署: 在 Ascend NPU 上执行推理

模型组成

模型用途输入形状输出
det.onnx文字检测 (PicoDet/DB)[N, 3, H, W][N, 1, H, W] 概率图
cls.onnx文字方向分类 (180°)[N, 3, 48, 192][N, 2] 方向概率
rec.onnx文字识别 (CRNN/SVTR)[N, 3, 48, W][N, T, V] CTC 分布

硬件要求

  • 芯片型号: Ascend 910 / Ascend 910B
  • 显存需求: ≥ 8 GB HBM (推荐)
  • 驱动版本: Ascend HDK 25.5.2+
  • CANN 版本: 8.5.1+

环境准备

# 安装依赖
pip install torch_npu==2.9.0
pip install onnx onnxruntime onnx2torch
pip install opencv-python numpy shapely pyclipper
pip install modelscope  # 下载模型
# 下载模型
modelscope download --model supersong/onnxocr_model

快速开始

单张图片 OCR

from inference import NPUOCR

ocr = NPUOCR(version="ppocrv5", use_npu=True)
results = ocr.ocr("test.jpg")
for r in results:
    print(f"[{r['confidence']:.3f}] {r['text']}")

命令行

# 单张图片推理
python inference.py --image test.jpg --output result_img

# 性能基准测试
python inference.py --benchmark

# 精度验证 (NPU vs CPU)
python inference.py --accuracy

# CPU 模式 (对比测试)
python inference.py --image test.jpg --cpu

性能数据

测试环境: Ascend 910 @ CANN 8.5.1, torch_npu 2.9.0

模型级性能

模型NPU (ms)CPU (ms)加速比NPU-CPU 误差
det (PP-OCRv5)41.13337.068.20x< 0.0001%
cls10.818.54~1.00x*0.0529%
rec (PP-OCRv5)27.1061.502.27x0.3231%

*注: cls 模型极小 (582KB),NPU 调度开销相对较大,性能与 CPU 持平。 实际端到端 OCR 中 cls 耗时占比 < 10%,整体加速显著。

端到端 OCR 性能

测试图片分辨率检测文本数NPU 端到端 (ms)
00006737.jpg896×528311,331
00018069.jpg1,438×879692,083
00059985.jpg800×56622677
korean_1.jpg610×461217

精度验证

NPU vs CPU 推理输出最大差异:

模型最大误差阈值结果
det0.0000%1%✅ PASS
cls0.0529%1%✅ PASS
rec0.3231%1%✅ PASS

结论: 所有模型 NPU 推理精度与 CPU 一致,误差 < 1%,满足精度要求。

NPU 适配技术细节

推理引擎适配

原始 OnnxOCR 使用 onnxruntime.InferenceSession (CPU/CUDA)。本项目实现了 NPU 推理引擎 NPUInferenceEngine:

class NPUInferenceEngine:
    """将 ONNX 模型转换为 PyTorch 并在 NPU 上执行。"""
    
    def _initialize(self):
        # Step 1: ONNX 标准化 (Constants → Initializers)
        std_path = standardize_onnx(model_path)
        
        # Step 2: ONNX → PyTorch 转换
        self.torch_model = onnx2torch.convert(std_path)
        
        # Step 3: 部署到 NPU
        self.torch_model = self.torch_model.npu()

预处理对齐

为确保精度一致,预处理完全对齐原始 OnnxOCR/PaddleOCR:

  • 检测: ImageNet 归一化 (mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225])
  • 识别/方向: 简单归一化 ((x/255 - 0.5) / 0.5)
  • 后处理: DB 二值化 + pyclipper 多边形扩展 + minAreaRect

回退机制

当 onnx2torch 转换失败时 (如 ppocrv4_rec 的 BatchNorm 不支持), 自动回退到 onnxruntime CPU:

[FALLBACK] onnx2torch conversion failed → onnxruntime CPU inference

文件结构

onnxocr_npu/
├── inference.py              # 主推理脚本 & OCR Pipeline
├── npu_engine.py             # NPU 推理引擎 (ONNX→Torch→NPU)
├── onnx_standardize.py       # ONNX 模型标准化工具
├── accuracy_log.txt          # 精度验证日志
├── benchmark_log.txt         # 性能基准日志
├── result_img/               # 推理结果与可视化
├── README.md                 # 本文档
└── test_images/              # 测试图片

已知限制

  1. ppocrv4_rec 模型: onnx2torch 不支持 BatchNorm spatial_rank=-2,自动回退 CPU
  2. 动态 batch: 当前仅支持 batch_size=1 (onnx2torch 限制)
  3. 首次推理: 模型加载时 JIT 编译开销约 1-3 秒

标签

#NPU #Ascend910 #OCR #PP-OCR #ONNX #torch_npu #TextDetection #TextRecognition #PaddleOCR #CANN #昇腾 #ModelScope

许可证

本项目基于 OnnxOCR 原始项目适配,遵循原始项目许可证。

引用

  • OnnxOCR
  • PaddleOCR
  • ModelScope - supersong/onnxocr_model