【CANN训练营】Atlas 200I DK A2开发板基于AnimeGAN图像风格转换
代码仓地址
https://gitee.com/ascend/ascend_community_projects/tree/310B/AnimeGAN
环境
华为Atlas 200I DK A2
内存:4G
NPU:昇腾310B
软件方案介绍
基于MindX SDK的AnimeGAN风格转换模型的推理流程为:
首先使用openCV将待转换图片缩放至合适的分辨率档位,然后通过appsrc插件输入,然后使用图像解码插件mxpi_imagedecoder对图片进行解码,再通过图像标准化插件mxpi_imagenormalize将图片数据标准化到[-1,1],然后输入模型推理插件mxpi_tensorinfer,最后通过自定义的后处理插件anmieganpostprocess得到对推理结果进行后处理并保存。本系统的各模块及功能如表1所示:
表1 系统方案各模块功能描述:
序号 | 子系统 | 功能描述 |
---|---|---|
1 | 图片输入 | 调用MindX SDK的appsrc输入图片 |
2 | 图片解码 | 调用MindX SDK的mxpi_imagedecoder解码图片为RGB数据 |
3 | 图片标准化 | 调用MindX SDK的mxpi_imagenormalize将图片数据标准化到[-1,1] |
4 | 模型推理 | 调用MindX SDK的mxpi_tensorinfer对输入张量进行推理 |
5 | 后处理 | 调用自定义的后处理插件对模型推理输出映射回[0,255],转换成RBG数据并保存 |
环境准备
安装MindX
MindX下载地址:https://www.hiascend.com/zh/software/mindx-sdk/community
MindX SDK安装前准备可参考《用户指南》,安装教程:https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/quickStart/1-1安装SDK开发套件.md
Atlas 200I DK A2镜像烧录后系统里自带了mxVision-5.0-rc1,所以不需要安装新的
所在路径:/usr/local/Ascend/mxVision-5.0.RC1
环境依赖
推荐系统为ubuntu 22.04,环境依赖软件和版本如下表:
软件名称 | 版本 |
---|---|
cmake | 3.5.+ |
mxVision | 5.0.RC1 |
Python | 3.9.2及以上 |
CANN | Atlas200 DK使用6.3.RC1 Atlas200I DK A2使用6.2.RC1 |
gcc | 7.5.0 |
在运行项目前,需要设置环境变量:
MindSDK 环境变量:
source /usr/local/Ascend/mxVision-5.0.RC1/setenv.sh
CANN环境变量:
source /usr/local/Ascend/ascend-toolkit/set_env.sh
软件依赖
推理中涉及到Python第三方软件依赖如下表:
软件名称 | 版本 | 说明 |
---|---|---|
opencv-python | 4.6.0.66 | |
scikit-image | 0.19.3 | 仅在eval.py中依赖,用于测量GPU生成图片和NPU生成图片的SSIM |
CANN的安装包可以在CANN 社区版获取。
CANN的安装教程可以查看CANN安装(命令行)。
MindX SDK的安装包可以在mxVision 社区版获取。
MindX SDK的安装教程可以查看安装MindX SDK开发套件。
对于Python依赖,可以使用pip进行安装:
pip3 install opencv-python==4.6.0.66 scikit-image==0.19.3
克隆代码仓
git clone https://gitee.com/ascend/ascend_community_projects -b 310B
进入代码目录
cd ascend_community_projects/AnimeGAN
模型下载
wget https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/ascend_community_projects/AnimeGAN/AnimeGAN_model.zip --no-check-certificate
解压
unzip AnimeGAN_model.zip -d models/
文件目录机构如下
├─ AnimeGAN_model
│ ├─ om_models
│ │ ├─ 310
│ │ │ ├─ AnimeGAN_FD.om
│ │ ├─ 310B
│ │ │ ├─ AnimeGAN_FD.om
│ ├─ AnimeGAN.pb
如果想直接使用转换好的动态分辨率的om模型,请注意开发板类型:
- Atlas200 DK请使用310目录下的om模型
- Atlas200I DK A2请使用310B目录下的om模型
下载pb模型之后,将pb文件移至models目录下,准备转换为om模型。本文提供多档位和单挡位模型两种模型的转换命令,用户可以自行修改挡位。
文件夹下AnimeGAN.pb
为为转换过的原始模型,可以自己手动转换
转换注意事项:
运行命令前请格外注意以下说明
- 以下模型转换命令仅适用于Atlas200 DK开发板,如使用Atlas200I DK A2开发板则命令中的–soc_version的值应为310B1
- 多档位的模型转换命令设计的挡位过多导致模型过大,如果开发板配置较低的话,请减少挡位,或者使用单挡位模型,否则在模型转换和推理时都会有内存占用过多导致卡死等风险
- 模型输入图片的像素要严格按照模型的定义(单挡位模型要求严格等于,多档位模型要求严格在列举出的选择内),如果发生尺寸不同的情况,请修改挡位重新转换模型,或者裁剪和放大图片
模型转换命令
模型转换建议使用PC机转换,不一定需要有NPU,只要安装上CANN TOOLKIT即可
转化为具有多档位的动态分辨率模型:
atc --output_type="generator/G_MODEL/output:0:FP32" --input_shape="test:1,-1,-1,3" --out_nodes="generator/G_MODEL/output:0" --input_format=NHWC --output="models/AnimeGAN_FD" --soc_version=Ascend310B1 --dynamic_image_size="384,384;384,512;384,640;384,768;384,896;384,1024;384,1152;384,1280;384,1408;384,1536;512,384;512,512;512,640;512,768;512,896;512,1024;512,1152;512,1280;512,1408;512,1536;640,384;640,512;640,640;640,768;640,896;640,1024;640,1152;640,1280;640,1408;640,1536;768,384;768,512;768,640;768,768;768,896;768,1024;768,1152;768,1280;768,1408;768,1536;896,384;896,512;896,640;896,768;896,896;896,1024;896,1152;896,1280;896,1408;896,1536;1024,384;1024,512;1024,640;1024,768;1024,896;1024,1024;1024,1152;1024,1280;1024,1408;1024,1536;1152,384;1152,512;1152,640;1152,768;1152,896;1152,1024;1152,1152;1152,1280;1152,1408;1152,1536;1280,384;1280,512;1280,640;1280,768;1280,896;1280,1024;1280,1152;1280,1280;1280,1408;1280,1536;1408,384;1408,512;1408,640;1408,768;1408,896;1408,1024;1408,1152;1408,1280;1408,1408;1408,1536;1536,384;1536,512;1536,640;1536,768;1536,896;1536,1024;1536,1152;1536,1280;1536,1408;1536,1536" --framework=3 --model="models/AnimeGAN.pb" --precision_mode=force_fp32
转成单档位固定分辨率可使用如下命令:
atc --output_type="generator/G_MODEL/output:0:FP32" --input_shape="test:1,864,864,3" --out_nodes="generator/G_MODEL/output:0" --input_format=NHWC --output="models/AnimeGAN_864" --soc_version=Ascend310B1 --framework=3 --model="models/AnimeGAN.pb" --precision_mode=force_fp32
上述使用多档位动态分辨率模型转换命令的模型支持高从384以128为公差递增至1536,宽从384以128为公差递增至1536的分辨率组合。 使用单档位固定分辨率模型转换命令的模型支持(864,864)的分辨率。
如果在转换时使用的档位与上述命令不同,则需要对main.py的MAX_H,MIN_H,MAX_W,MIN_W,H_MULTIPLES,W_MULTIPLES参数进行修改。
对于单档位固定分辨率,可以给MAX_H和MIN_H赋于同样的固定的高,给MAX_W和MIN_W赋予同样的固定的宽,给H_MULTIPLES,W_MULTIPLES赋予1。
对于多档位动态分辨率,比如使用高从256以64为公差递增至512,宽从512以128为公差递增至1024的分辨率组合,可以分别给上述参数赋512,256,1024,512,64,128。
但是如果是不能用等差公式枚举的多档位分辨率组合,就需要用户自行重写main.py中的preprocess函数。
编译与运行
编译插件
bash plugins/AnimeGANPostProcessor/build.sh
# 运行脚本后,会在plugins/AnimeGANPostProcessor/lib/plugins下生成so文件
将该文件拷贝至MindX SDK的plugins目录中,注意插件文件权限应为640,否则运行时会报权限错误
cp plugins/AnimeGANPostProcessor/lib/plugins/libanimeganpostprocessor.so ${MX_SDK_HOME}/lib/plugins
修改权限
chmod 640 ${MX_SDK_HOME}/lib/plugins/libanimeganpostprocessor.so
下载数据集
本应用使用的数据集是使用的是原模型数据集(在github 的release界面中向下滑动找到dataset项,下载dataset.zip)提供的数据集中的dataset/test/HR_photo
HR_photo中的图片都是较大分辨率的图片,且分辨率不固定,所以要用裁剪工具将每个图片都裁剪成模型要求的像素大小。将裁剪后的图片拷贝进项目里的dataset/HR_photo
更改main.py
中的DATA_PATH
为图片所在的文件夹,若要使用自定义数据集也可自行修改DATA_PATH。
DATA_PATH = "dataset/HR_photo"
更改animegan.pipeline
中tensorinfer插件的modelPath为模型所在路径
"mxpi_tensorinfer0": {
"props": {
"dataSource": "mxpi_imagenormalize0",
"modelPath": "models/AnimeGAN_FD.om",
"waitingTime": "8000"
},
"factory": "mxpi_tensorinfer",
"next": "animeganpostprocessor0"
}
更改animegan.pipeline
中animeganpostprocessor插件的outputPath为输出文件夹路径,若该文件夹不存在,请先创建文件夹。若该文件夹中已有图片,请先清空。
"animeganpostprocessor0": {
"props": {
"dataSource": "mxpi_tensorinfer0",
"outputPath": "results/npu"
},
"factory": "animeganpostprocessor",
"next": "appsink0"
}
修改animegan.pipeline
中的deviceid
为0
"animegan": {
"stream_config": {
"deviceId": "0"
},
运行
运行前注意清空outputPath指定的输出路径里的图片,因为在测试时需要保证输出路径里的图片与测试参照组有一一对应的关系。
python main.py
- 点赞
- 收藏
- 关注作者
评论(0)