【CANN训练营】基于MindSpore的CycleGAN介绍和实现

举报
Tianyi_Li 发表于 2022/08/14 13:58:24 2022/08/14
【摘要】 我们这次介绍下著名的CycleGAN,图像翻译模型,由两个生成网络和两个判别网络组成,通过非成对的图片将某一类图片转换成另外一类图片,可用于风格迁移。同时提供了基于MindSpore的代码,方便大家运行验证。

前言

我们这次介绍下著名的CycleGAN,同时提供了基于MindSpore的代码,方便大家运行验证。

CycleGAN的介绍

CycleGAN图像翻译模型,由两个生成网络和两个判别网络组成,通过非成对的图片将某一类图片转换成另外一类图片,可用于风格迁移,效果演示如下图所示:

image.png

CycleGAN是GAN的一种,那什么是GAN呢?

生成对抗网络(Generative Adversarial Network, 简称GAN) 是一种非监督学习的方式,通过让两个神经网络相互博弈的方法进行学习,该方法由lan Goodfellow等人在2014年提出。生成对抗网络由一个生成网络和一个判别网络组成,生成网络从潜在的空间(latent space)中随机采样作为输入,其输出结果需要尽量模仿训练集中的真实样本。判别网络的输入为真实样本或生成网络的输出,其目的是将生成网络的输出从真实样本中尽可能的分辨出来。而生成网络则尽可能的欺骗判别网络,两个网络相互对抗,不断调整参数。 生成对抗网络常用于生成以假乱真的图片。此外,该方法还被用于生成影片,三维物体模型等。

好了,我们已经对GAN有了大体的了解,下面说回CycleGAN。

CycleGAN由两个生成网络和两个判别网络组成,生成网络A是输入A类风格的图片输出B类风格的图片,生成网络B是输入B类风格的图片输出A类风格的图片。生成网络中编码部分的网络结构都是采用convolution-norm-ReLU作为基础结构,解码部分的网络结构由transpose convolution-norm-ReLU组成,判别网络基本是由convolution-norm-leaky_ReLU作为基础结构,详细的网络结构可以查看network/CycleGAN_network.py文件。生成网络提供两种可选的网络结构:Unet网络结构和普通的encoder-decoder网络结构。生成网络损失函数由LSGAN的损失函数,重构损失和自身损失组成,判别网络的损失函数由LSGAN的损失函数组成。

CycleGAN最经典的地方是设计和提出了循环一致性损失。以黑白图片上色为例,循环一致性就是:黑白图(真实)—>网络—>彩色图—>网络—>黑白图(造假)。为了保证上色后的彩色图片中具有原始黑白图片的所有内容信息,文章中将生成的彩色图像还原回去,生成造假的黑白图,通过损失函数来约束真实白图和造假黑白图一致,达到图像上色的目的。除此之外,CycleGAN不像Pix2Pix一样,需要使用配对数据进行训练,CycleGAN直接使用两个域图像进行训练,而不用建立每个样本和对方域之间的配对关系,这就厉害了,一下子让风格迁移任务变得简单很多。

看一下CycleGAN的网络结构图:

image.png

如果想了解更多详情,可以阅读CycleGAN的原论文,推荐读一读,会有更深刻和更清楚的理解,下面给出链接:

https://arxiv.org/abs/1703.10593)

CycleGAN的实现

代码和数据集

这里我提供了一个包含代码和数据集的仓库链接:https://git.openi.org.cn/tjulitianyi/CycleGAN_MindSpore,但是更建议使用最新版本代码,见下方特别说明。

特别说明:我们将在华为云ModelArts的NoteBook,基于MindSpore-GPU 1.8.1 运行CycleGAN的代码,因为云环境的更新不确定性,所以运行可能会报错,这时可以参考如下最新代码:https://gitee.com/mindspore/models/tree/master/research/cv/CycleGAN。

需要提醒大家的是,必须需要使用MindSpore 1.8.0以及以上的版本,之前版本会报错,因为某些API不支持。而最新的1.8.1版本有时也会报错,报错信息如下,怀疑可能是代码的设置有些问题:

image.png

目前ModelArts最高支持到MindSpore 1.7,我们需要自行安装最新的MindSpore 1.8.1版本。

先来看看我使用的NoteBook环境:

image.png

这里特别提醒大家,NoteBook是要花钱的,我选择的单卡Tesla V100大约每小时28元,也有更便宜的,大概每小时8元的单卡Tesla P100,请大家根据自身情况选择,千万注意使用情况,别欠费了。

准备环境

下面进入NoteBook,打开一个Terminal:

image.png

先来看看我们的显卡信息和CUDA Version:

image.png

我们看到CUDA Version是10.2,下面到MindSpore官网看看安装教程,我们需要安装MindSpore 1.8.1,但是没有CUDA 10.2对应的版本,这里就选择就近的CUDA 10.1版本了。

image.png

在Terminal执行如下命令:

pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.8.1/MindSpore/gpu/x86_64/cuda-10.1/mindspore_gpu-1.8.1-cp37-cp37m-linux_x86_64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple

下载速度很快,安装速度也是非常快:

image.png

最后运行显示如下信息,表示安装成功了:

image.png

获取代码

接下来下载代码,执行如下命令(由于要下载整个仓库,时间有点长):

git clone https://gitee.com/mindspore/models.git

命令运行截图:

image.png

下面我们将感兴趣的CycleGAN代码拷贝到当前目录下,执行如下命令:

cp -r models/research/cv/CycleGAN/ ./

准备数据集

下面进入CycleGAN目录:

cd CycleGAN

image.png

我们这里使用的是monet2photo数据集,由于直接在ModelArts的NoteBook下载速度很慢,所以建议大家下载到本地,再上传到NoteBook的CycleGAN/data目录下,下载链接为:https://s3.openi.org.cn/opendata/attachment/7/b/7beb4534-6e79-463e-a7c6-032510bab215?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=1fa9e58b6899afd26dd3%2F20220814%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220814T085624Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B filename%3D"monet2photo.zip"&X-Amz-Signature=20fbfd9c798701efcbf21d811f3dfdd6b8d5744f388c799bc38715f7fe78c783

上传完成后,解压数据集即可。我的运行截图如下图所示:

image.png
image.png

启动训练

注意,请在CycleGAN的目录下启动训练,如下图所示:

image.png

我是在GPU下的单卡训练,所以启动训练的命令为:

python train.py --platform GPU --device_id 0 --model ResNet --max_epoch 200 --dataroot ./data/monet2photo/ --outputs_dir ./outputs

运行截图为:

image.png

可以看到已经成功启动训练,打印出loss,此时我是用的Tesla V100显卡大约占了4GB显存,利用率接近100%,此时来看不适合用Tesla V100来跑,未能发挥其大显存的优势,而其计算能力其实一般。CycleGAN模型训练比较费时间,请注意花费,预计完成全部200epoch的训练需要72小时以上。

评估模型

python eval.py --platform GPU --device_id 0 --model ResNet --G_A_ckpt ./outputs/ckpt/G_A_200.ckpt --G_B_ckpt ./outputs/ckpt/G_B_200.ckpt

注意,这里的.ckpt模型名称,请根据实际训练生成的具体轮数的模型名称太难写,比如目前只保存了20epoch的模型,那上述命令的200就应该改成20

更多命令或适配其他硬件平台和多卡情况,可参考scripts文件夹下脚本。

结语

我们简单介绍了著名的CycleGAN,给出了基于MindSpor的完整代码,并带着大家跑了一遍,目前有些问题,后续会更新。作为经典的GAN的一种,CycleGAN有很多值得我们学习的地方,还需要深入分析挖掘,以鉴今事。

关于代码运行的问题,可以到官仓提交issue求助,下为链接:
https://gitee.com/mindspore/models/issues

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200