paddleocr_classifier_onnx 是一个基于 ONNX 的 PaddleOCR 图像二分类模型,用于在 OCR 流水线中对文本图像进行分类(如方向分类、文本质量分类等)。模型输入为 RGB 图像,输出为 2 个类别的概率分布。
[batch, 3, height, width],动态尺寸[batch, 2],对应 2 个类别的未归一化分数本模型基于 ONNX Runtime 进行推理,利用 CANNExecutionProvider 在华为昇腾 NPU 上运行。CPU 和 NPU 使用同一套 ONNX 模型文件,通过切换 ONNX Runtime 的 execution provider 实现不同设备的推理。
# 安装依赖
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple onnx onnxruntime numpy Pillow opencv-python modelscope# 运行推理(CPU + NPU)
cd /opt/atomgit/output/paddleocr_classifier_onnx
python3 inference.py
# 运行精度对比
python3 compare_cpu_npu.py预测类别: 0,Logits: [0.942065, 0.057935]
预测类别: 0,Logits: [0.936035, 0.064209]
| 设备 | 耗时 (ms) | 加速比 |
|---|---|---|
| CPU | 1.71 | 1.0x |
| NPU | 0.55 | 3.1x |
核心代码:
import onnxruntime as ort
from PIL import Image
import numpy as np
# 加载模型
so = ort.SessionOptions()
session = ort.InferenceSession("classifier.onnx", so,
providers=["CANNExecutionProvider", "CPUExecutionProvider"])
# 预处理图像
img = Image.open(image_path).convert("RGB").resize((192, 48))
img_array = np.array(img, dtype=np.float32).transpose(2, 0, 1)
img_array = (img_array / 255.0 - 0.5) / 0.5
img_array = img_array[np.newaxis, :].astype(np.float32)
# 推理
outputs = session.run(["softmax_0.tmp_0"], {"x": img_array})
probs = outputs[0]
pred_class = int(np.argmax(probs, axis=1)[0])运行以下命令进行精度对比:
python3 compare_cpu_npu.py对比逻辑:
| 指标 | 数值 |
|---|---|
| Logits 最大绝对误差 | 0.00627352 |
| Logits 平均绝对误差 | 0.00615144 |
| 概率最大绝对误差 | 0.00255159 |
| 概率平均绝对误差 | 0.00255157 |
| Cosine Similarity | 0.99997502 |
| CPU 预测类别 | 0 |
| NPU 预测类别 | 0 |
| 分类结果一致 | ✓ |
精度测试结论:NPU 与 CPU 推理误差为 0.26%(基于概率平均绝对误差),符合精度误差小于 1% 的要求 ✓
| 指标 | CPU | NPU |
|---|---|---|
| 推理耗时 (ms) | 1.71 | 0.55 |
| 加速比 | 1.0x | 3.1x |
| 预测类别 | 0 | 0 |
| 输出形状 | (1, 2) | (1, 2) |
本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:
# NPU 推理
python3 inference.py --device npu
# CPU 推理
python3 inference.py --device cpu推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。
