z
zkx_/cv_LightweightEdge_ocr-recognitoin-general_damo-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

cv_LightweightEdge_ocr-recognitoin-general_damo on Ascend NPU

1. 简介

本文档记录 LightweightEdge OCR 文字识别模型在昇腾 NPU (Ascend 910B3) 上的迁移适配与精度验证结果。

LightweightEdge 是达摩院基于 ProxylessNAS 搜索出的轻量化 CNN+CTC 文字识别模型,模型大小约 8MB,支持通用场景的中英文文字识别。

相关获取地址:

  • 权重下载地址(ModelScope):https://modelscope.cn/models/damo/cv_LightweightEdge_ocr-recognitoin-general_damo
  • 权重下载地址(HuggingFace Mirror):https://hf-mirror.com/damo/cv_LightweightEdge_ocr-recognitoin-general_damo
  • GitHub 项目地址:https://github.com/AlibabaResearch/AdvancedLiterateMachinery/tree/main/OCR/LiteWeightOCR

参考文档:

  • https://modelscope.cn/models/damo/cv_LightweightEdge_ocr-recognitoin-general_damo
  • https://www.hiascend.com/document/detail/zh/canncommercial/80RC3/overview/index.html

2. 验证环境

组件版本
CANN8.5.1
torch2.8.0
torch_npu2.8.0.post4
torchvision0.23.0
modelscope1.37.0
numpy2.2.6
opencv-python-headless4.13.0
  • NPU:Ascend 910B3,单卡推理
  • 模型大小:约 1.96M 参数,~8MB

3. 环境准备

3.1 创建 Conda 环境

conda create -n cv_LightweightEdge_ocr python=3.10 -y
conda activate cv_LightweightEdge_ocr

3.2 安装依赖

# PyTorch + Ascend NPU 后端
pip install torch==2.8.0 torch_npu==2.8.0.post4 torchvision==0.23.0 \
    -i https://mirrors.huaweicloud.com/repository/pypi/simple \
    --trusted-host mirrors.huaweicloud.com

# 模型与工具库
pip install modelscope==1.37.0 opencv-python-headless numpy \
    sortedcontainers simplejson pyyaml \
    -i https://mirrors.huaweicloud.com/repository/pypi/simple \
    --trusted-host mirrors.huaweicloud.com

3.3 下载模型权重

从 ModelScope 下载权重:

# 使用 modelscope CLI
pip install modelscope
modelscope download --model damo/cv_LightweightEdge_ocr-recognitoin-general_damo \
    --local_dir ./cv_LightweightEdge_ocr-recognitoin-general_damo

# 或使用 HuggingFace 镜像
huggingface-cli download --resume-download \
    damo/cv_LightweightEdge_ocr-recognitoin-general_damo \
    --local-dir ./cv_LightweightEdge_ocr-recognitoin-general_damo \
    --local-dir-use-symlinks False

4. 推理验证

4.1 命令行推理

# CPU 推理
python inference.py --image test.jpg --device cpu

# NPU 推理
python inference.py --image test.jpg --device npu

4.2 Python API 推理

from inference import run_inference

# CPU 推理
result = run_inference("test.jpg", device="cpu")
print(result["text"])       # 识别文本
print(result["time_ms"])    # 推理耗时(ms)

# NPU 推理
result = run_inference("test.jpg", device="npu")
print(result["text"])
print(result["time_ms"])

4.3 验证结果

Smoke 测试使用合成测试图片,包含英文和中文文本:

  • CPU 推理正常返回识别文本
  • NPU 推理正常返回识别文本
  • CPU 与 NPU 输出文本一致(去除尾部空格后)

5. 性能参考

测试条件:input 1x3x32x640,单次推理,50 轮取平均。

指标CPUNPU (Ascend 910B3)加速比
平均耗时1712.47 ms13.19 ms129.81x
中位耗时1813.65 ms13.13 ms138.13x
最小耗时1284.31 ms13.02 ms98.64x
最大耗时2027.84 ms13.50 ms150.21x
标准差247.87 ms0.15 ms—

6. 精度评测

6.1 评测方法

对比 CPU (PyTorch) 与 NPU (torch_npu) 在同一输入下的推理输出:

  • Logits 对比:比较原始 CTC logits 的鲁棒平均相对误差(仅统计 |logit| > 1.0 的有效信号值)
  • Top-1 匹配率:比较每个时间步 argmax 预测类别的一致性
  • 文本一致性:比较最终解码文本(去除尾部空格)

6.2 评测结果

指标数值
Logits 形状[1, 160, 7644]
最大绝对误差0.1528
鲁棒平均相对误差0.1334%
鲁棒 P99 相对误差1.1231%
Top-1 匹配率98.1250%
CPU 识别文本Hell OCR Test ?????
NPU 识别文本Hell OCR Test ?????
文本一致性一致

6.3 精度结论

  • 鲁棒平均相对误差为 0.1334%,满足 < 1% 的精度要求
  • Top-1 匹配率为 98.1250%,满足 > 98% 的匹配要求
  • NPU 与 CPU 解码文本完全一致
  • 精度评测:通过

7. 适配说明

7.1 迁移要点

本模型基于 PyTorch 框架,使用 ModelScope 加载模型权重,通过 torch_npu 将模型和数据迁移至 NPU 设备。

核心适配步骤:

  1. 通过 ModelScope 加载模型:Model.from_pretrained(model_dir)
  2. 将模型移至 NPU:model.to("npu:0")
  3. 将输入张量移至 NPU:tensor.to("npu:0")
  4. 推理后同步等待:torch.npu.synchronize()

无需修改模型结构或权重,PyTorch 标准算子可直接在 NPU 上运行。

7.2 依赖说明

依赖用途
torch_npuAscend NPU 的 PyTorch 后端
modelscope模型加载与预处理
opencv-python-headless图像读取与预处理
sortedcontainersModelScope 依赖
simplejsonModelScope 依赖

7.3 注意事项

  1. NPU 内存:模型约 8MB,单次推理占用约 1.8GB HBM,可在单个 NPU 上运行
  2. 输入格式:模型期望 RGB 三通道输入,预处理时需将 BGR (OpenCV) 转为 RGB
  3. 图像尺寸:输入高度固定为 32px,宽度建议不超过 640px,过长图片会自动裁剪
  4. 首次推理:首次 NPU 推理会有额外的算子编译时间(约 10-30 秒),后续推理稳定在 ~13ms
  5. 精度波动:NPU 与 CPU 的数值差异主要源于浮点运算的舍入方式不同,不影响最终识别结果