starGAN是Yunjey Choi等人于17年11月提出的一个模型。该模型可以实现 图像的多域间的迁移(作者在论文中具体应用于人脸属性的转换)。
在starGAN之前,也有很多GAN模型可以用于image-to-image,比如pix2pix(训练需要成对的图像输入),UNIT(本质上是coGAN),cycleGAN(单域迁移)和 DiscoGAN。
而starGAN使用一个模型实现多个域迁移,这在其他模型中是没有的,这提高了图像域迁移的可拓展性和鲁棒性。
下图展示了传统GAN在域迁移中的做法和starGAN的做法的区别:
左边是传统的GAN,右边是starGAN,传统的域迁移需要对不同的两个域之间相互进行特征提取,这样就导致只有k个域的情况下却要k(k-1)个生成器。而starGAN则解决了这个问题,自始至终只需要一个生成器。
下面是作者在CelebA和RaFD两个人脸数据集上进行发色,性别,表情等属性转化的效果。
【文章链接】:
https://arxiv.org/pdf/1711.09020.pdf
【参考代码 - TensorFlow】:
https://github.com/taki0112/StarGAN-Tensorflow
【参考解读】:
[1] 对抗生成网络学习(十五)——starGAN实现人脸属性修改(tensorflow实现)
StarGAN包含鉴别器D和生成器G两个部分。
鉴别器D学习去辨别真实图像和生成图像,以及对图像进行所属域的分类(两个输出)。生成器接受图像和目标域标签,生成假的图像(两个输入)。其中 目标域标签是空间重复的,和输入图像相连接。
参考了 CycleGAN
,starGAN的生成器包含2个卷积层(下采样的步长设置为2),6个残差层,2个反卷积层(上采样的步长设置为2),生成器中还使用了 归一化(instance normalization)。判别器则采用 PatchGAN
的结构,它可以对局部图像块进行真假分类,但没有使用归一化层。
前面也提到过,模型中是需要输入标签c的,实际上作者在做的时候,标签c是以 one-hot编码 表示的,作者将此输入称为mask vector。
为了保证生成图像的真实性,采用了对抗损失。Dsrc(x)是D给出的源域上的概率分布。
生成器G试图将这个目标最小化,即尽可能缩小自己生成的数据与真实数据的差别,让 D 真假难别;而鉴别器D试图将它最大化,即尽可能正确地识别出真实数据和 G 伪造的数据。
为了防止模型倒塌,作者还 借鉴了 WGAN
的思想,对 adversarial loss (对抗损失)进行了改进(WGAN的原理再回顾一下)。
为实现图像域的准确转换,starGAN 在判别器的顶部引入了一个复杂的辅助分类器。在同时优化G和D的同时,添加了一个域分类损失。
判别器的训练目标为将真实图像的域分类损失最小化,以学习真实图像的正确分类;生成器的训练目标为将生成图像的域分类损失最小化,使得生成的图像能够被分类为目标域。
所谓Reconstruction Loss (重构损失),其实就是CycleGAN中的cycle consistency loss(循环一致性损失)。
最小化上述两种loss并不能保证保留输入图像上与域转换无关的内容不变,只改变与域转换相关的部分,所以在模型中的生成器引入了重构损失。
即使用两次生成器,将原始图像转换为目标域中的图像,然后从转换后的图像重建原始图像,最后比较原始图和重构图的L1正则化距离。
作者将StarGAN与最近的面部属性转换方法进行比较。此外,作者还对面部表情合成进行分类实验。最后证明了StarGAN可以从多个数据集中学习到图像到图像的转换。
选择了以下的模型作为对比基准——
CelebA。CelebFaces Attributes (CelebA)数据集包含202,599张 名人的面部图像,每个图像都带有40个二进制属性。我们将最初的178×218大小的图像裁剪为178×178,然后将其大小调整为128×128。我们随机选取2000张图像作为测试集,并使用所有剩余的图像作为训练数据。
RaFD。Radboud Faces Database (RaFD)由来自67名参与者的4824张(67x24x3) 图像组成。每个参与者在三个不同的注视方向做出八种面部表情。作者将面居中的图像裁剪为256×256,然后将其大小调整为128×128。
所有模型训练都采用β1 = 0.5,β2 = 0.999的Adam优化器。为了增加数据,我们以0.5的概率水平翻转图像。在五次鉴别器更新之后执行一次生成器更新。所有实验的batch size设置为16。
在CelebA上的实验中,我们在前10个epoch中以0.0001的学习率训练所有模型,并在接下来的10个epoch中将学习率线性衰减为0。
为了弥补数据的不足,当使用RaFD训练时,我们以0.0001的学习率训练100个epoch的所有模型,并在接下来的100个epoch中应用相同的衰减策略。
待补充