基于ModelArts实现“蚂蚁牙黑”特效
前言
最近几天,某音和朋友圈都在秀“蚂蚁牙黑”,加上特效和魔性的音乐纷纷被人模仿!这里,看了胡琦大大的教程之后,咱用 ModelArts 来制作实践跑一遍,我将重新从头到尾,简单操作实现生成“蚂蚁牙黑“魔性洗脑小视频。
整体流程
-
步骤一
创建桶,并将数据集导入到自己的OBS桶中
-
步骤二
进入ModelArts的控制台,找到开发环境->NoteBook,然后新建一个NoteBook,名称:任意;设置参数:python3;资源池:公共资源池;类型:GPU存储;配置:云硬盘EVS;规格:[限时免费]体验规格GPU版。
-
步骤三
新建Pytorch 1.0
的.ipynb
文件,利用 Moxing 拷贝文件到 JupyterLab,然后进行解压
-
步骤四
准备工作完成之后,切换到first-order-model
目录,然后将 source_image_path
中的路径替换为”素材脸”所在的路径,脸的照片可以直接通过 Notebook 的文件上传功能上传。当然您还可以将默认的“蚂蚁牙黑”视频替换为您自定义的视频,格式为 mp4。
-
步骤五
保存结果视频,然后下载安装剪辑神器软件moviepy,然后导入音频,最后加以合成到出成result.mp4
-
步骤六
最后,可以上传任意图片做水印,生成加水印后的视频,自此,单人版的”蚂蚁牙黑“全部完成
步骤一
首先,创建一个新的桶并命名。
然后创建一个文件夹data,用来存放AI Gallery胡琦大大提供的数据集,然后点击确认下载。(数据集下载地址:点击 https://marketplace.huaweicloud.com/markets/aihub/datasets/detail/?content_id=00bc20c3-2a00-4231-bdfd-dfa3eb62a46d )
耐心等待2分钟左右,就会显示下载完成。
步骤二
登陆ModelArts控制台 https://console.huaweicloud.com/modelarts/?region=cn-north-4&locale=zh-cn#/dashboard
然后选择开发环境->Notebook->创建Notebook
-
名称:任意
-
设置参数:python3
-
资源池:公共资源池
-
类型:GPU
-
存储配置:云硬盘EVS
-
规格:[限时免费]体验规格GPU版
最后再确认一下参数
步骤三
新建Pytorch 1.0
的.ipynb
文件,利用 Moxing 拷贝文件到 JupyterLab,然后进行解压
简单测试一下是否可以运行代码
利用 Moxing 拷贝文件到 JupyterLab
将之前下载到 OBS 中的模型和素材通过 Moxing 拷贝过来,此处注意替换为您的 OBS 路径。02.mp4
是“蚂蚁呀嘿”的模版视频,
# 用 Moxing 下载文件
import moxing as mox
# 此处需要替换您的 OBS 地址
mox.file.copy_parallel('obs://mayiyahei88/data/first-order-motion-model/first-order-motion-model-20210226T075740Z-001.zip' , 'first-order-motion-model.zip')
mox.file.copy_parallel('obs://mayiyahei88/data/first-order-motion-model/02.mp4' , '02.mp4')
# 解压
!unzip first-order-motion-model.zip
# 模版视频
!mv 02.mp4 first-order-motion-model/
步骤四
准备工作完成之后,切换到first-order-model
目录,然后将 source_image_path
中的路径替换为”您的脸”所在的路径,脸的照片可以直接通过 Notebook 的文件上传功能上传。
当然您还可以将默认的“蚂蚁牙黑”视频替换为您自定义的视频,格式为 mp4。一路执行可以查看到合成前的预览。
cd first-order-model
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
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" )
# 此处替换为您的图片路径,图片最好为 256*256,这里默认为普京大帝
source_image_path = '/home/ma-user/work/first-order-motion-model/02.png'
source_image = imageio.imread(source_image_path)
# 此处可替换为您的视频路径,这里默认为“蚂蚁牙黑”
reader_path = '/home/ma-user/work/first-order-motion-model/02.mp4'
reader = imageio.get_reader(reader_path)
# 调整图片和视频大小为 256x256
source_image = resize(source_image, ( 256 , 256 ))[..., : 3 ]
fps = reader.get_meta_data()[ 'fps' ]
driving_video = []
try :
for im in reader:
driving_video.append(im)
except RuntimeError:
pass
reader.()
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)
if generated is not None :
cols.append(generated)
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.()
return ani
HTML(display(source_image, driving_video).to_html5_video())
|
步骤五
保存结果视频
from demo import load_checkpoints
generator, kp_detector = load_checkpoints(config_path='config/vox-256.yaml',
checkpoint_path='/home/ma-user/work/first-order-motion-model/vox-cpk.pth.tar')
from demo import make_animation
from skimage import img_as_ubyte
predictions = make_animation(source_image, driving_video, generator, kp_detector, relative=True)
# 保存结果视频
imageio.mimsave('../generated.mp4', [img_as_ubyte(frame) for frame in predictions], fps=fps)
# 在 Notebook 根目录能找,/home/ma-user/work/
HTML(display(source_image, driving_video, predictions).to_html5_video())
给视频配音,安装剪辑合成软件
# 安装视频剪辑神器 moviepy
!pip install moviepy
小tips:当*号变成了步骤数字代码才执行完毕了
为视频添加蚂蚁牙黑背景音乐
# 为生成的视频加上源视频声音
from moviepy.editor import *
videoclip_1 = VideoFileClip(reader_path)
videoclip_2 = VideoFileClip("../generated.mp4")
audio_1 = videoclip_1.audio
videoclip_3 = videoclip_2.set_audio(audio_1)
videoclip_3.write_videofile("../result.mp4", audio_codec="aac")
步骤六
给视频添加水印
# 还可以给视频加水印
video = VideoFileClip("../result.mp4")
# 水印图片请自行上传
logo = (ImageClip("/home/ma-user/work/first-order-motion-model/hw.png")
.set_duration(video.duration) # 水印持续时间
.resize(height=50) # 水印的高度,会等比缩放
.margin(right=0, top=0, opacity=1) # 水印边距和透明度
.set_pos(("left","top"))) # 水印的位置
final = CompositeVideoClip([video, logo])
final.write_videofile("../result_water.mp4", audio_codec="aac")
final_reader = imageio.get_reader("../result_water.mp4")
fps = final_reader.get_meta_data()['fps']
result_water_video = []
try:
for im in final_reader:
result_water_video.append(im)
except RuntimeError:
pass
reader.()
result_water_video = [resize(frame, (256, 256))[..., :3] for frame in result_water_video]
HTML(display(source_image, driving_video, result_water_video).to_html5_video())
自此,单人版的蚂蚁牙黑全程已经跑完了。
注意
本实验到此完成,需要请大家注意:
-
示例中我们建议大家选择的都是免费规格,如果大家开通了套餐或者有代金券的,可以尝试使用付费规格获得更好的体验,但记得及时关闭相应服务哦!
Tips:实验结束后请及时停止在线服务,不然在线服务会持续收费有可能导致欠费,致使华为云账号被冻结而影响使用。 我们在在线服务管理页面单击对应服务列表后的"停止"按钮即可停止本在线服务。
总结
-
OBS的路径很重要,填错了会下载不了数据集
-
脸部图片和视频存放的路径要与代码填写的路径一致,不然报错not found
-
找不到result.mp4的原因是当前的路径是在根目录,而../relust.mp4就会报错找不到,你在/home/ma-user/work/first-order-motion-model路径下,切换才会正常。
展望
这次的蚂蚁牙黑只实现了单人版的动效,多人版同屏的还有待研究,大家一起研究看看吧!!!!
- 点赞
- 收藏
- 关注作者
评论(0)