Everybody dance now 简析+代码

参考

参考了知乎-Everybody dance now 简析
Github代码

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

训练方法

给出一个源人物视频source和一个目标人物视频target,其目标是生成目标人物执行源视频同样动作的新视频。因此,为了完成这一任务,工作流程可以分成以下三个步骤:姿势检测全局姿势归一化Norm、从归一化的姿势简笔画映射Transfer到目标人物。

在这里插入图片描述
在姿势检测阶段,其先将源人物视频source和一个目标人物视频target变成一帧一帧的图片大概2000-3000张,在利用OpenPose对其进行姿态评估,对每一帧图片(上图的y)生成的关键点图片label(上图的x)。其OpenPose的代码可以点击这里。在完成了label图片的生成之后,就可以利用pix2pix网络对其进行GAN的训练。其pix2pix的代码可以点击这里。在代码部分,代码的作者将这两个开源的代码全部都放在了一个src的目录下。训练出来的网络就是上方图片的上半部分,我们简称它为pose2vid网络。

这里需要说明一点,从下方的Transfer阶段的步骤我们可以看出,中间有一个Norm的操作,这是因为源人物视频source和一个目标人物视频target中形成的姿势检测的关键点label可能拥有不同的尺寸,因此对于pix2pix网络来说,它是逐个像素进行转换的,如果在未知的地方存在了label的关键点,可能会使得生成出来的人物被拉长或者被压缩。

同时,在训练pose2vid网络的时候,还需要用一个numpy数组去保存每个任务脸部关键点的坐标,这是为了后面对脸部进行脸部增强。需要注意的是,测试时脸部关键点的坐标需要跟着一起做Norm操作。
在这里插入图片描述
我们不妨把脸部增强的网络称为face enhancement网络。face enhancement网络的训练方法是先利用训练好的pose2vid网络将target当成source去生成用自己模仿自己动作的效果图,然后再通过前面保存的脸部关键点的坐标,截取一个50x50像素的区域,然后去预测生成的图片在这个区域中与真实图片的残差(如上图的r部分)。残差最后加到生成的图片上就可以使人脸 更清楚啦!

至此,整个网络的训练就完成了!

代码实现

博主运行了这个Github代码,这个代码是使用pytorch写的比较友好,tensorflow的版本需要安装并编译pyopenpose,用windows编译实在是太不友好了(如果有兴趣去编译的人也可以点这里)。pytorch的版本下,只有该代码完成了脸部增强和Norm的部分。
在这里插入图片描述
这个Github的README部分写的很清楚,在下载了它训练好的一些模型之后,基本只要按照step1到step7的步骤完成就好了,需要注意的是:如果你使用的是windows,需要把train_opt.py文件中nThreads参数设置成0。因为windows不支持多线程读取数据。

猜你喜欢

转载自blog.csdn.net/weixin_39373480/article/details/86763715
now