今天为大家带来一篇arXiv新上论文,来自三星AI,用于换脸,没错,而且不像deepfake那样要对被换的脸和要换谁的脸,这两个人的脸的大量数据信息。仅仅凭借一张A的脸,就能把视频中B的脸换成A的脸。如果给定A的脸的图像增多,效果也会越好。论文引起了广泛关注,作者也提供了demo视频,在油管上,大家也可以去搜索看看。这篇论文估计是要投ICCV的,目前在arXiv上是第一版,意思就是有些内容有小错误,甚至原理也没说太明白,论文上也没有作者的邮箱,没法咨询他们。我照我的理解讲述。
update on 2019.06.16
我把论文复现的代码开源到了个人GitHub,是一个失败的结果,我只迭代了几百步,发现输出的中间很离谱,具体都在github里面提到,感兴趣可以自行查看。之所以仍然开源是因为想邀请广大朋友成为contributor,也许有人能基于我的工作真的复现出来呐。(╹▽╹)
目前换脸(其实论文中叫做talking head model)模型(其实论文中叫做talking head model,就是把那种人头占很大面积,同时人在说话的视频片段,类似于给节目主持人特写镜头)都需要一个人脸的大量图像,然后基于这些一个人的人脸图像训练,才能得到不错的效果。作者提出了一种仅仅几张(few shot)目标人脸图像,就能将视频中其他的人脸换成目标人脸,且效果极其逼真,好到都能让蒙娜丽莎等名画中的肖像人脸动起来。
作者用了以下技术
最后,这篇论文借鉴了很多风格迁移和GAN网络的思路。包括adaptive instance normalization, spectral normalization, self attention 等,复现起来应该蛮难的。三星估计也不会考虑开源这项技术。
设 x i x_i xi是数据集视频序列中的第i个序列, x i ( t ) x_i(t) xi(t)是第i个序列的第t帧,论文使用【1】中的方法对所有样本提取了对应的关键点,并把这些关键点连接成线。
左图是一个 x i ( t ) x_i(t) xi(t),右图是对应的landmarks,记作 y i ( t ) y_i(t) yi(t)
整个模型分为三个部分
因为采用对抗学习,所以有两个损失函数交替训练。
现在从一个视频序列中随意选取一帧记作t,再冲这个序列中选取K张不同于t的帧,这K帧记作 s 1 , . . . s k s_1,...s_k s1,...sk。我们计算 e ^ i \widehat{e}_i e i
把 e ^ i \widehat{e}_i e i和第t帧对应的 y i ( t ) y_i(t) yi(t)送到G中,得到了假图像 x ^ i ( t ) \widehat{x}_i(t) x i(t),
我们已经得到了Embedder和G的所有必要的东西了,接下来就看看第一个损失函数
由三个部分组成:
我们看到V和W相乘,想让D更大,意味着V的最优方向是每个元素和 W i W_i Wi是相同的正负号就行了,那这个式子是没有上界的啊,只要V满足正负号相同,数值越大就越好。个人没能理解这一点。需要看引用到的其它文献来理解
L D S C L_{DSC} LDSC括号中的内容全是判别器需要用到的参数,其中第一个来自Embedder,之后两个来自生成器;第三个参数,即 θ \theta θ是判别器卷积部分的参数,之后的 W , w 0 , b W,w_0,b W,w0,b也是训练参数。前三个参数不需要参与判别器的训练,后四个才是判别器需要优化的部分。
可以发现,判别器的损失函数是hinge loss,我们之前说了,D的输出越大,表示输入越可能是真样本。判别器的优化目的当然是想让假样本的D值小,真样本的D值大,照着这样的逻辑,我们发现 L D S C L_{DSC} LDSC确实为0的。其中最优的情况是假样本的D值为-1,真样本的D值为1。
之前提到,W的第i列参与 x i x_i xi这个序列的计算:
W的每一列对应一个序列的向量,同时还有一个项 L M C H L_{MCH} LMCH,作用是将 W i W_i Wi和 e ^ i \widehat{e}_i e i优化距离,使二者尽量相似。那么大家应该知道,W的作用是啥了。 e ^ i \widehat{e}_i e i仅仅涉及到K张同一序列的一个人的表征,因为仅仅用到了K张所以表述应该没有很全面。但随着训练的进行,K会遍历一个序列的全部帧,同时优化W和e的距离,那么 W i W_i Wi可以看做是一个序列中针对一个人更普适性更准确的表达向量。
当元学习收敛之后,模型就能用一个模型没有见过的人脸A生成一个视频序列,这个视频序列的人脸B被替换成A。
假设我们给了A的脸有T张,(这里T当然可以等于1,但是为了生成更好的脸,T一般都不为1。)和对应的T张landmarks,分别记作 x ( 1 ) , x ( 2 ) . . . x ( T ) x(1),x(2)...x(T) x(1),x(2)...x(T),和 y ( 1 ) , y ( 2 ) , . . . y ( T ) y(1),y(2),...y(T) y(1),y(2),...y(T)。我们用Embedder计算这个人脸的平均表征向量(一般是一个人特有一个表征向量,不同人的表征向量距离应该差很大。)
一种直接的办法是用想替换的视频中的landmark, e ^ N E W \widehat{e}_{NEW} e NEW输入到G中,直接就能实现换脸的,但是作者发现这样生成的脸仅仅能认为像,得到的结果还不够真。为了弥补应用在不同域带来的误差,作者提出一种finetuning的方式(可以认为是在线训练,但速度很快,且不用大量的数据增强,仅仅靠几张图片)
在训练环节,我们提到生成器的参数分为两部分,一个是 ψ \psi ψ,另一个是 ψ ^ i \widehat{\psi}_i ψ i,后者是用过一个映射 ψ ^ i = P e ^ i \widehat{\psi}_i=P\widehat{e}_i ψ i=Pe i优化的,所以在训练阶段,参与训练的其实是 ψ \psi ψ和P。
finetuning操作按照下列步骤:
因为这个方法涉及到了很多其他论文的成果吗,所以在implemantation details部分,论文说的不是很清楚,大部分是引用来说明。不过我还是大致说下。
左边的数字代表测试所用的图像数目,可以发现即便用一张,换出来的人都很逼真了。用32张几乎看不出是假脸。
甚至能让肖像也跟随一个视频中人脸的动作和表情,实现让画动起来的神奇操作!!想想一下爱因斯坦在给你上物理课,想想一下康熙皇帝的画像动起来再讲述他的故事。多么有趣啊。
[1] How far are we from solving the 2d & 3d face alignment problem?
[2] Perceptual losses for real-time style transfer and super-resolution
[3] High-resolution image synthesis and semantic manipulation with conditional gans
我会尝试复现一下,计划用两个月吧,毕竟牵扯到很多其他的论文。慢慢啃