一张图片换脸
Few-Shot Adversarial Learning of Realistic Neural Talking Head Models
Github 地址:https://github.com/grey-eye/talking-heads
摘要
说话图像合成的效果,使用在不同视频顺序相同人抽取的landmarks(左边),和使用不同人的landmarks(右边)。结果依赖于从目标画面提取出的landmark,源画面是从训练集中的例子。模型左边训练使用了8张图,但是右边训练使用了一个one-shot规则。
最近很多工作专注于如何使用卷积网络生成高质量的真实人类图像,为了获取单个人的talking model需要大量的这个人的图片。然而现实场景却是,模型训练急需较少的图片生成,甚至是一张图片。文中模型给予了实现小数据集训练模型的能力,模型在大量视频上元学习,并且之后可以使用较少的图片以及one-shot学习以往没有见过的人就像一个强力的对抗训练问题,拥有一个生成器以及判别器。 关键之处在于,这个系统能够针对每个不同的个体定制生成器与判别器的模型初始化方式。所以训练只需要少量的图片以及较短的时间。甚至需要优化上百万的参数。这个模型能够较好的展示,talking head 甚至油画也可以。
简介
当前来说图像生成talking head的难度主要有两个原因,第一个,人类头部图像,光学、几何学、运动学。复杂问题不单单来源于人脸建模,而且来源于嘴型,头发和服装。第二个因素是,人类视觉系统的敏锐性,哪怕头部极小的错误也能够发现。
目前人脸转化的纺射算发有很多,纺射系统对于,一张图片,大量情绪,头部旋转,以及遮挡,都是不能解决的。
卷积对抗网络的出现,让图片变成现实有了希望,目前也存在一个较好的算法【17,21,39】,然而这些方法需要训练较大的神经网络,对于每个talking head生成器和判别器的参数数量达到千万级别,这些模型需要较长的视频或者大量的图片,以及数小时的GPU训练.
本文展示一个图片现实化的模型,并且有较少的训练时间,并且结果可以根据单一图片生成一个比较合理的结果,当增加图片的时候将会得到更好的效果,这个模型合成video画面一系列的卷积算法实现的,而不是使用的warp,本文模型可以解决大量的姿态,而这时warp模型所不能比拟的。
Few-shot模型获取通过额外的与训练(元学习)在大量的含有不同演讲者的视频中,元学习中模型仿真few-shot learning任务,然后转换关键点位置到真实的人脸图片,使用一个人的小训练集合。之后当有一个新人的时候,新人只需要使用在元学习与训练好的模型中训练,新的对抗问题概括了生成真实与原始图片的状态,所以训练起来特别快。
在大量实验中 将文中的结果与其他网络结果进行对比,文中的模型具有较大的优势,首先介绍一下模型的应用,包括视频合成
相关工作
当前很多的工作关注与人脸表面,但是对衣服、嘴巴、脖子并没有太多办法,有些工作将这些面部转换到已经存在的视频中。但是这样的设计并不能完全控制头的转动。
文中模型的设计借鉴很多有关图像的工作,例如,条件判别器,项目判别器,元学习阶段使用了Adain结构,这种结构是有效的的,在大量的条件生成任务中,并且发现内容风格分解能够很好的隔离纹理和体态。
元学习获得图像分类的初始状态,使用极少的数据可以很快的将没有见过的图像分类出。这种学习方式也迁移到本文的模型中,一些工作中建议将对抗训练与元学习一块进行训练,对抗元学习,在元学习阶段使用对抗训练网络生成多余未见过的类的例子,但是这些方法是针对于分类问题的。经过总结这些经验,本文将对抗微调放入了元学习中,主要是为了在元学习阶段,获得初始生成网络和判别网络的状态。
最后与本文最相关的是两个在文字生成语音上的工作【3,19】,他们的设置以及一些元素都在本文中使用。
模型结构
图2 元学习结构包括,embdder网络(将图像以及landmarks转化为向量),生成网络(将landmarks转化成图像,其中与Adain放到一个层中),在元训练期间,使用一系列视频通过embdder。并将结果进行平均,并且使用他们预测生成器的adaptive参数。之后,使用不同图像的landmarks通过生成器,将输出的图像与groud truth比较。目标函数包括perceptual和对抗losses。
方法
结构和注意点
方法的元学习阶段,假设有M段videos,包含了不同人的头部,定义xi为第i个视频序列,xi(t)表示第t个画面,在学习处理阶段,测试阶段。假设所有的脸的landmarks都存在,landmarks被充构成三通道的图片,使用已定义好的颜色集合与真正的landmark链接使用线性分割,定义xi(t) 计算的landmark产生的图片是yi(t)。
元学习阶段下面三种网络需要训练。
元学习
在元学习阶段,三个网络的参数是以对抗的形式训练的,文中试验使用的8-shot,每个阶段随机抽取正在训练的序列i,以及从这个序列中出来的图片t. 然后画出随机的k个图像s1……sk从同一序列中。之后极端估计第i个视频的ei(sk)的均值ei
使用生成器生成第t张图片,基于ei的估计
然后embdder以及生成器的参数需要最小化,内容,对抗以及embedding 匹配三种loss
其中内容Loss主要是为了衡量,生成图片与原始图片的差距,主要使用的是pertual Loss 使用的是vgg19在ILSVRC数据集合上训练的和人脸验证的vggFace网络,然后提取这些网络的feature计算L1 Loss。
对抗Loss 和判别器计算的分数密切相关,需要一个特征来衡量,还是使用Pertua Loss,使用判别器计算
其中w的列表示一个视频中,embedding独特的视频,判别器首先将输入变成一个N维向量V(xi(t), yi(t), theta)并且计算分数
wi 表示矩阵W的第i列,同事w0, b0不依赖于视频的索引。所以Loss和生成器生成图片的真实性以及与landmark yi(t)的兼容性。
有两种视频embedding的方式,其中一种是使用embedder,另一种在判别器中和W的列有关。匹配Loss 主要是用L1计算着两种的不同。和Wi。
在更新判别器参数phi以及生成器参数kesi的时候,参数theta, W, w0, b这些判别器参数也会随之更新。更新将会最小化下面的Loss
这个Loss生成图片和真正的图片在判别器上分别小于-1, 大于1. 元学习的整体流程是,首先是最小化内容Loss,对抗Loss以及匹配Loss来更新生成器和embedder。然后使用最后的DSC Loss更新判别器。
Few-shot学习
元学习完成后,系统可以生成没有在元学习见过的人的talking head。合成依赖于landmark 图像。
选择T张图片以及T张图片对应的landmark,embeding之后出现
其中T的数量需要与元学习K的数量一致。
然后就可以根据landmark变成各个形态的脸。
但是为了图片的真实性需要进行微调
微调时候首先需要一个单独的视频,以及少量的图片。
微调有下面步骤
在微调的时候判别器的分数和元学习阶段相似
w’就类似与元学习中Wi+w0的样子,可以初始化成w0和enNew的和
新的学习问题开,生成器的损失函数需要最小化kesi和kesiI
t 从1… N 表示训练集的数量。判别器的向量theta,wNew,b需要最小化hinge Loss
经过元学习阶段初始化后的参数,是十分重要的。
工具细节
本文的生成器G(yi(t), ei^, kesi, P)残差下采样,本文使用的是实例标准化。个体向量kesiI 实例化归一的纺射系数。在Adain之后,但是在y(t)下采样阶段,使用的是普通的实例正则化层。
文中的embedder E(xi(s), yi(s), phi)判别器的卷积部分V(xi(t), yi(t), theta)使用和生成器相同的残差下采样,但是并没有标准化层。判别器和embedder不同之处在于,其在末尾有不同的残差块,在4*4特殊像素中操作,为了从这两个结构中获得,向量输出,使用了全局和polling,并且使用Relu激活。
对每一个卷积以及连接层都使用了归一化方法,attention机制也使用了32*32的特殊像素在所有的下采样阶段,在上采样阶段64*64的上采样阶段。
在计算LCNT的时候使用了conv1, 6, 11, 20, 29 vgg19的层,和cov1,6,11,18,25VGGFace的层计算L1Loss, 将这些Loss相加,其中VGG19的权重是0.15,VGGFace的权重是0.025.
LFM 权重为10, LMCH权重也为10。
设置卷积层的最小数量是64,并且最大的channel数量是embedding维度的数量N到512,总的来说embder 有1500万参数,生成器由3800万参数,判别器卷积部分参数有有2000万个,训练embdeder的学习率是5*10-5,判别器的学习率是2*10-4,两步训练策略,训练的时候前面一个后面一个。
在大型数据VoxCeleb2,没有embeding matchingLoss的情况下,训练了150个epoch,直接使用不需要微调。 FT训练的时候加入了这个Loss训练了75个epochs,但是需要微调。这两类都取得了较好的效果,在小样本中。
这是两种训练模式对比的结果。
本文使用few-shot微调了40个epochs。
这样的话时间较长,推理过程时间在nvidia时间大概13ms。
时间对比图,如果想要上线需要的是ours-FF模型
网络结构
Embdder
这是三个网络中最简单的,主要负责生成style transfer结构。
那么它就有6个channel
(2) 网络的feature map个数从64开始,每次加而倍知道512为止。
(3) 文中说在下采样的时候32*32的层加入了self-attention。但是没有说如何加的
(4)并且文中使用了实例级的标准化,但是文中并未提及如何使用。
Generator
Descriminator
这个和Embedder很像,最后分数是其输出的向量与矩阵W相关的列相乘得到的。有一个sigmoid函数在最后,使得分出在0,1之间。
损失函数
LossCNT
这个函数相对比较简单。
Loss ADV
普通的对抗网络损失函数,还有一部分为特征,匹配损失。有些网友认为匹配损失这一部分可以省略掉
Loss MCH
这一步分可以没有。
Loss D
Hingle Loss(二分类中常用的一种Loss, L(y)=max(0, 1-t*y))
T是正1或者-1, y是给出的分数。
目前并没有人真正的实现全套的东西。