编译:Bot
来源:arXiv
编者按:近日,高丽大学、Clova AI Research、新泽西大学和香港科技大学共同发表了一项新成果:一个可以在多域图像间实现图对图转换的统一生成对抗网络——StarGAN。他们在论文中展示了大量StarGAN在人脸上的成功应用,证明它不仅能调整图像中的发色、肌理、肤色、性别,还能合成各种生动有趣的表情。
第一列和第六列为输入图像,其余列均为StarGAN生成图像。该模型在RaFD数据集中训练得到新数据集CelebA,并用单个生成网络产生了各种人脸,其中面部表情标签来自RaFD
以下是论智对论文部分内容的编译:
最近的研究显示,学界已经在两个域图像到图像转换上取得了长足进展,但是,这些方法在可扩展性和鲁棒性上仍有诸多局限,且效率低下。当需要对k个域上的图片进行图像转换时,现有模型需要事先训练好k(k−1)生成器。如下图(a)所示,只有当12个生成器都完成训练,该模型才能实现转换,同时,模型虽然能习得4个数据集的所有特征,但生成器得到的只是两个域的特征信息,因此它无法对整个数据集做到充分、合理利用。
左:cross-domain模型;右:StarGAN
为了解决这一问题,团队提出了StarGAN,一种可扩展的、只用一个模型就能执行多个域图片到图片转换任务的方法。如上图(b)所示,StarGAN允许来自不同域的多个数据集在同一个神经网络内并行训练,而其生成器也能充分利用来自5个域的图像特征。不同于直接提取图片信息,该方法首先会读取输入的图像和图像所在的域,之后将图像信息转化进相应的域,并用标签(binary或one hot vector)注明信息。当需要进行图像对图像转换时,StarGAN只需对照标签将图片输入目标域即可。
实验证明,这种方法拥有更强的灵活性和可扩展性,它生成图片的质量与现有方法相当,在面部特征有效迁移和面部表情合成上的表现也十分出色。
综观全文,团队的工作主要有以下3点:
提出StarGAN,一个只用一对生成器和判别器就能实现多个域之间映射的对抗生成网络,且能对各个域的图像进行有效训练;
演示如何通过控制StarGAN的标签成功进行多个域、多个数据集之间的图像转换;
利用StarGAN生成了数量庞大、质量上乘的人脸图像(包括面部元素迁移和表情合成),证明这是一种优质的基准模型。
什么是StarGAN?
StarGAN是一个生成对抗网络,它由两部分组成:一个判定器D和一个生成器G。如下图所示:
当一真一假两组图像数据集输入模型后,判定器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上的训练成果。如图所示,和两个跨领域模型相比,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应用到风格迁移上。
实现方法
环境
Python 2.7或3.5+
PyTorch 0.2.0
TensorFlow 1.3+(可选张量版)
具体步骤
1.复制数据库
$ git clone https://github.com/yunjey/StarGAN.git
$ cd StarGAN /
2.下载数据集
CelebA数据集
$ bash download.sh
RaFD数据集
由于不是公开数据集,可前往www.socsci.ru.nl:8180/RaFD2/RaFD?p=main请求访问。
获得数据集后,首先把它分为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 '
论文地址:arxiv.org/pdf/1711.09020.pdf
github地址:github.com/yunjey/StarGAN