【少样本图像生成】Towards Faster And Stabilized GAN training for high-fidelity few-shot image synthesis

【少样本图像生成】TOWARDS FASTER AND STABILIZED GAN TRAINING FOR HIGH-FIDELITY FEW-SHOT IMAGE SYNTHESIS 论文阅读笔记

开源代码: https://github.com/odegeasslbc/FastGAN-pytorch

首先这篇文章会分析一下模型的效果,优缺点,然后再解释网络结构。

模型效果分析

从论文里的图来看,效果是很不错的。以下是用1024x1024像素在2080-Ti GPU上训练的,数据集大小1000.左边训练了20小时,右边训练了10个小时。
细看的话还存在不少瑕疵,比如右边的男人图片有生成长发的错误。
【少样本图像生成】Towards Faster And Stabilized GAN training for high-fidelity few-shot image synthesis_第1张图片
再由于我个人需求,对动漫人物的生成做一下重点分析。这是对比了StyleGAN2和本文模型的效果,两个模型同样都训练了10个小时。粗看是没有什么问题的。然后是细节上的问题:两只眼睛颜色、大小会不一样(这个缺点我记得有一篇论文解决了,忘记是哪个了,之后补充一下。)头发和帽子也存在问题。根据作者公开的数据集,anime face数据集大小为120张512x512大小的图片。
【少样本图像生成】Towards Faster And Stabilized GAN training for high-fidelity few-shot image synthesis_第2张图片
然后是我人用了自己的数据集(399张相同动漫人物的图片),按照源代码的默认参数训练的模型。效果差强人意。训练了10000个迭代,每个迭代4 batch size。可以看到虽然每张图片都把人物的特点(帽子,帽子上的标,桃花,梅花眼)捕捉到了,但是人物却出现扭曲。如果要把这个模型适配到动漫人物,大概还需要参照其他模型做一下改变。

接下来就是技术上的部分了。

模型结构

整体网络结构包含一个generator,一个discriminator。作者对generator做了精简,在每一个分辨率只包含了一个卷积层,在大于512分辨率的高层只使用了3通道。这些都使得模型训练速度很快,而且也不大(G和D总共155MB)。

G中有一个创新结构——Skip-Layer channel-wise Excitation(SLE)模块。从名字来看,是残差块ResBlock里的skip-layer的变种,ResBlock可以让网络深度变得很深(网络太深会出现梯度消失\爆炸问题),但需要的计算资源较高。
看图,左边就是这个模块的网络结构。下面详细介绍一下:
【少样本图像生成】Towards Faster And Stabilized GAN training for high-fidelity few-shot image synthesis_第3张图片
这是ResBlock的结构。
【少样本图像生成】Towards Faster And Stabilized GAN training for high-fidelity few-shot image synthesis_第4张图片
对比Skip-Layer Excitation(SLE)模块和ResBlock,有几个区别:

  1. ResBlock最后是对两个特征图做的加法,而SLE做的是乘法。加法要求两个特征图分辨率相同,而乘法则没有这个要求,节约了大量计算。
  2. SLE拥有分离style和content的性质,它的输入有两个大小不一样的特征图,如果把小一点的特征图改为style图片,就可以实现风格迁移。

然后我们再看G的整体结构,稍微对模型做一下修改,它就可以生成任意大小(局限于2的次方)的图片。

接着是基于自监督学习的Discriminator。
它的实现思路很简单,不过效果惊人(以我做实验的数据来看,只有部分细节差强人意):将D视作一个encoder,然后用一个小型decoder辅助训练。encoder从图片里提取特征,然后这些特征被输入到decoder里面要求根据特征重建图片。这样就可以迫使D学习到特征的准确性(训练的时候重建效果远好于G,有没有可能出现数据泄露的问题?)。
decoder也是从零开始训练的,它只用了重建损失做训练。(公式里,G(f)是decoder从D提取的特征图再重建的图片,T(x)是对real sample做处理,使其可以计算损失)
在这里插入图片描述
思路和CycleGAN是有一些像的,只是本文里额外用了一个小decoder重建,而不是用G。(这样做的效果也许是减轻了运算压力?)
下面是整体D的结构。
省去一些细节的部分,可以看到decoder是在16x16像素和8x8像素进行重建的,分别重建的是图片的局部和整体。下面有一张我训练得到的重建图,可以看到重建效果是很不错的。(有一个奇怪的点是Loss一直没下降,所以会不会是D的问题?)
【少样本图像生成】Towards Faster And Stabilized GAN training for high-fidelity few-shot image synthesis_第5张图片
【少样本图像生成】Towards Faster And Stabilized GAN training for high-fidelity few-shot image synthesis_第6张图片
总体loss为(采用了hinge loss):
在这里插入图片描述

你可能感兴趣的:(论文阅读,pytorch,深度学习,计算机视觉)