『蚂蚁呀嘿』的实现–PaddleGAN表情动作迁移
写在前面-开源项目
{card-default width=“100%” label="『蚂蚁呀嘿』"}全网都在求的「蚂蚁呀嘿」教程–基于PaddleGAN的First order motion model实现{/card-default}
根据项目文档一步步实现:
First Order Motion model原理
First Order Motion model的任务是image animation,给定一张源图片,给定一个驱动视频,生成一段视频,其中主角是源图片,动作是驱动视频中的动作,源图像通常包含一个主体,驱动视频包含一系列动作。
通俗来说,First Order Motion能够将给定的驱动视频中的人物A的动作迁移至给定的源图片中的人物B身上,生成全新的以人物B的脸演绎人物A的表情的视频。
以人脸表情迁移为例,给定一个源人物,给定一个驱动视频,可以生成一个视频,其中主体是源人物,视频中源人物的表情是由驱动视频中的表情所确定的。通常情况下,我们需要对源人物进行人脸关键点标注、进行表情迁移的模型训练。
但是这篇文章提出的方法只需要在同类别物体的数据集上进行训练即可,比如实现太极动作迁移就用太极视频数据集进行训练,想要达到表情迁移的效果就使用人脸视频数据集voxceleb进行训练。训练好后,我们使用对应的预训练模型就可以达到前言中实时image animation的操作。
以下操作可以在控制台运行
下载PaddleGAN代码
# 从github上克隆PaddleGAN代码
!git clone https://gitee.com/paddlepaddle/PaddleGAN
# 安装所需安装包
cd PaddleGAN/
pip install -r requirements.txt
pip install imageio-ffmpeg
cd applications/
mkdir output
期间会遇到很多问题
1.包安装不上-多换源多安装几次
2.paddle安装报错No module named ‘paddle’ || paddlepaddle安装
3.其他包报错问题Cannot uninstall ‘llvmlite’ || Error #15: Initializing libiomp5.dylib
实现步骤
根据说明文档很容易制作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-apLCcZWK-1640510694444)(https://xiaole.website/usr/uploads/2021/03/3380712713.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SnUMkJ5T-1640510694472)(https://xiaole.website/usr/uploads/2021/03/696639557.png)]
操作记录
[控制台操作记录][6]
# 加入声音
import cv2
import imageio
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML
import warnings
# video display function
from moviepy.editor import *
videoclip_1 = VideoFileClip(r"D:\feil\paddlepaddle-PaddleGAN-master\work\PaddleGAN\src\fullbody.MP4")
videoclip_2 = VideoFileClip(r"D:\feil\paddlepaddle-PaddleGAN-master\work\PaddleGAN\applications\output\result.mp4")
audio_1 = videoclip_1.audio
videoclip_3 = videoclip_2.set_audio(audio_1)
videoclip_3.write_videofile("./output/daqiang_unravel.mp4", audio_codec="aac")
def display(driving, fps, size=(8, 6)):
fig = plt.figure(figsize=size)
ims = []
for i in range(len(driving)):
cols = []
cols.append(driving[i])
im = plt.imshow(np.concatenate(cols, axis=1), animated=True)
plt.axis('off')
ims.append([im])
video = animation.ArtistAnimation(fig, ims, interval=1000.0/fps, repeat_delay=1000)
plt.close()
return video
video_path = './output/daqiang_unravel.mp4'
video_frames = imageio.mimread(video_path, memtest=False)
# 获得视频的原分辨率
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)