你还只是在玩换脸?赶紧来围观如何从头换到脚
摘要
本文介绍了人工智能的一个新领域,图像生成、视频生成。最近大热的DeepFake换脸,就是这一领域的爆款应用。我们分别介绍了图像生成、视频生成的几种典型方法。这几类方法,基本代表了各方向的最新进展state of the art。目前,我们仅对这些做了初步调研。后期,若我们在公司业务找到应用,可在这方面继续深入。
引言
人工智能浪潮正在往纵深发展。2012年到2017年,深度学习技术的最成功应用,是将物体识别的能力,提升到超过人类的级别,将人脸识别、目标检测、目标分割等技术推进到实用阶段。自2017年以来,深度学习最激动人心的进展是生成对抗网络GAN,Generative Adversary Network。
什么是生成对抗网络?我们回顾一段残酷的历史。南北朝时期,有个残暴的君主叫赫连勃勃,他在修建都城的城墙时,安排了两拨工匠。一波人负责修城墙,一波人负责造矛。墙修好后,拿矛来戳。戳得进,杀砌墙的工匠;戳不进,杀造矛的工匠。靠这种法子,他建造了极其坚固的城墙。他死后,继位者腐朽无能,邻居北魏来攻打,却对这城墙,一点办法都没有,最后靠引诱城内兵马出城作战才拿下都城。
GAN也就是这种思路。它构建了两个网络,生成器网络G,对抗器网络A。以图片生成为例,G的输入可以是噪声、也可以是别的输入,G的输出就是一张图片。这个图片会送入A,A会判断图片是真是假,并把结果反馈给G,让G改进。显然,一开始,G生成的图片,与真实图片,差别必然很大,A很容易就判断真假。但是,随着G的改进,A的判断就会越来越难。直到某一刻,A再也无法分辨,给一张图,到底是真实的,还是G生成的。这时,我们说,GAN网络就训练好了,我们拿生成器G,就能去生成各种以假乱真的图。
这种思想,催生的第一个爆款应用,就是换脸,DeepFake。
Deepfake掀起了一股换脸的热潮。美国国会甚至专门出台法案,限制换脸技术的使用,以免干扰即将到来的美国大选。
GAN其实并不神秘。我们都知道一款神器PS,photoshop。PS能对图片做各种各样的编辑。但是,PS都是靠人来用,而不能自动。而GAN在图像方面,其实是将人如何使用PS,变成自动化了。
除了图像、视频,GAN也能用于文本。最近的GPT-2网络,可以写诗、可以写小说,并且,逻辑关系很挺顺。
本篇总结,我们主要关心用GAN进行图像、视频的生成。
视频可以视为一组图像的序列。因此,图像生成是视频生成的基础。而在视频生成中,我们需要额外考虑的一点是,时间维度的一致性,temporal coherence。比如,在相邻两帧图像中,同一物体如同一只手,它的位置变化,是不可能太大的。如果变化很大,我们在视频中看起来,就会觉得很怪异,这就是temporal coherence的含义。
图像生成
最著名的图像生成,就是换脸。
先看一波换脸的效果图。
实现的效果:给一张source脸与target脸,最后得到的result:脸是source,其他如背景、脸部角度、姿态等与target相同。
换脸DeepFake
经典的换脸,过程如下图所示:
过程可描述为:
1. 输入为A与B的脸部图。通常是一段A的视频、一段B的视频。注意,视频可视为一个图片序列。
2. 网络结构:Encoder-decoder架构。流程如下:1)给定一张A脸的图片,它会输入到Encoder,Encoder的输出为A脸的特征向量。2)A脸的特征向量,输入到Decoder,Decoder的输出是重建的A脸。Encoder、Decoder通常由1-N个CNN结构组成。
3. 训练第一阶段:用A的视频,训练一个Encoder、DEcoder-A;同样,用B的视频,训练一个Encoder、Decoder-B。注意,Encoder是共享的,而Decoder则依赖于脸。这时,loss函数是,希望重建脸与输入脸尽可能一致。
4. 训练第二阶段:交换。即将Encoder-A的输出,送给Decoder-B,将Encoder-B的输出,送给Decoder-A。这时,loss函数是,希望Decoder-A的输出脸,与脸B尽量一致;Decoder-B的输出,与脸A尽量一致。注意,此时,训练不再对encoder进行调整,只调整decoder。
5. 测试:若输入为A脸视频,则采用Encoder、Decoder-B的网络来处理,获得将脸换为B的新视频。对B脸视频,亦如此。
主要缺陷:每一对脸,就需要训练一个模型。每换一对脸,都需要重新训练。带来显著缺陷:
· 训练成本太高:每一对脸,都需要收集训练视频
· 训练效果不好:一对脸,视频不够多时,容易过拟合。对于遮挡、侧脸等各种情形,效果往往不好。
换脸FaceShifter
生成器的网络如下图(a)所示。
功能描述:
被替换的是target图,表示为Xt。
用于替换的是source图,表示为Xs。
最后得到的输出Y:脸是source所包含的脸;脸部姿态、角度及图的背景,是target所描述。
过程描述:
Target图的处理,是一个典型的Encoder-Decoder过程。Encoder是一个多层神经网络,它的输出尺寸逐步减少;Decoder则相反,逐步增大输出尺寸。在图(a)中,Z1是最后一层Encoder的输出,即尺寸最小的。注意,Encoder与decoder之间有残差连接,并非简单的层次结构。
Source图,首先进入identity encoder,这其实是arcface的特征提取,最终的输出是人脸特征向量,即Zid。
生成成过程:即(a)中的AAD generator模块,它包含多层的AAD resBLK。一个resBLK的结构,如(b)所示,这里面又包含两层的AAD、Relu、conv。AAD的结构如(c)所示。限于篇幅,b、c两个图,不再解释。
每个AAD resBlk,接受三个输入:来自target图的Zi;来自Source图的Zid;上一层AAD resBlk的输出。
直观理解每一层在做什么:将source的脸,与target的背景等属性,进行融合。
为什么要多层:实现多分辨率的生成,逐步提高分辨率,最终得到高清的生成结果。
AAD generator模块的最终输出,就是生成的图。
优点:
· 训练数据易得:网络的输入是一对脸的图,这样的训练数据,可以很轻松地获得大量数据。
· 一次训练,反复使用:只要训练一次。测试是,给定一对脸的图片,就能交换。无需对不同的脸,训练不同的模型。
换人instaGAN
解决几个问题
· 当图片中有多个实例时,怎么换?上面介绍的换脸技术,只能将一张脸换为另一张,不能同时将两张脸换为另外两张。
· 当目标的形状shape,有很大变化,如何做?换脸技术,一般都要求,交换的两张脸,脸型比较相近;若差别大,则效果不好。
这时,我们关心的,不只是换脸了,而是instance-level的交换。这个instance,可以是脸部,也可以是其他部位、其他物体。
效果如下图
网络结构如下所示。基本过程是,输入是一张图及其object mask。注意,此时的输入并不是所有目标的semantic mask,而是只含有targeted object的mask。网络会将source object mask,变换为target object mask,然后再结合原输入图,合并生成结果图。结果图中的object,已不是source,而是target。
视频生成
广义而言,只要系统输出是一个新创造的视频,都可以认为是视频生成,比如从噪声向量生成视频的无条件视频生成任务,和一系列有条件视频生成任务,比如 text2video, image2video,video2video,multi-condition video generation (e.g. head image + speech)。 一些特定的视频生成任务有其专属的称号,如 DeepFake 换脸、视频超分、视频预测等。
下图是来自知乎的一个总结。无条件视频生成文章并不太多,目前看来其生成效果距离实际应用还有较长距离。
我们这里介绍有条件视频生成的一类典型技术。它们均由英伟达公司的研究人员发明。
vid2vid
vid2vid是NVIDIA公司提出的一种图像翻译模型 ,通过输入语义图来生成视频,其是在pix2pix、pix2pixHD基础上改进出的模型,三者的演进思想如下:
· 最早pix2pix框架提出了一种统一的简洁优雅的框架解决了图像翻译问题,使用CGAN代替专家知识实现基本图像翻译效果。
· pix2pixHD是在pix2pix基础上改进G和D,可以生成高分辨率图像,并使用一点技巧,能够控制生成多样化的输出。
· 前两种方式只是针对静态图片的翻译进行设计,如果直接用于视频的翻译会导致帧间不连续的问题,vid2vid是在pix2pixHD基础上考虑加入视频连贯性的设计所提出的视频翻译模型,改造G和D来生成连贯且高质量的视频。
上图展示了主要功能。这里以行为识别为例。
基本思想:左图为原始输入。先将输入图的行为,提取出来,表示为pose map。pose map可用densepose、openpose等方法来提取。然后用另一个目标,生成与pose map一致的新图。
vid2vid的训练,使用8块V100,训了10天左右,实现了1080p的视频生成。
这是Nvidia公司在NIPS 2018提出的工作。
few-shot vid2vid
在NIPS 2019,Nvidia同一波人,对vid2vid又进行了改进。
vid2vid存在的主要缺陷是,它的生成,局限于训练集中已有的目标(如人)。所以,如果要对新人做视频生成,就需要收集该人的大量视频,重新进行训练。
与此同时,vid2vid的另一个缺陷,若某人的某个动作,在训练集中没有,则生成效果就不好。比如,训练时都是A的舞蹈视频;测试时,拿一段B的武术视频,试图将之替换成A的武术视频,效果就不会很好。
这两个缺陷其实是一体的。后一个缺陷的根源是,vid2vid对每个人(目标),训练不同的模型。由于单个人的视频不可能收集的很完整,所以自然,训练的泛化能力就比较差。
few shot vid2vid对以上缺点,进行了改进。
它的输入:1) 一段目标A的视频;2) 多张B的各种姿态的图片。
它的输出:一段B的视频,B的动作与原来A的动作是相同的。
few-shot vid2vid的思想,可通过下图表示。
先看右侧子图,即红框内。它实现的功能是:从pose map生成realistic image。
那么,左侧子图做了什么:左侧子图,生成了一组权值。这些权值,会用于右侧子图。
我们来直观地理解这个过程。
假设我们有十个人,每人一组视频,来对右侧子图,做训练。最有的情况当然是,对每个人,都学到一组权值,让右侧子图能生成该人的视频。
但是,如果这么做,我们不能实现泛化。
如何泛化呢?我们引入左侧子图,它负责生成右侧的权值。也就是,对一个人来说,我们用左侧子图来获得,适合于他的权值(对应于右侧子图);然后,将这个权值,加载到右侧子图,就可生成该人的视频。
显然,对右侧子图,不同人的权值,其实是有共同点的。共同的地方就是对动作的描述,不同的地方就是该人的属性(如身高、脸部、衣物等)。
所以,在我们的训练过程中,右侧子图自己学到的权值,描述了共性特征。左侧子图输出的权值,是特定目标的属性特征。
而在测试阶段,右侧子图的权值,是它自己学到的权值,与左侧输出权值,相加而得到。
通过这种思想,few shot vid2vid就可用一套模型,适配于新目标。
公开数据集
图像分割、行为识别等的数据集
图像分割的结果,即semantic map,是一种重要的中间表示手段。因此,图像分割数据集,在图像生成中,得到了广泛应用。类似地,视频分割,也被用于视频生成。典型的包括街景CityScapes、COCO、PASCAL-VOC等。
对人的行为,skeleton是一种重要的表示手段。因此,行为识别数据集,也在图像生成、视频生成中被广泛使用。典型的包括ActivityNet、UCF101等。
FaceForensics++
这是用于脸部重建的经典数据集。最初的版本为FaceForensics,包含数万张高清人脸图片。后来扩展为FaceForensics++,规模更大。
该数据集,需要申请使用。对中国用户很不友好,基本难以获取。
Facebook FakeVideo检测竞赛
不久前,Facebook发起了一项竞赛,提供了数千个Fake videos,号召人工智能研究者参与进来,开发新的算法,区分facked video与native video。
小结与讨论
本文对图像生成、视频生成这一新的热门领域,进行了介绍。限于时间,我们还有许多主题没有谈及。包括:1. GAN的基本思想,GAN的发展历史;2. 通用的图片生成;3. 对虚假视频的检测与发现。有矛就有盾,造假与打假,是硬币的两面。
希望通过本文,能帮助感兴趣的人,快速入门。相关项目的论文、代码、数据、预训练权值等,可与作者联系。