本文的视频教程可点击下面链接:
https://www.bilibili.com/video/BV1h84y1q7Db
1. 任务介绍
1.1 任务场景
MindX SDK应用开发
1.2 任务描述
基于Atlas 200DK平台,使用MindX SDK,实现从真实世界图片到动漫风格图片的风格转换,在Ascend 310上对输入图片进行图像风格转换并将转换结果保存,支持动态分辨率输入。
1.3 任务目标
在Ascend 310上的推理精度与原模型精度相差小于1%。
1.4 环境信息
开发环境:Windows 11 + MindStudio 5.0.RC2
昇腾设备:Atlas 200DK
昇腾芯片:Ascend 310
操作系统:Ubuntu 18.04
环境依赖软件和版本如下表:
软件名称 | 版本 |
---|---|
cmake | 3.10.2 |
mxVision | 3.0.RC2 |
Python | 3.9.12 |
CANN | 5.1.RC2 |
GCC | 7.5.0 |
Python第三方库依赖如下表:
软件名称 | 版本 | 说明 |
---|---|---|
opencv-python | 4.6.0.66 | |
protobuf | 3.19.0 | |
scikit-image | 0.19.3 | 仅在eval.py中依赖,可选 |
2. 模型介绍
AnimeGAN是在2019年提出的用于图像风格迁移的模型,该模型基于GAN模型,可以快速地将真实世界的图像转换成高质量的动漫风格的图像,具体可参看论文:
https://link.springer.com/chapter/10.1007/978-981-15-5577-0_18
Tensorflow版本的代码:
https://github.com/TachibanaYoshino/AnimeGAN
我们也提供了已经转换好的模型以及一些测试数据集的OBS地址:
PB模型:
https://animegan-mxsdk.obs.cn-north-4.myhuaweicloud.com/models/AnimeGAN.pb
OM模型:
https://animegan-mxsdk.obs.cn-north-4.myhuaweicloud.com/models/AnimeGAN_FD.om
数据集:
https://animegan-mxsdk.obs.cn-north-4.myhuaweicloud.com/dataset/dataset.zip
3. 开发前准备
3.1 环境准备
首先安装好CANN和MindX SDK,具体可参考如下链接:
CANN安装指导:
https://www.hiascend.com/document/detail/zh/canncommercial/51RC2/overview/index.html
MindX SDK安装指导:
https://www.hiascend.com/document/detail/zh/mind-sdk/30rc2/overview/index.html
然后开始设置环境变量,在Ascend的安装目录和MindX SDK的安装目录可以分别找到set_env.sh,它们包含了MindX SDK App所需的大部分环境变量。我们可以打开它们查看内容并且运行脚本,也可以将它们加入~/.bashrc,以便每次进入bash时不用重新手动运行。
编辑bashrc,vi ~/.bashrc,在bashrc中应用这两个脚本,然后重启bash。
vi ~/.bashrc
# 在bashrc中加入以下两行并保存
source ${SDK安装路径}/set_env.sh
source ${CANN安装路径}/set_env.sh
# 保存后重启bash
bash
3.2 安装MindStudio
MindStudio的依赖项主要有CANN,若需开发MindX SDK应用,还需MindX SDK的支持。
如果准备在Linux环境使用MindStudio进行远程开发,则需要X Server支持。可以在安装好CANN和MindX SDK的Linux机器上安装MindStudio,后续通过MobaXterm等支持X11 Forwarding的终端远程连接。或者直接通过显示器连接Linux机器开发。
此处我们在Windows环境下开发。基于MindStudio的SDK应用开发环境搭建可以参考:
https://www.hiascend.com/document/detail/zh/mindstudio/50RC2/msug/msug_000086.html
4. 建立项目
4.1 新建MindX Application项目
进入到MindStudio的安装目录,选择bin目录下的MindStudio64.exe,打开MindStudio。
然后点击New Project,选择Ascend App,选择MindX SDK Project(Python),然后点击完成,项目就新建完毕了。
如果没有选中这些项目模板,则MindStudio的工具栏会默认缺少一些工具,或者工具不可用。因此新建项目请按照上述步骤。如果需要基于已有的项目,可以在打开已有项目后选择工具栏的Ascend>Convert To Ascend Project转换成MindX SDK App。
4.2 文件结构
一般的MindX SDK App应当至少包含如下文件:
main.py ---- 程序的主入口
model.om ---- om模型
model.pipeline ---- pipeline文件
本项目的具体结构如下图:
│ README.md
│ main.py # 主程序
| eval.py # 测量NPU生成图片与GPU框架生成图片的SSIM
| animegan.pipeline # pipeline文件
├─dataset
├─results
├─models
│ AnimeGAN_FD.om # 应用推理所需的om模型
├─plugins
│ ├─AnimeGANPostProcessor # AnimeGAN后处理插件
│ │ build.sh # 编译AnimeGAN后处理插件的脚本
│ │ CMakeLists.txt
│ │ AnimeGANPostProcessor.cpp
│ │ AnimeGANPostProcessor.h
5. 模型转换
5.1 准备模型文件
MindX SDK支持的模型格式是om模型,因此使用之前须进行模型转换。首先需要将Tensorflow的ckpt模型文件转换成pb文件,再使用转化工具将模型转化为om模型。
若下载我们在OBS提供的pb模型,则可以跳跃至5.4 模型转换阅读,如果使用了我们提供的om模型,则可以跳过本章, 但要注意我们的om模型支持的分辨率档位为长宽从384到1536,以128为基数递增的各种分辨率组合。
首先在https://github.com/TachibanaYoshino/AnimeGAN下载官方的源代码和ckpt模型文件。
5.2 确定输入、输出节点
为了模型转换,需要确定输入的Placeholder的name和输出节点的name。输入节点在后续步骤中,工具可以自动获取,但如果工具获取失败,还需在此步查看。
手工查看
打开官方源代码的中关于模型的代码net/generatir.py,查看Generator模型的输出节点。下例代码中的tanh节点,就是本模型的输出。节点的默认名称与其操作算子有关,比如tanh节点名称为Tanh,为了更方便定位该节点,可以给tanh节点自定义名称output,但是注意在最终使用时要加上节点的命名空间,即generator/G_MODEL/output。
然后打开test.py,查看输入的Placeholder节点。下例中名为test的placeholder就是本模型的输入,其支持动态分辨率,即图片的长和宽无需提前指定。
使用Tensorboard
除开直接查看源代码外,也可以使用tf.summary.FileWriter,在运行推理流程的同时保存日志,然后使用Tensorboard指定日志位置,查看网络图,确认输入和输出的节点。
将上面标蓝的代码插入到推理代码当中,然后运行一次推理流程,会将日志保存在./logs文件夹。在安装Tensorboard的环境中运行下面的命令,然后在Tensorboard提示的网页中打开,即可看到模型的网络图。
tensorboard --logdir=./logs
如上图,我们使用Tensorboard找到了名为generator/G_MODEL/output的输出节点。
5.3 PB固化
参照如下pb_frozen.py,编写PB固化脚本。
# pb_frozen.py
import tensorflow