这是我参与新手入门的第3篇文章
“蚂蚁牙黑”学习记录&实操练习
学习准备
1. 环境配置:
-
1.1 本案例使用框架: Pytorch-1.0.0
-
1.2本案例使用实验规格: GPU: 1*p100 CPU: 8 核 64GiB Multi-Engine 1.0 (Python3, Recommended)
2.运行代码方法:
- 点击本页面顶部菜单栏的三角形运行按钮或按Ctrl+Enter键 运行每个方块中的代码
3.事项说明
- 本实操案例参照胡琦老师的文档 文章链接
- 本实操会使用OBS对象存储服务,会产生少量费用,3月18日前,楼主提供免费OBS数据源,供大家下载&实验。
- 不定时资源停止分享,因为我套餐没资源了。
4.资源链接
-
1.源代码地址
//选择一个使用即可 # 地址1 ,胡琦老师提供 !git clone https://codehub.devcloud.cn-north-4.huaweicloud.com/ai-pome-free00001/first-order-model.git # 地址2, 博主Gitee链接 !git clone https://gitee.com/JiegangWu/first-order-model.git 复制代码
-
2.模型下载
-
通过AI市场下载数据模型
//下载地址 https://marketplace.huaweicloud.com/markets/aihub/datasets/detail/?content_id=00bc20c3-2a00-4231-bdfd-dfa3eb62a46d 复制代码
-
通过博主提供的OBS文件分享下载
//下载链接(随时可能失效) mox.file.copy_parallel('obs://lab-modelarts/lab01/first-order-motion-model-20210226T075740Z-001.zip' , 'first-order-motion-model.zip') mox.file.copy_parallel('obs://lab-modelarts/lab01/02.mp4' , '02.mp4') 复制代码
-
操作步骤
1.搭建实验环境
- 使用ModelArts搭建实验环境
- 创建开发环境
2.下载源代码
- 下载实验源代码(2种方式任选一种)
3.下载模型和文件
-
下载模型和文件(2种方式任选一种)
import moxing as mox #引入包 复制代码
-
解压文件
!unzip first-order-motion-model.zip 复制代码
-
模版视频移动位置
!mv 02.mp4 first-order-motion-model/ 复制代码
4.替换变量运行程序
-
源文件代码解析
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_path = '/home/ma-user/work/first-order-motion-model/05.png' source_image_path = '/home/ma-user/work/05.png' source_image = imageio.imread(source_image_path) # 此处可替换为您的视频路径,这里默认为“蚂蚁牙黑” #reader_path = '/home/ma-user/work/first-order-motion-model/02.mp4' reader_path = '/home/ma-user/work/02.mp4' reader = imageio.get_reader(reader_path) 复制代码
调整图片和视频大小为 256×256
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.close() 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_path #源图片地址 reader_path #源视频地址 driving_video: 驱动视频,视频中人物的表情动作作为待迁移的对象。 source_image: 原始图片,视频中人物的表情动作将迁移到该原始图片中的人物上 。 relative: 指示程序中使用视频和图片中人物关键点的相对坐标还是绝对坐标,建议使用相对坐标,若使用绝对坐标,会导致迁移后人物扭曲变形。 adapt_scale: 根据关键点凸包自适应运动尺度。 复制代码
-
配置模型
from demo import load_checkpointsgenerator, kp_detector = load_checkpoints(config_path='config/vox-256.yaml', checkpoint_path='/home/ma-user/work/first-order-motion-model/vox-cpk.pth.tar') 复制代码
5、生成结果视频1-无声音
-
视频代码块
from demo import make_animationfrom skimage import img_as_ubytepredictions = 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()) 复制代码
6.生成结果视频2- 有声音
-
安装第三方包
# 安装视频剪辑神器 moviepy!pip install moviepy 复制代码
-
合成有声视频
# 为生成的视频加上源视频声音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") 复制代码
7.生成带水印视频
还可以给视频加水印video = VideoFileClip("../result.mp4")# 水印图片请自行上传
logo = (ImageClip("/home/ma-user/work/first-order-motion-model/water.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:
passreader.close()
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())```
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END