ax+by+c=0 · 2 天前

【“星睿O6”AI PC开发套件评测】图像超采样模型waifu2x的部署以及利用GPU进行加速

✿前言✿

本篇文章将在“星睿O6”开发板上部署并运行waifu2x模型,由于我弄不到此芯的NPU编译器cixbuilder,在这里我暂时先跳过该模型在NPU上的部署环节。

✿waifu2x模型简介✿

Waifu2x 是一个基于深度学习的图像放大和降噪工具,最初由日本开发者 nagadomi 开发。它特别适用于二次元(动漫风格)图像的处理,因此被称为 “Waifu2x”。

  • Waifu2x 能将图像放大 2 倍甚至更多,并尽可能保留细节,避免传统插值方法产生的模糊或锯齿。
  • Waifu2x可以对图像进行去噪处理,尤其对扫描图、压缩图或低质量图像有显著提升效果。
  • Waifu2x 使用深度卷积神经网络(CNN)来学习图像的特征和噪声模型,使得其在动漫风格图像上的表现非常出色。

✿原生(CPU)部署并运行waifu2x-onnx模型✿

首先到模型作者的github上获取一下onnx模型文件

wget https://github.com/nagadomi/nunif/releases/download/0.0.0/waifu2x_onnx_models_20250502.zip

这里使用cunet 不使用降噪、scale2倍的模型作为示例noise0_scale2x.onnx

接着创建一个python虚拟环境:

python3 -m venv waifu2x

切换到创建的虚拟环境:

source waifu2x/bin/activate

安装所需要的依赖库:

pip install onnxruntime numpy opencv-python

编写一个简单的Python脚本:

import onnxruntime as ort
import numpy as np
import cv2

# Load the image
input_img = cv2.imread("input.png", cv2.IMREAD_COLOR).astype(np.float32) / 255.0  # Normalize to [0, 1]
input_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2RGB)  # Convert to RGB
input_img = np.transpose(input_img, (2, 0, 1))  # Change to CHW format
input_img = np.expand_dims(input_img, axis=0)  # Add batch dimension

# Create ONNX session
session = ort.InferenceSession("noise0_scale2x.onnx")

# Get input/output names
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name

# Run inference
output = session.run([output_name], {input_name: input_img})[0]

# Postprocess the output
output_img = np.squeeze(output)  # Remove batch dim
output_img = np.transpose(output_img, (1, 2, 0))  # CHW to HWC
output_img = (output_img * 255.0).clip(0, 255).astype(np.uint8)
output_img = cv2.cvtColor(output_img, cv2.COLOR_RGB2BGR)

# Save the result
cv2.imwrite("output.png", output_img)

给编写完的python脚本加上可执行权限(不严格意义上需要):

chmod +x ./waifu_onnx.py

运行并记录所用的时间:

onnx.png

这里我为了不让图片很快跑完,用了比较大的图片,可能不太好对比:

输入图片:

input.png

输出图片:

output.png

这里我对输入和输出的图片分别做了裁剪,方便做对比:

输入图片(裁剪):

input_c.png

输出图片(裁剪):

output_c.png

✿利用GPU加速waifu2x✿

➤ncnn简介

ncnn 是一个由 腾讯优图实验室(Tencent Youtu Lab) 开发的 高性能神经网络前向推理框架,特别针对 移动设备和边缘设备 做了高度优化。它是一个 纯 C++ 实现、跨平台、无第三方依赖 的轻量级深度学习框架,适用于 Android、iOS、Windows、Linux 等平台。

  • 支持从 Caffe、ONNX、Pytorch(通过 ONNX 导出)等模型格式转为 ncnn 支持的 .param + .bin 文件。
  • 支持多种芯片架构:ARM、x86、MIPS。
  • 针对 ARM CPU 使用 NEON 加速;
  • 支持 Vulkan GPU 后端(即 ncnn-vulkan),极大提升推理效率。

➤部署并运行基于ncnn以及vulkan后端的waifu2x模型

在这里为了方便,跳过模型转换过程,直接选择使用nihui大佬的ncnn构筑版本:

git clone https://github.com/nihui/waifu2x-ncnn-vulkan.git
git submodule update --init -r

此构筑版本会利用vulkan作为后端进行GPU加速。

生成Makefile:

cmake -B build .

检测到了ARM NEON指令集支持:

neon.png

从Makefile构建:

cmake --build . -j 12

使用相同的图片作为输入,运行并记录所用的时间。为了和前面match,这里降噪等级设置为0,upscale设置为2倍:

time ./waifu2x-ncnn-vulkan -m ../../models/models-cunet/ -i ../../../input.png -o ../../../output_vulkan.png -n 0 -s 2

ncnn_vulkan.png

输入图片:

input.png

输出图片:

output_vulkan.png

同样的,对输入和输出的图片分别做裁剪,方便做对比:

输入图片(裁剪):

input_c.png

输出图片(裁剪):

output_vulkan_c.png

✿结语✿

此芯的“星睿O6”开发板在性能上相当足够去部署像waifu2x这样的超采样模型,尤其在利用了GPU或是NPU加速后,配合此芯强大的视频编解码器,即便拿来处理(upscale)整部的视频应该也不成问题。

推荐阅读
关注数
1456
内容数
37
搭载安谋科技“周易”NPU的此芯AI PC开发套件瑞莎星睿O6开发板文档、活动及评测等专栏,加开发者群请添加极术小姐姐(id:aijishu20))。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息