摘要这一篇主要介绍CycleGAN的相关知识. 包括该网络的原理和结构, 以及使用Pytorch来实现CycleGAN的例子.
简介
这一篇会介绍关于CycleGAN的相关内容. 主要分为两个部分.
我们首先会介绍CycleGAN的原理和结构
接着会使用Pytorch来实现CycleGAN, 主要实现三个例子, 分别是summer2winter, monet2photo和horse2zebra.
参考资料
下面是一些参考的资料(github上的一些链接).
A clean and readable Pytorch implementation of CycleGAN(我的实现主要是参考的这里的代码): PyTorch-CycleGAN
CycleGAN原理介绍
CycleGAN要解决的问题和结构
CycleGAN要解决的问题是这样的, 现在我们有两堆数据, 分别是Domain X和Domain Y(这两个数据之间不需要有一一对应的关系), 我们希望有一个生成器(转换器), 可以将Domain X的数据转换到Domian Y上面(或者是Domian Y转换到Domain X上面)
例如我们有下面的两堆数据, Domain X表示的是照片, Domian表示的是梵高的画作.
我们希望有一个生成器, 它可以将照片转换为梵高的画作(也就是将Domain X中的数据转换为Domain Y中的数据). 就如同下面的图中所表示的意思.
那么我们如何来训练这个生成器G呢, 于是最简单的, 我们想到了下面的方式来进行训练.
我们加上一个分类器D, 用来判断G生成的图像是否是Domian Y中的. 但是这么做会出现一个问题, 就是可能会出现不管输出什么到G, G的输出都是一张图片(一张Domain Y中的图片), 比如会出现下面这种情况, 生成的与输出的X完全不像.
但是我们希望输入和输出之间是有关系的, 于是我们有了CycleGAN的结构. 我们有生成器Gx->y, 将Domain X的数据转换为Domain Y的数据; 接着我们有生成器Gy->x, 将Domain Y的数据转换为Domain X的数据.
我们希望x与Gy->x(Gx-y(x))数据之间是相近的, 同时我们希望Gx-y(x)生成的数据可以被Dy分类器识别为属于Domian y的.
CycleGAN的局限性
CycleGAN是直接进行转换(direct transformation)的方法, 也就是图片不会进行encode之后再进行转换. 这样做会导致其实生成器生成前后的内容不会差太多.
所以我们一般会使用CycleGAN来进行风格转换之类的, 而不会直接进行图像的生成, 如头像的生成之类的工作.