项目代码及数据链接见文末
没有配对图像能够进行图像生成吗?当然可以,CycleGan不需要配对的数据,例如,只要我们知道马的样子和斑马的样子,我们就能够很轻松的将马转化为斑马。
1.网络结构
传统GAN网络是,我们将图像输入到一个生成器网络中得到一个假的图像,然后再输入到判别器进行判别。
那么。传统GAN网络能不能做呢?很显然,并不能。对于输入的斑马来说,现在没有配对的马的图片,马的图片是完完全全不同的分布。这时候,我们需要从形态各异的斑马生成形态各异的马。这很可能导致模式崩塌问题。因此,我们可以采取一种新的方法,让斑马生成的马保持其原来的形态,这样就不容易导致模式崩塌问题了
那么现在怎么做呢?因此,我们可以结合翻译应该是“循环一致的”的性质,即如果我们翻译,例如,把一个句子从英语翻译成法语,然后把它从法语翻译回英语,我们应该返回到原来的句子。即我们现在既要让斑马转化成马,但是马的形态、场景保持不变,能够很好的返回斑马。
此时我们需要两对生成网络。Gab和Gba,GAB生成一个马。然后GBA进行还原,意思是,生成出的马必须进行限制,保持其原有的形态(动作都不变),同时要与马足够相似。
整体网络架构如下,网络由两对GAN组成,一个网络由马生成斑马,另一个网络由斑马变成马。
PatchGAN的原理
patchGAN的原理是,我们先使用卷积,将图像降维为N*N的矩阵,此时,矩阵每一个特征点就代表一个小区域。我们的标签也是N*N的矩阵,最后,我们计算N*N矩阵的损失(MSE损失)
2.项目简介
下载数据:Index of /cyclegan/datasets
将数据集下载到dataset文件夹中
下载预训练权重:Index of /cyclegan/pretrained_models
模型的测试
运行:text.py
python test.py --dataroot ./datasets/horse2zebra/testA --name horse2zebra_pretrained --model test --no_dropout
或者直接指定参数
效果由斑马生成马
模型的训练
运行train.py
指定参数
网络流程
在cycle gan中。我们需要训练两个GAN网络,每个GAN网络包含2个生成器和2个判别器
首先是训练判别器。
第一个GAN网络
- 首先由马生成斑马,进入判别器判别
- 然后由生成的斑马重新再生成马,进入判别器判别
第二个GAN网络
- 首先,由斑马生成马,进入判别器判别
- 再由生成的马重新生成斑马,进行判别器判别
identity loss
生成器损失
如果A2B网络是需要由马生成斑马,那么当我们之间输入斑马的时候呢?很显然,我们需要输出斑马本身,因此,当模型输入斑马的时候,我们也需要计算损失,希望生成图片与原图片足够相似。B2A也类似
然后由马生成斑马,计算一次损失,计算生成的斑马和真斑马之间的MSE损失,斑马还原为马,计算一次损失,计算还原的马和原来的马之间的损失。由斑马生成马也是如此。
判别器损失
在判别器网络中,期望真实图片输出概率为1, 假的图片输出概率为0。然后计算相应的判别器损失。
链接:https://pan.baidu.com/s/1sRzDaBek7unZhzldVuh0Yw?pwd=bw3o
提取码:bw3o