lip2lip:一种用于伪视频生成的cGan方法

lip2lip:一种用于伪视频生成的cGan方法

2018年看到了许多令人兴奋和新颖的GAN应用。受pix2pix的启发,可以创建一个网络来改变源视频中演员的嘴唇动作。

介绍

给定两个人们说话的视频,我们想在第一个视频中重画嘴唇,以匹配第二个视频中的音频。为了清晰起见,我将这些视频称为source和transfer。我们将在transfer视频中使用配音演员的嘴唇来帮助我们在第一个视频中重新绘制嘴唇。该过程分为三个步骤:人脸特征提取、唇部转移和视频重构。

1.人脸特征提取:

我使用了以下经过预先训练的机器学习模型(http://dlib.net/python/index.html),该机器学习模型识别下颌,嘴,眼睛和鼻子的68个特征。通过这些特征,我从source视频中提取lower face,从transfer视频中提取唇部轮廓。擦除源视频唇部周围的区域。图1说明了此步骤的输出。

lip2lip:一种用于伪视频生成的cGan方法

图1:面部特征提取

2.唇部转移

lip2lip:一种用于伪视频生成的cGan方法

图2:用cGAN进行唇部迁移

对于Lip transfer,我使用具有UNet架构的cGAN。与使用噪声向量z生成样本的传统​​GAN不同,cGAN学习生成以某些输入x为条件的样本。噪声向量是可选的,将使输出不确定。鉴别器使用x和G(x)分类虚假或真实的图像。在这种情况下,cGAN以步骤1的脸部特征提取为条件。为了训练机器学习模型,我将源视频分成单独的帧,并从每个帧中提取掉黑色的下部脸和嘴唇轮廓。生成器的任务是重建原始帧。鉴别器查看生成器的重建G(x)和原始帧y,并且必须确定哪个是假的,哪个是真的。这个过程如图2所示。对于转移,我仍然从源框架中提取下颌,但唇部轮廓来自转移框架。

3.视频重建

在面部特征提取期间,我保存了原始视频帧以及用于提取面部的位掩码。为了重建视频,我使用位掩码将生成的下面贴回到原始帧上,并将帧组合成视频。

预处理

生成的图像质量的大多数改进来自改变面部特征提取过程。图3显示了不同的预处理实验。第三幅图像中的方法产生了最好的结果。

lip2lip:一种用于伪视频生成的cGan方法

图3:不同的预处理实验

最初,为了转移,我对声音演员的嘴唇进行了缩放,翻译和旋转以匹配源的嘴唇。这个过程是不完美的,让机器学习模型弄清楚粘贴嘴唇的位置会产生更好的效果。

在覆盖源嘴唇的多边形上添加一些噪声也可以改善模型性能。在第三张图片中,注意多边形是如何锯齿状的,并不能完全覆盖奥巴马的下巴。没有这种噪音,模型使用多边形的形状来推断嘴唇应该是什么样子。添加噪点迫使机器学习模型更多地关注唇部轮廓。

模型

我使用了原始pix2pix文件中描述的模型。该生成器使用了UNet架构。该设计类似于自动编码器,除了在每一层都存在从编码器到解码器的跳过连接。该模型受益于学习输入的密集表示,但 skip connection 确保在编码过程中不丢失任何信息。出于这个原因,UNets在图像生成和分割任务中变得非常流行。

lip2lip:一种用于伪视频生成的cGan方法

图4:Unet架构

cGAN的损失函数可表示如下:

L(G,D)= E [logD(x,y)] + E [log(1-D(x,G(x)))]]

我们为生成器的损失添加了一个额外的项:E [yG(x)]。生成的图像和ground truth之间的这个L1距离迫使生成器不仅欺骗了鉴别器而且还绘制类似于ground truth的图像。

结果

我在两个单独的数据集上训练机器学习模型,这两个数据集都是从youtube下载的。首先是一段长达4分钟的奥巴马总统演讲录像。(约5000帧)。第二部是长达2分钟的戏剧性独白。(约2500帧)。在Tesla V100上运行GPU训练分别需要大约6和3个小时。

lip2lip:一种用于伪视频生成的cGan方法

图5:奥巴马嘴唇改变的画面

图5显示了来自第一个数据集的四个成功生成的图像,以及来自transfer视频的相应唇部轮廓。

lip2lip:一种用于伪视频生成的cGan方法

图6:改变嘴唇的戏剧性独白的生成帧

图6显示了来自第二个数据集的四个成功生成的图像,以及来自transfer视频的相应唇部轮廓。在图5和图6中,转移的嘴唇轮廓是从视频中提取的。

大约4%的生成图像具有可见的异常。当尝试绘制与源视频中的说话者所能制作的唇部轮廓非常不同的嘴唇时,会出现这些情况。例如,在第一组数据中,奥巴马从来没有张大嘴巴。让生成器把奥巴马的脸画得大张着嘴,产生了一些异常现象。

lip2lip:一种用于伪视频生成的cGan方法

图7:具有可见异常的生成图像

在图8中,您可以看到两个数据集的完整视频生成管道。第一个图块是嘴唇改变的输出视频。第二个图块是我们提取帧的transfer视频格式。最后两个tiles是生成器的输入。黑色的脸部来自源视频,嘴唇来自transfer视频。

lip2lip:一种用于伪视频生成的cGan方法

lip2lip:一种用于伪视频生成的cGan方法

图8:完整视频生成管道

时间平滑

为了改善帧之间的图像平滑度,我修改了网络,以查看当前的黑色面部,当前唇部轮廓和先前生成的面部。这将迫使后续帧彼此更相似,从而平滑视频。

lip2lip:一种用于伪视频生成的cGan方法

图9:修改的生成器架构,支持时间平滑

不幸的是,时间平滑会使机器学习模型的输出变差。对先前帧的调节通过后续帧传播生成器错误。到第20帧时,图像非常过饱和。此外,生成器学会了大部分忽略所需的唇形轮廓并仅重绘前一帧。在最终版本中,我没有使用时间平滑。

Reflection

模型学会画出非常逼真的嘴唇。对于人眼而言,假/真帧通常难以区分。该模型的最大限制有时会忽略所需的唇部轮廓,并仅使用涂黑的脸部重新涂抹嘴唇。由于训练图像和transfer图像来自略微不同的分布,因此这种过度拟合是有意义的。在训练期间,唇部轮廓始终与面部相匹配。这不是转移的情况。想象一下奥巴马的嘴巴张开的框架,给他一个大大的下巴,但我们希望他闭嘴。在不改变下巴形状的情况下,没有自然的方法可以画出闭合的嘴唇。在训练期间,模型永远不会学习如何改变下颌,因为它不需要。相反,该模型记得,对于大颚,奥巴马的嘴应该是开放的,所以它会张开嘴唇。

  • 训练更大的数据集,使机器学习模型看到更多样化的面部和嘴唇组合
  • 从生成的图像中提取唇形轮廓,并为损失添加一个项,强制生成的唇形轮廓与所需的唇形轮廓相匹配。

使用更深的网络可以改善偶尔出现异常的帧。

代码:https://github.com/marcoamonteiro/lip2lip_demo

相关推荐