0.前言
近日在B站上接触到了一些换脸演唱的视频,觉得还有点意思,发现不少视频都是没几个粉的用户上传的,这让我意识到或许制作这个的门槛并不高,后来偶然间看到了相关教程,于是乎自己也尝试着搞了搞。
1.参考视频
- 最详细简洁的方法教你如何轻松做damedane梗!_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
- 教你轻松做出damedane梗图,会不会翻墙都可以!_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
2.使用方案
如下图:
对于程序猿来说,自然是选择方法一了。
3.使用教程
3.1 拷贝脚本到colab中
脚本链接为:first-order-model-demo.ipynb - Colaboratory。
该脚本中包含代码运行逻辑所有流程。
我们可以选择直接编辑拷贝的ipynb文件,或者自己再新建一个ipynb文件,这里我选择的是新创建文件train_image.ipynb
。
3.2 上传资源文件
将想要制作的源图片和源视频上传到Google Drive中,这里需要注意的是上传的最好是256*256的png格式的图片(如果不是的话,可以先使用图片编辑工具将图片转换成相应的格式)
如图我这里将图片放到了Images目录:
将视频放到了Videos目录:
3.3 拷贝模型文件
我们还需要将模型文件拷贝到Google Drive中。只需要拷贝两个tar
文件就好,如图,放到相应的目录(自己随意,后续代码中对应上即可):
3.4 启动环境并执行脚本
打开之前创建的train_image.ipynb
文件,然后系统便会分配RAM和磁盘供程序运行,由于Colab默认不会为环境配置GPU或者TPU,所以我们这里需要手动设置一下。
如下图:
step1: 克隆仓库到colab
依次输入并执行以下指令
!git clone https://github.com/AliaksandrSiarohin/first-order-model
cd first-order-model
如图:
step2: 查看GPU信息
!nvidia-smi
如图:
step3: 挂载Google drive到Colab
from google.colab import drive
drive.mount('/content/gdrive')
如图:
其中会涉及到使用Google账户授权,只要点击确认并复制相应的验证码到指定位置处运行即可。
step4: 加载驱动视频和源图像
import imageio
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from skimage.transform import resize
from IPython.display import HTML
import warnings
warnings.filterwarnings("ignore")
source_image = imageio.imread('/content/gdrive/My Drive/Images/xiao_ke.png')
driving_video = imageio.mimread('/content/gdrive/My Drive/Videos/bakamitai_template.mp4')
#Resize image and video to 256x256
source_image = resize(source_image, (256, 256))[..., :3]
driving_video = [resize(frame, (256, 256))[..., :3] for frame in driving_video]
def display(source, driving, generated=None):
fig = plt.figure(figsize=(8 + 4 * (generated is not None), 6))
ims = []
for i in range(len(driving)):
cols = [source]
cols.append(driving[i])
if generated is not None:
cols.append(generated[i])
im = plt.imshow(np.concatenate(cols, axis=1), animated=True)
plt.axis('off')
ims.append([im])
ani = animation.ArtistAnimation(fig, ims, interval=50, repeat_delay=1000)
plt.close()
return ani
# HTML(display(source_image, driving_video).to_html5_video())
上面的source_image
和driving_video
的路径根据自己的情况进行设置。
另外我们可以看到上面脚本是有一个将图像和视频都变为256*256的操作,这里我们为了更好的效果可以提前将图片剪辑为相应的格式。
之后的display
方法是定义了通过matplotlib库将图片和视频展示的方法,这里的效果大致如:
step5: 创建并加载模型
from demo import load_checkpoints
generator, kp_detector = load_checkpoints(config_path='config/vox-256.yaml',
checkpoint_path='/content/gdrive/My Drive/first-order-motion-model/vox-cpk.pth.tar')
最开始切换路径的目的就在于能够直接引用到demo
的load_checkpoints
函数并且对应到配置文件config/vox-256.yaml
。
step6: 执行动画生成
到这里终于到了我们最想看到的环节。
from demo import make_animation
from skimage import img_as_ubyte
predictions = make_animation(source_image, driving_video, generator, kp_detector, relative=True)
#save resulting video
imageio.mimsave('../generated.mp4', [img_as_ubyte(frame) for frame in predictions])
#video can be downloaded from /content folder
HTML(display(source_image, driving_video, predictions).to_html5_video())
如图:
根据相对路径关系../generated.mp4
我们也可以发现生成的视频文件就在当前环境下,即:
将生成的mp4下载到本地即可。
4.视频后期处理
我们下载得到的generated.mp4
并不能直接使用,时长不仅增加了3倍,并且也没有了声音。所以只能通过后期视频编辑再将视频调整为正常倍速并添加源视频音轨,实现正常的转换效果。
关于从mp4中提取音频,我这里用了arctime软件,该软件主要是配字幕的,自己之前使用过(本来以为有视频添加音频的功能,结果没有,这里只提了声音)由于自己的电脑比较渣,所以这里使用了B站提供的云剪辑功能,对视频进行了加工处理。
如图: