✿前言✿
本篇文章将在“星睿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
运行并记录所用的时间:
这里我为了不让图片很快跑完,用了比较大的图片,可能不太好对比:
输入图片:
输出图片:
这里我对输入和输出的图片分别做了裁剪,方便做对比:
输入图片(裁剪):
输出图片(裁剪):
✿利用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指令集支持:
从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
输入图片:
输出图片:
同样的,对输入和输出的图片分别做裁剪,方便做对比:
输入图片(裁剪):
输出图片(裁剪):
✿结语✿
此芯的“星睿O6”开发板在性能上相当足够去部署像waifu2x这样的超采样模型,尤其在利用了GPU或是NPU加速后,配合此芯强大的视频编解码器,即便拿来处理(upscale)整部的视频应该也不成问题。