【少样本图像生成】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个小时。 细看的话还存在不少瑕疵,比如右边的男人图片有生成长发的错误。 再由于我个人需求,对动漫人物的生成做一下重点分析。这是对比了StyleGAN2和本文模型的效果,两个模型同样都训练了10个小时。粗看是没有什么问题的。然后是细节上的问题:两只眼睛颜色、大小会不一样(这个缺点我记得有一篇论文解决了,忘记是哪个了,之后补充一下。)头发和帽子也存在问题。根据作者公开的数据集,anime face数据集大小为120张512x512大小的图片。 然后是我人用了自己的数据集(399张相同动漫人物的图片),按照源代码的默认参数训练的模型。效果差强人意。训练了10000个迭代,每个迭代4 batch size。可以看到虽然每张图片都把人物的特点(帽子,帽子上的标,桃花,梅花眼)捕捉到了,但是人物却出现扭曲。如果要把这个模型适配到动漫人物,大概还需要参照其他模型做一下改变。 接下来就是技术上的部分了。
模型结构
整体网络结构包含一个generator,一个discriminator。作者对generator做了精简,在每一个分辨率只包含了一个卷积层,在大于512分辨率的高层只使用了3通道。这些都使得模型训练速度很快,而且也不大(G和D总共155MB)。
G中有一个创新结构——Skip-Layer channel-wise Excitation(SLE)模块。从名字来看,是残差块ResBlock里的skip-layer的变种,ResBlock可以让网络深度变得很深(网络太深会出现梯度消失\爆炸问题),但需要的计算资源较高。 看图,左边就是这个模块的网络结构。下面详细介绍一下: 这是ResBlock的结构。 对比Skip-Layer Excitation(SLE)模块和ResBlock,有几个区别:
- ResBlock最后是对两个特征图做的加法,而SLE做的是乘法。加法要求两个特征图分辨率相同,而乘法则没有这个要求,节约了大量计算。
- 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的问题?) 总体loss为(采用了hinge loss):
|