人人皆为舞王 – Everybody Dance Now 的 PyTorch 实现

PyTorch入门实战教程

这篇文章做的事情就是将 一个源视频(source,S)的舞姿转移给目标视频(target,T)人物对象。效果惊艳,吓得我中午饭都没好好吃。论文地址:https://arxiv.org/pdf/1808.07371.pdf

演示视频

如果可以访问 Youtube,可以在这个链接看作者的 demo video,或者点击这里下载演示视频高清版。

作者将本文的方法分为三个阶段:首先对输入的视频进行姿态估计,然后,规范化姿态;最后将规范化的姿态映射会目标空间。 简单来讲就是: 首先,将S T视频都通过网络(可以采用的是目前最好的姿态估计的预训练好的模型)映射到姿态空间,然后计算出连个姿态的差别,纠正下;最后再把纠正过的姿态映射回去。

方法

给出一个源人物视频和一个目标人物视频,我们的目标是生成目标人物执行源视频同样动作的新视频。为了完成这一任务,我们将工作流程分成以下三个步骤:姿势检测、全局姿势归一化、从归一化的姿势简笔画映射到目标人物。在姿势检测阶段,我们用一个预训练的当前最优姿势检测器,基于源视频中的帧来创建姿势简笔画。全局姿势归一化阶段考虑了帧内源人物和目标人物的身材、位置差异。最后,我们设计了一个系统,通过对抗训练学习从归一化姿势简笔画到目标人物图像的映射。

(上图)训练:我们的模型利用姿势检测器 P,基于目标人物的视频帧创建姿势简笔画。训练期间,我们学习映射 G 和对抗鉴别器 D,后者尝试区分「真」对应对 (x, y) 和「假」对应对 (G(x), y)。(下图)迁移:我们使用姿势检测器 P:Y ′ → X ′来获取源人物的姿势关节,然后通过归一化过程 Norm 将这些姿势关节迁移到目标人物的关节,为目标人物创建对应的姿势简笔画。接下来我们使用训练好的映射 G 来生成目标人物的新视频。

图像转换的对抗训练

我们修改了 pix2pixHD 的对抗训练设置来生成时间相干视频帧、合成逼真的人脸图像。

为了创建视频序列,我们修改了单个图像生成设置来增强相邻帧之间的时间连贯性,如下图所示。

时间平滑设置。当合成当前帧 G(x_t ) 时,我们基于对应的姿势简笔画 x_t 和之前合成的帧 G(x_t−1),获得时间平滑的输出。然后鉴别器 D 尝试将「真」时间相干序列 (x_t−1, x_t , y_t−1, y_t ) 与「假」序列 (x_t−1, x_t , G(x_t−1), G(x_t )) 区分开来。

我们添加了专门的 GAN 设置,旨在为面部区域添加更多细节和真实感,如图 5 所示。结果显示该 GAN 设置产生了比较真实的面部特征,模型简化测试显示其改善了完整图像 GAN 的结果。

Face GAN 设置。残差由生成器 G_f 来预测,并从主生成器添加到原始人脸预测中。

迁移结果。每一部分展示了五个连续帧。顶部一行显示源人物,中间一行显示标准化的姿势简笔画,底部一行显示目标人物的模型输出。

每张图像的漏检平均值,数值越小越好。

不同模型合成结果的比较。图像被裁剪成围绕原始姿势的边界框。T.S. 表示具有时间平滑设置的模型,T.S. Face 是具有时间平滑设置和 Face GAN 的完整模型。时间平滑设置为手、头、上衣和阴影添加了细节。这些细节在完整的模型中延续,包括脸部和周围区域的附加细节,从而产生最逼真的合成结果。

验证集上不同模型的人脸图像对比。T.S. 表示具有时间平滑设置的模型,T.S. Face 是具有时间平滑设置和 Face GAN 的完整模型。时间平滑设置和 Face GAN 的增加使得细节得到改善,失真程度得以减少。

Github 代码

PyTorch 代码地址见这里:https://github.com/nyoki-mtl/pytorch-EverybodyDanceNow

Reference:

[1] 知乎专栏

[2] 机器之心

PyTorch入门实战教程

Leave a Reply

Your email address will not be published. Required fields are marked *

返回顶部