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

cv_rrdb_image-super-resolution on Ascend NPU

1. 简介

本文档记录 RRDBNet (RealESRGAN) 图像超分辨率模型在昇腾 NPU (Ascend 910B3) 上的迁移适配与精度验证结果。

RRDBNet 是 RealESRGAN 的核心生成器网络,采用 RRDB (Residual-in-Residual Dense Block) 架构,在模拟真实复杂降质的数据上训练,可以实现 4 倍图像超分辨率。

相关获取地址:

  • 权重下载地址(ModelScope):https://modelscope.cn/models/damo/cv_rrdb_image-super-resolution
  • 权重下载地址(HuggingFace Mirror):https://hf-mirror.com/damo/cv_rrdb_image-super-resolution
  • 论文:Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data

参考文档:

  • https://modelscope.cn/models/damo/cv_rrdb_image-super-resolution
  • 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,单卡推理
  • 模型大小:约 16.7M 参数,~67MB
  • 超分倍数:4x

3. 环境准备

3.1 创建 Conda 环境

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

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 addict datasets pyarrow \
    -i https://mirrors.huaweicloud.com/repository/pypi/simple \
    --trusted-host mirrors.huaweicloud.com

3.3 下载模型权重

# 使用 modelscope CLI
modelscope download --model damo/cv_rrdb_image-super-resolution \
    --local_dir ./cv_rrdb_image-super-resolution

# 或使用 HuggingFace 镜像
huggingface-cli download --resume-download \
    damo/cv_rrdb_image-super-resolution \
    --local-dir ./cv_rrdb_image-super-resolution \
    --local-dir-use-symlinks False

4. 推理验证

4.1 命令行推理

# CPU 推理
python inference.py --image input.jpg --output sr_cpu.png --device cpu

# NPU 推理
python inference.py --image input.jpg --output sr_npu.png --device npu

4.2 Python API 推理

from inference import run_inference
import cv2

# NPU 推理(4倍超分)
result = run_inference("input.jpg", device="npu")
cv2.imwrite("output.png", result["output"])
print(f"耗时: {result['time_ms']:.2f} ms")
print(f"输入: {result['input_shape']} → 输出: {result['output_shape']}")

4.3 验证结果

Smoke 测试使用 64x64 随机噪声图片:

  • CPU 推理:输出 256x256 超分图片,耗时 ~3700ms
  • NPU 推理:输出 256x256 超分图片,耗时 ~51ms
  • NPU 输出与 CPU 输出视觉一致,PSNR 高达 87.6 dB

5. 性能参考

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

指标CPUNPU (Ascend 910B3)加速比
平均耗时3707.32 ms51.30 ms72.27x
中位耗时3711.07 ms51.10 ms72.62x
最小耗时3611.80 ms50.49 ms71.53x
最大耗时3772.05 ms52.94 ms71.25x
标准差42.75 ms0.63 ms—

6. 精度评测

6.1 评测方法

对比 CPU (PyTorch) 与 NPU (torch_npu) 在同一 64x64 输入下的 4 倍超分输出:

  • 像素级误差:比较 256x256 输出图像的逐像素差异
  • 鲁棒相对误差:仅统计 |pixel| > 0.01 的有效像素值
  • PSNR:峰值信噪比,衡量输出图像质量的一致性

6.2 评测结果

指标数值
输入尺寸[1, 3, 64, 64]
输出尺寸[1, 3, 256, 256]
最大绝对误差0.000211
鲁棒平均相对误差0.0063%
鲁棒 P99 相对误差0.0197%
PSNR (CPU vs NPU)87.58 dB

6.3 精度结论

  • 鲁棒平均相对误差为 0.0063%,远低于 < 1% 的精度要求
  • PSNR 为 87.58 dB,远高于 > 40 dB 的质量要求
  • NPU 与 CPU 输出图像几乎完全一致(PSNR > 87dB 意味着差异在噪声水平以下)
  • 精度评测:通过

7. 适配说明

7.1 迁移要点

本模型基于 PyTorch 框架,通过 ModelScope pipeline 加载 RRDBNet 权重,使用 torch_npu 将模型迁移至 NPU。

核心适配步骤:

  1. 通过 ModelScope 加载 pipeline:pipeline(Tasks.image_super_resolution, model=model_dir)
  2. 获取生成器模型:model = sr.sr_model
  3. 将模型移至 NPU:model.to("npu:0")
  4. 将输入张量移至 NPU:tensor.to("npu:0")
  5. 推理后同步:torch.npu.synchronize()

无需修改模型结构或权重。RRDBNet 全部使用标准卷积、ReLU 等算子,NPU 可直接高效执行。

7.2 依赖说明

依赖用途
torch_npuAscend NPU 的 PyTorch 后端
modelscope模型加载与 pipeline 管理
opencv-python-headless图像读取与后处理
addictModelScope 配置解析
datasets / pyarrowModelScope 数据处理

7.3 注意事项

  1. NPU 内存:模型约 67MB,单次 64→256 推理占用约 2GB HBM。大尺寸输入(如 512→2048)需更多显存
  2. 输入格式:模型期望 RGB 三通道输入,像素值范围 [0, 1]
  3. 输出格式:输出为 4 倍超分 RGB 图像,像素值范围 [0, 1],需乘 255 并 clamp 后保存
  4. 首次推理:首次 NPU 推理有算子编译开销(约 10-30 秒),后续推理稳定在 ~51ms
  5. 精度极高:由于超分是回归任务(非分类),像素值连续,NPU 浮点计算差异极小,PSNR 高达 87.6 dB
  6. 输入尺寸:建议输入尺寸满足 mod_scale=4 的倍数要求,避免额外的 padding 开销