让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》

Irene181 等级 1515 0 0
标签: ffmpeganimation

让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》

1

前言

让一张图片,动起来,应该怎么做?

DeepFake 一阶运动模型,让万物皆可动。

利用这项技术,用特朗普和蒙娜丽莎的图片,合唱一首《Unravel》,是什么效果?

今天,它来了!

今天,继续手把手教学

算法原理、环境搭建、效果实现,一条龙服务,尽在下文!

2

算法原理

First Order Motion,也就是一阶运动模型,来自 NeurIPS 2019 论文。

「First Order Motion Model for Image Animation」

论文最初的目的是让「静态图片」动起来。如下图所示:“你动,它也动”。

让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》

这个模型可以轻易地让「权利的游戏」中的人物模仿特朗普进行讲话,还可以让静态的马跑起来等。

让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》

让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》

一阶运动模型的思想是用一组自学习的关键点和局部仿射变换来建立复杂运动模型。

模型由运动估计模块和图像生成模块两个主要部分组成。

让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》

首先进行关键点检测,然后根据关键点,进行运动估计,最后使用图像生成模块,生成最终效果。

在运动估计模块中,该模型通过自监督学习将目标物体的外观和运动信息进行分离,并进行特征表示。

而在图像生成模块中,模型会对目标运动期间出现的遮挡进行建模,然后从给定的图片中提取外观信息,结合先前获得的特征表示,生成图片。

作者使用该算法在四个数据集上进行了训练和测试。

VoxCeleb 数据集、UvA-Nemo 数据集、The BAIR robot pushing dataset、作者自己收集的数据集。

其中,VoxCeleb 是一个大型人声识别数据集。

它包含来自 YouTube 视频的 1251 位名人的约 10 万段语音,同时数据基本上是性别平衡的(男性占 55%),这些名人有不同的口音、职业和年龄。

让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》

First Order Motion 利用了这个数据集的视频图像,进行了模型训练。

我们就可以利用这个训练好的,人脸的运动估计模型,完成我们今天的任务。

「特朗普和蒙娜丽莎的深情合唱」。

除了需要用到这个一阶运动模型,还需要使用 OpenCV 和 ffmpeg 做视频、音频和图像的处理。

具体的实现,在下文的「效果实现」中说明。

3

环境搭建

效果实现上,我们可以直接用已有的库去实现我们想要的功能。

「Real Time Image Animation」

项目地址:

https://github.com/anandpawara/Real\_Time\_Image\_Animation

Python 为什么这么受欢迎,就是因为这一点

有很多开源项目,方便我们快速实现自己想要的功能,极大降低了开发成本。

真是,谁用谁知道啊。

环境搭建,还是建议使用 Anaconda,安装一些必要的第三方库,可以参考这篇开发环境搭建的内容:

《Pytorch深度学习实战教程(一):语义分割基础与环境搭建

这个项目需要用到的第三方库,也都写的很全:

https://github.com/anandpawara/Real\_Time\_Image\_Animation/blob/master/requirements.txt

直接使用 pip 安装即可:

python -m pip install -r requirements.txt

此外,为了处理音频和视频,还需要配置 ffmpeg。

安装好 ffmpeg 并配置好环境变量即可。

ffmpeg 下载地址:

https://ffmpeg.zeranoe.com/builds/

4

效果实现

实现也非常简单。

首先,整理一下思路:

「Real Time Image Animation」使用一阶运动模型,根据已有视频,让静态图动起来。

让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》

左图为原始图片,中间为生成结果,右侧为原始视频。

但是,这个项目只能处理图像不能保留音频

所以,我们需要先将音频保存,再将处理好的视频和音频进行合成。

这个功能,就用我们下载好的 ffmpeg 实现。

编写如下代码:

import subprocess
import os
from PIL import Image

def video2mp3(file_name):
    """
    将视频转为音频
    :param file_name: 传入视频文件的路径
    :return:
    """
    outfile_name = file_name.split('.')[0] + '.mp3'
    cmd = 'ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_name
    subprocess.call(cmd, shell=True)

def video_add_mp3(file_name, mp3_file):
    """
     视频添加音频
    :param file_name: 传入视频文件的路径
    :param mp3_file: 传入音频文件的路径
    :return:
    """
    outfile_name = file_name.split('.')[0] + '-f.mp4'
    subprocess.call('ffmpeg -i ' + file_name
                    + ' -i ' + mp3_file + ' -strict -2 -f mp4 '
                    + outfile_name, shell=True)

搞定,视频转音频,以及音频合成都搞定了。

我们需要对「Real Time Image Animation」这个项目进行修改,修改 image_animation.py 文件。

import imageio
import torch
from tqdm import tqdm
from animate import normalize_kp
from demo import load_checkpoints
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from skimage import img_as_ubyte
from skimage.transform import resize
import cv2
import os
import argparse

import subprocess
import os
from PIL import Image

def video2mp3(file_name):
    """
    将视频转为音频
    :param file_name: 传入视频文件的路径
    :return:
    """
    outfile_name = file_name.split('.')[0] + '.mp3'
    cmd = 'ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_name
    print(cmd)
    subprocess.call(cmd, shell=True)


def video_add_mp3(file_name, mp3_file):
    """
     视频添加音频
    :param file_name: 传入视频文件的路径
    :param mp3_file: 传入音频文件的路径
    :return:
    """
    outfile_name = file_name.split('.')[0] + '-f.mp4'
    subprocess.call('ffmpeg -i ' + file_name
                    + ' -i ' + mp3_file + ' -strict -2 -f mp4 '
                    + outfile_name, shell=True)

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input_image", required=True,help="Path to image to animate")
ap.add_argument("-c", "--checkpoint", required=True,help="Path to checkpoint")
ap.add_argument("-v","--input_video", required=False, help="Path to video input")

args = vars(ap.parse_args())

print("[INFO] loading source image and checkpoint...")
source_path = args['input_image']
checkpoint_path = args['checkpoint']
if args['input_video']:
    video_path = args['input_video']
else:
    video_path = None
source_image = imageio.imread(source_path)
source_image = resize(source_image,(256,256))[..., :3]

generator, kp_detector = load_checkpoints(config_path='config/vox-256.yaml', checkpoint_path=checkpoint_path)

if not os.path.exists('output'):
    os.mkdir('output')


relative=True
adapt_movement_scale=True
cpu=False

if video_path:
    cap = cv2.VideoCapture(video_path) 
    print("[INFO] Loading video from the given path")
else:
    cap = cv2.VideoCapture(0)
    print("[INFO] Initializing front camera...")

fps = cap.get(cv2.CAP_PROP_FPS)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))


video2mp3(file_name = video_path)



fourcc = cv2.VideoWriter_fourcc('M','P','E','G')
#out1 = cv2.VideoWriter('output/test.avi', fourcc, fps, (256*3 , 256), True)
out1 = cv2.VideoWriter('output/test.mp4', fourcc, fps, size, True)

cv2_source = cv2.cvtColor(source_image.astype('float32'),cv2.COLOR_BGR2RGB)
with torch.no_grad() :
    predictions = []
    source = torch.tensor(source_image[np.newaxis].astype(np.float32)).permute(0, 3, 1, 2)
    if not cpu:
        source = source.cuda()
    kp_source = kp_detector(source)
    count = 0
    while(True):
        ret, frame = cap.read()
        frame = cv2.flip(frame,1)
        if ret == True:

            if not video_path:
                x = 143
                y = 87
                w = 322
                h = 322 
                frame = frame[y:y+h,x:x+w]
            frame1 = resize(frame,(256,256))[..., :3]

            if count == 0:
                source_image1 = frame1
                source1 = torch.tensor(source_image1[np.newaxis].astype(np.float32)).permute(0, 3, 1, 2)
                kp_driving_initial = kp_detector(source1)

            frame_test = torch.tensor(frame1[np.newaxis].astype(np.float32)).permute(0, 3, 1, 2)

            driving_frame = frame_test
            if not cpu:
                driving_frame = driving_frame.cuda()
            kp_driving = kp_detector(driving_frame)
            kp_norm = normalize_kp(kp_source=kp_source,
                                kp_driving=kp_driving,
                                kp_driving_initial=kp_driving_initial, 
                                use_relative_movement=relative,
                                use_relative_jacobian=relative, 
                                adapt_movement_scale=adapt_movement_scale)
            out = generator(source, kp_source=kp_source, kp_driving=kp_norm)
            predictions.append(np.transpose(out['prediction'].data.cpu().numpy(), [0, 2, 3, 1])[0])
            im = np.transpose(out['prediction'].data.cpu().numpy(), [0, 2, 3, 1])[0]
            im = cv2.cvtColor(im,cv2.COLOR_RGB2BGR)
            #joinedFrame = np.concatenate((cv2_source,im,frame1),axis=1)
            #joinedFrame = np.concatenate((cv2_source,im,frame1),axis=1)

            #cv2.imshow('Test',joinedFrame)
            #out1.write(img_as_ubyte(joinedFrame))
            out1.write(img_as_ubyte(im))
            count += 1
#            if cv2.waitKey(20) & 0xFF == ord('q'):
#                break
        else:
            break

    cap.release()
    out1.release()
    cv2.destroyAllWindows()

video_add_mp3(file_name='output/test.mp4', mp3_file=video_path.split('.')[0] + '.mp3')

然后下载算法需要的权重文件视频图片素材

让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》

修改好的代码权重文件视频图片素材我都已经打包好了拿来直接用也可以

下载链接(密码:amz5):

https://pan.baidu.com/s/1TEd7SOaO5mzPaxpOh2pALQ

运行命令:

python image_animation.py -i path_to_input_file -c path_to_checkpoint -v path_to_video_file

path_to_input_file 是输入的模板图片。

path_to_checkpoint 是权重文件路径。

path_to_video_file 是输入的视频文件。

如果使用我打包好的程序,可以使用如下指令直接运行,获得文章开头的视频:

python image_animation.py -i Inputs/trump2.png -c checkpoints/vox-cpk.pth.tar -v 1.mp4

最后生成的视频存放在 output 文件夹下。

大功告成!

5

最后

算法处理视频的速度很快,用 GPU 几秒钟就能搞定。

**-----**------**-----**---**** End **-----**--------**-----**-****

往期精彩文章推荐:

让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/CPiTWrq5GIYM7rn9VMR6sw,如有侵权,请联系删除。

收藏
评论区

相关推荐

用css3实现惊艳面试官的背景即背景动画(高级附源码
我们传统的前端更多的是用javascript实现各种复杂动画,自从有了Css3 transition和animation以来,前端开发在动画这一块有了更高的自由度和格局,对动画的开发也越来越容易。这篇文章就让我们汇总一下使用Css3实现的各种特效。这篇文章参考《css揭秘》这本书,并作出了自己的总结,希望能让大家更有收获,也强烈推荐大家看看这本书,你值得拥有
用Python编程语言来实现阿姆斯特朗数的检查
一、什么是阿姆斯特朗数? 如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。 一个正整数称为阿姆斯特朗阶数。 例: abcd... an bn cn dn ... 如果是3位的阿姆斯特朗数字,则每个数字的立方和等于该数字本身。 例如: 153 111 555 333 // 153是一个阿姆斯特朗
让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》
1 前言 让一张图片,动起来,应该怎么做? DeepFake 一阶运动模型,让万物皆可动。 利用这项技术,用特朗普和蒙娜丽莎的图片,合唱一首《Unravel》,是什么效果? 今天,它来了! 今天,继续手把手教学。 算法原理、环境搭建、效果实现,一条龙服务,尽在下文! 2 算法原理 First Order Motion,也就是一
用Python编程语言来实现阿姆斯特朗数的检查
一、什么是阿姆斯特朗数?如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。一个正整数称为阿姆斯特朗阶数。例:abcd... an + bn + cn + dn + ...如果是3位的阿姆斯特朗数字,则每个数字的立方和等于该数字本身。 例如:153 111 + 555 + 333 // 153是一个阿姆斯特朗数。 二、案
G7或变G6+1?特朗普七国峰会箱友军开炮
今日导读 ![](https://images2018.cnblogs.com/blog/1286166/201806/1286166-20180621133828148-1208424582.png) G7 峰会刚召开完毕,德国总理默克尔发的一张照片就迅速火遍全球。照片中她身体前倾,像是在质问特朗普,而后者则双手交叉胸前,我自岿然不动,这张火药味十足的
Unity 动画系统 Animation和Animator 常用小功能
****[👈返回目录](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.cnblogs.com%2F01zxs%2Fp%2F9987225.html)**** * * * **Animation控制动画播放:** Animation.Play(); //播放默认动画 Ani
Ubuntu 14.04 安装ffmpeg及开发库
Ubuntu 14.04 安装ffmpeg及开发库 ========================= ### 参考资料 在官网有一篇比较全的教程[CompilationGuide/Ubuntu](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fhttp%3A%2F%2Ftrac.ffmp
AI算法让图片动起来,特朗普和蒙娜丽莎深情合唱《Unravel》
> 本文 GitHub [https://github.com/Jack-Cherish/PythonPark](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2FJack-Cherish%2FPythonPark) 已收录,技术干货文章、学习资料、一线大厂面试经验等
CocosCreator 教你玩转Animation动画(第十四篇)
**前言:** Animation动画在游戏中是必不可少的,各种人物的走跑跳飞,以及各种表情动作,反正做游戏Animation动画是必修课了。 这一篇章可以学会制作和控制各种动画,主要从一下几个方面介绍: 1. 动画制作流程; 2. 使用Animation动画编辑器制作动画; 3. 代码控制动画; * * * 一、动画制作的流程 ====
Cucumber介绍
Cucumber是一个提供能让我们都理解的普通语言,通过普通语言来描述的测试用例,并支持行为驱动开发的测试工具。Cucumber支持大多数变成语言,如Ruby、Java和Python等。 官方地址:https://cucumber.io/ Cucumber是一个提供能让我们都理解的普通语言,通过普通语言来描述的测试用例,并支持行为驱动开发的测试工具。Cu
FFmpeg + OpenGL ES 实现 3D 全景播放器
![](https://oscimg.oschina.net/oscnet/d1020a46-dbca-480c-8182-261315bad94d.jpg "FFmpeg + OpenGLES 实现 3D 全景播放器") FFmpeg + OpenGLES 实现 3D 全景播放器 FFmpeg 开发系列连载: * [FFmpe
FFmpeg + OpenGLES 实现视频解码播放和视频滤镜
> 该原创文章首发于微信公众号:字节流动 FFmpeg 开发系列连载: [FFmpeg 开发(01):FFmpeg 编译和集成](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.jianshu.com%2Fp%2F0792f6bbc9f6) [FFmpeg 开发(02):FFm
FFmpeg开发实战(二):FFmpeg 文件操作
FFmpeg 提供了丰富的API供我们使用,下面我们来讲述一下文件操作相关的API: * FFmpeg 删除文件:avpriv\_io\_delete() * FFmpeg 重命名文件:avpriv\_io\_move() * FFmpeg 打开目录:avio\_open\_dir() * FFmpeg 读取目录:avio\_read\_d
TikTok服务器已与字节跳动分离:首席安全官透露最新进展
> TikTok 服务器已经实现了与母公司字节跳动系统的「完全剥离」,这在 TikTok 全球首席安全官新提交的一份法庭文件中得到了证实。 机器之心报道,编辑:蛋酱、杜伟。 据外媒 The Verge 报道,TikTok 全球首席安全官在一份新的法庭文件中称,美国商务部就 TikTok app 如何存储和保护用户数据进行了错误的描述。所以,该公司再次提出
TikTok禁令生效前几小时,特朗普突然同意字节跳动与甲骨文交易
##### 量子位 报道 | 公众号 QbitAI TikTok美国的命运又迎来新的转机。 今天,美国总统特朗普宣布,他已批准TikTok的母公司字节跳动和甲骨文(Oracle)之间的交易,暂时避免了美国应用商店对TikTok的禁令。 ![](https://oscimg.oschina.net/oscnet/fec92b36-5dc9-43f8-8b