StarGAN

转载自:http://www.360doc.com/content/18/0731/15/58279403_774675555.shtml

Abstract&Introduction

Existing approaches have limited scalability and robustness in handling more than two domains, since different models should be built independently for every pair of image domains. To address this limitation, reseachers propose StarGAN, a novel and scalable approach that can perform image-to-image translations for multiple domains using only a single model. Such a unified model architecture of StarGAN allows simultaneous training of multiple datasets with different domains within a single network.

our model takes in training data of multiple domains, and learns the mappings between all available domains using only one generator. The idea is simple. Instead of learning a fixed translation (e.g., black-to-blond hair), our model takes in as inputs both image and domain information, and learns to flexibly translate the input image into the corresponding domain. We use a label (e.g., binary or one-hot vector) to represent domain information. During training, we randomly generate a target domain label and train the model to flexibly translate an input image into the target domain. By doing so, we can control the domain label and translate the image into any desired domain at testing phase.

(作者们为每个 domain 都制作一个 label,类似 one-hot vector 那种感觉。并且在训练时随机生成 domain label,这样就能保证从多个不同数据集生成不同的 domain 的结果!p.s. 这不就是个多分类??)

如上图(b)所示,StarGAN允许来自不同域的多个数据集在同一个神经网络内并行训练,而其生成器也能充分利用来自5个域的图像特征。不同于直接提取图片信息,该方法首先会读取输入的图像和图像所在的域,之后将图像信息转化进相应的域,并用标签(binary或one hot vector)注明信息。当需要进行图像对图像转换时,StarGAN只需对照标签将图片输入目标域即可。

通过控制StarGAN的标签成功进行多个域、多个数据集之间的图像转换;

什么是StarGAN?

StarGAN是一个生成对抗网络,它由两部分组成:一个判定器D和一个生成器G。如下图所示:

扫描二维码关注公众号,回复: 3137367 查看本文章

当一真一假两组图像数据集输入模型后,判定器D首先负责从中归类出它认为是“真的”的特征,并放进一个相应的域类(domain classification)(图a)。随后,研究人员将测试图片和目标域(希望转化的方向)输入模型,由生成器G结合两者信息生成一幅“虚假”图像,再将“虚假”图像结合目标域输入模型训练(图b)。接收到新的输入信息后,生成器G根据目标域信息尝试把“虚假”图像还原成原始图像,并将重建的新图输入前一个步骤(图c)。判定器D根据生成器G传来的“虚假”图像,试图从中分离出和真实图片难以区分的特征,并归类到D的目标域(图d)。

模型训练

构建完StarGAN,研究人员进行了一系列训练实验,他们主要选取了两个数据集:CelebA和RaFD。

CelebA的全称是CelebFaces Attributes,它是香港中文大学汤晓鸥教授实验室公布的大型人脸识别数据集,包含202599张带注释的人脸图像及40余种人脸属性。研究人员将图片尺寸由178×218调整至128×128,并构建了7个域:头发颜色(黑色/金色/棕色)、性别(男/女)和年龄(年轻/年迈)。

StarGAN在CelebA中的训练情况

RaFD全称Radboud Faces Database,是一个包含有4824张图片的数据集,它内部可分为67类(包括高加索地区男性、女性、儿童及摩洛哥男性等),每一类都包含从3个角度捕捉到的8种面部表情。研究人员也对图像做了调整,他们从原图中截取了大小为256 × 256的脸部特写,将尺寸调整为128×128,并从中抽取10%的图像作为测试集,保留剩下的90%为训练集。

StarGAN在RaFD中的训练情况

所有模型都是用D. Kingma和J. Ba在2014年提出的Adam训练的,其中β1 = 0.5,β2 = 0.999。训练数据的批大小(batch size)均为16,当在CelebA中训练时,前10代的学习率为0.0001,它会在之后的10代线性衰减至0。而在RaFD中,为了弥补数据缺失,研究人员将前100代的学习率设为0.0001,并让其在后100代中线性衰减至0。整个训练在一个NVIDIA Tesla M40 GPU上进行,耗时约一天。

训练成果

为了凸显StarGAN的效果,研究人员设置了3个对照组:DIAT、CycleGAN和IcGAN。前两者都是跨领域模型,可用来比较模型在执行单一或多属性传输任务时的表现。它们采用的方法是多步骤转换,如在更换头发颜色后再改变性别。

CelebA训练成果,第一列为输入,其余列为输出。H:发色;G:性别;A:年龄

上图展示了各模型在CelebA上的训练成果。如图所示,和两个跨领域模型相比,StarGAN模型生成的图片质量更优,转换效果也更好,这很大程度上源于多任务学习框架的引入,使得神经网络并不是执行一个固定的转换操作,而能形成自然的过渡。

同时,和IcGAN相比,StarGAN模型生成的图像保留了更多面部特征,这可能是因为后者用卷积层激活地图来维护空间信息,并将之作为潜在信息,而前者则只是直接使用了一个低维潜在向量。

单一属性转换任务中各模型排名

多属性转换任务中各模型排名

研究人员在Amazon Mechanical Turk(AMT)上评估了4个模型的训练效果,具体排名如上两张表所示:StarGAN较其他方法有显著优势。在涉及多个属性转换的情况下,它能在模型训练中随机产生目标域标签,这使它能保留更多原有的面部特征。

之后,研究人员又在RaFD数据集中训练模型合成面部表情。在训练中,他们将8种不同表情定义为8个域,并把它们固定为“中性”表达式,当输入一个目标域后,这个域就成了一个“异类”,StarGAN要做的只是在一张“中性”人脸中加入特定面部表情。

RaFD训练成果,第一列为输入,其余列为输出

如上图所示,在所有参与实验的模型中,StarGAN训练的模型生成的图片最为清晰自然,它很好地保留了人脸的基础形象和面部特征。虽然DIAT、CycleGAN模型也保留了大部分脸部特点,但它们生成的图像都十分模糊。而IcGAN甚至无法保留原图像的基础信息,生成了一些男性图像。

表情合成任务中各模型出错率排名

在RaFD数据集中训练后,StarGAN模型生成图像的准确率高达99.55%。研究人员把成果导入AMT进行评估,发现它的分类错误率远低于其他三类模型。同时,DIAT和CycleGAN由于架构设计因素,一次只能学习1000张图片,而StarGAN则能同时学习所有4000余张图片,效率更高,模型性能也更好。上表第3列显示了各模型在进行一次图像对图像转换时所需的参数,DIAT需要7个,CycleGAN需要14个,而StarGAN由于只有一个生成器和一个判定器,在跨域转换的情况下,它只需选取1个特定参数就可在目标域内对图像做处理。

搞怪明星脸

... ...

结语

总而言之,这是一个伟大的创新,同时也是一个非常有趣的实践。研究人员在reddit上分享了自己的成果后,3天即收获过千的好评,并成功引起“GANs之父”Ian Goodfellow注意,后者在twitter上对论文做了倾情推荐。

较之以前的方法,StarGAN的扩展性更强、生成图片质量更高,它引入了一种多任务学习背后的泛化能力设置,同时提出用标签控制各个图像域。从原则上说,这个对抗生成网络能用于所有域之间图像到图像的转换。最后,据研究人员表示,未来他们的目标之一是把StarGAN应用到风格迁移上。

实现方法

Dependencies

实现可参考:https://github.com/yunjey/StarGAN

具体步骤

1.复制数据库

$ git clone https://github.com/yunjey/StarGAN.git$ cd StarGAN /

2.下载数据集

  • CelebA数据集

$ bash download.sh

  • RaFD数据集

由于不是公开数据集,可前往官网(搜RaFD或私信小编)请求访问。

获得数据集后,首先把它分为90%的训练集和10%的测试集,之后将图片中的人脸部分以面部为中心裁剪为256x256大小的图片,并以下图所示格式储存:

3.训练StarGAN

  • 在CelebA中训练

$ python main.py--mode = ' train '-- dataset = ' CelebA '-- c_dim = 5 --image_size = 128 --sample_path = ' stargan_celebA / samples '-- log_path = ' stargan_celebA / logs ' --model_save_path = ' stargan_celebA / models ' -- result_path = ' stargan_celebA / results '

  • 在RaFD中训练

$ python main.py--mode = ' train '-- dataset = ' RaFD '-- c_dim = 8 --image_size = 128 --num_epochs = 200 --num_epochs_decay = 100 --sample_step = 200 --model_save_step = 200 --sample_path = ' stargan_rafd / samples '-- log_path = ' stargan_rafd / logs ' --model_save_path = ' stargan_rafd / models ' -- result_path = ' stargan_rafd / results '

  • 用CelebA RaFD进行训练

$ python main.py--mode = ' train '-- dataset = ' Both '-- image_size = 256 --num_iters = 200000 --num_iters_decay = 100000 --sample_path = ' stargan_both / samples '-- log_path = ' stargan_both / logs ' --model_save_path = ' stargan_both / models ' -- result_path = ' stargan_both / results '

4.测试StarGAN

  • CelebA的面部特征迁移

$ python main.py--mode = ' test '-- dataset = ' CelebA '-- c_dim = 5 --image_size = 128 --test_model = ' 20_1000 ' --sample_path = ' stargan_celebA / samples '-- log_path = ' stargan_celebA / logs ' --model_save_path = ' stargan_celebA / models ' -- result_path = ' stargan_celebA / results '

  • RaFD上的面部表情合成

$ python main.py--mode = ' test '-- dataset = ' RaFD '-- c_dim = 8 --image_size = 128 --test_model = ' 200_200 '-- rafd_image_path = ' data / RaFD / test ' --sample_path = ' stargan_rafd / samples '-- log_path = ' stargan_rafd / logs ' --model_save_path = ' stargan_rafd / models ' -- result_path = ' stargan_rafd / results '

  • CelebA上的面部表情合成

$ python main.py\--mode = ' test '-- dataset = ' Both '-- image_size = 256 --test_model = ' 200000 ' \--sample_path = ' stargan_both / samples '-- log_path = ' stargan_both / logs ' \--model_save_path = ' stargan_both / models ' -- result_path = ' stargan_both / results '

猜你喜欢

转载自blog.csdn.net/jialibang/article/details/81303847