《First Order Motion Model for Image Animation》论文解读

1、前言

早期的Facerig软件可以即时抓取摄像头视频中的人脸关键点,将表情、头部姿态等信息转化到三维虚拟化身上,比如一只猫、一个虚拟卡通人物上。然后在使用即时视频通讯软件时,选择facerig的虚拟摄像头,其他人看到的就是拥有使用者当前表情的虚拟形象了。

随着换脸、表情迁移的科技浪潮汹涌而至,人们不再满足于使用卡通形象、动漫人物来充当自己的化身,而是使用真人的形象。类似的项目包括但不限于faceit_live3、avatarify,其中avatarify热度较高,已经被用于视频会议的换脸,参见机器之心的报道。

传统意义上的换脸是视频图像帧级别的操作,如果想把源脸替换到目标脸上的话,需要使用大量的双方人脸图像的数据进行事先训练训练。但是上述视频会议场景不具备这个条件,毕竟用户端的目标人脸的数据过少,为了达到实时换脸的效果,也没有大量的时间进行训练,那么上述项目是如何实现的呢?

代码地址:https://github.com/AliaksandrSiarohin/first-order-model

2、解读

从标题显而易见,这篇文章完成的任务是image animation,给定一张源图片,给定一个驱动视频,生成一段视频,其中主角是源图片,动作是驱动视频中的动作。如下图所示,源图像通常包含一个主体,驱动视频包含一系列动作。
1
以左上角的人脸表情迁移为例,给定一个源人物,给定一个驱动视频,可以生成一个视频,其中主体是源人物,视频中源人物的表情是由驱动视频中的表情所确定的。通常情况下,我们需要对源人物进行人脸关键点标注、进行表情迁移的模型训练。

但是这篇文章提出的方法只需要在同类别物体的数据集上进行训练即可,比如实现太极动作迁移就用太极视频数据集进行训练,想要达到表情迁移的效果就使用人脸视频数据集voxceleb进行训练。训练好后,我们使用对应的预训练模型就可以达到前言中实时image animation的操作。

为什么这么做?

为了解决数据依赖和提高模型使用的泛化性。

以表情迁移为例,图像生成任务的传统方法VAE、GAN等需要大量人脸图像,以及这些人脸图像的标注信息(关键点、面部动作单元、三维模型等);此外,这些训练好的模型只能在特定人物中间使用,没法应用到未知的人脸中。

除了生成人脸图像的逼真程度,上述两个问题也是长久以来表情迁移所面临的问题。小样本学习是解决上述问题的方法之一,比如三星的工作、英伟达的FUNIT,通过提取少量源人脸的embedding,表征源人脸的身份信息,在生成阶段使用AdaIn加入到decoder中,实现表情迁移的操作。

此外在姿态迁移的大任务当中,Monkey-Net首先尝试了通过自监督范式预测关键点来表征姿态信息,测试阶段估计驱动视频的姿态关键点完成迁移工作。在此基础上,FOMM使用了相邻关键点的局部仿射变换来模拟物体运动,还额外考虑了遮挡的部分,遮挡的部分可以使用image inpainting生成。

3、整体概述

2
整个模型训练过程是图像重建的过程,输入是源图像和驱动图像,输出是保留源图像物体信息的含有驱动图像姿态的新图像,其中输入的两张图像来源于同一个视频,即同一个物体信息,那么整个训练过程就是驱动图像的重建过程。

大体上来说分成两个模块,一个是motion estimation module,另一个是image generation module。其中motion estimation module输出有两个,一个是dense motion field [公式] ,表征了驱动图像D中的每个关键点到源图像S的映射关系;一个是occlusion mask [公式] ,表明了在最终生成的图像中,对于驱动图像D而言,哪部分可以通过D扭曲得到,哪部分可以通过inpaint得到。在image generation module中,输入S,在encoder得到的特征层中进行形变,然后decoder回去,得到最终的输出。

一个很有意思的地方是,在推断过程中,D和S的关键点差异可能会比较大,所以作者引入了一个抽象的参考帧R,通过预测R到S的映射 [公式] 和R到D的映射 [公式] 来计算 [公式] ,这样避免了直接计算D到S的映射,并且可以同时处理D和S。对于输入motion estimation module的一张图片X来说,其中的keypoint detector会输出关键点信息和局部仿射变换的参数信息,这些参数使得关键点附近的姿态信息可以通过仿射变换得到,然后通过泰勒展开可以得到 [公式] 。在通过这种方法得到 [公式] 和 [公式] 后,联合图像S送入motion estimation module中的dense motion network,得到对应的输出 [公式] 和 [公式] 。

4、细节讲解

到目前为止,我们已经拥有了初步的 [公式] 。我们只考虑了整体的信息,下面作者考虑了生成时的一些局部信息。

对于生成器而言,直观上来讲,映射 [公式] 中包含的纹理和边缘信息与图像D会有很好的对应关系,但对图像S则没有很好的对应关系,所以要对S进行一系列的warp变换得到 [公式] 等,作为额外的参考信息输入进去,其中 [公式] 为使用公式4对于图像S在某个关键点附近进行形变得到的结果; [公式] 为背景信息。

此外,作者还计算了热力图表征了映射发生的位置,公式如下:
3

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
除了 FaceSwap 库外,还有一些其他的 Python 库可以实现 AI 换脸,例如 DeepFaceLab 和 First Order Motion Model for Image Animation (FOMM) 等。 这里以 FOMM 库为例,介绍一下使用 FOMM 实现 AI 换脸的步骤: 1. 安装 FOMM 库 可以通过以下命令使用 pip 安装 FOMM 库: ``` pip install git+https://github.com/AliaksandrSiarohin/first-order-model.git ``` 2. 准备源图像和目标图像 分别准备需要换脸的源图像和目标图像,并将它们放在不同的文件夹中。 3. 提取源图像和目标图像的人脸 使用 OpenCV 库提取源图像和目标图像中的人脸,并将人脸保存为单独的图像文件。 4. 训练模型 使用 FOMM 提供的训练脚本 `train.py` 来训练模型: ``` python train.py \ --config config/vox-adv-256.yaml \ --src_dir path/to/source/faces \ --dst_dir path/to/target/faces \ --checkpoint_dir path/to/checkpoint \ --model_id model_name ``` 其中,`path/to/source/faces` 和 `path/to/target/faces` 分别是提取后的源图像和目标图像中的人脸图像的存储路径,`path/to/checkpoint` 是训练后的模型存储路径,`model_name` 是模型的名称。 5. 进行换脸操作 使用 FOMM 提供的 `demo.py` 脚本来进行换脸操作: ``` python demo.py \ --config config/vox-adv-256.yaml \ --checkpoint path/to/checkpoint/model_name \ --source_image path/to/source/image \ --driving_video path/to/driving/video \ --result_video path/to/result/video ``` 其中,`path/to/checkpoint/model_name` 是训练后的模型存储路径和模型名称,`path/to/source/image` 是源图像的路径,`path/to/driving/video` 是驱动视频的路径,`path/to/result/video` 是输出的视频路径。 运行以上步骤,即可实现 AI 换脸。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值