摘要:本文将介绍如何借力一站式 AI 开发平台,“傻瓜式”操作实现生成“蚂蚁牙黑“小视频。

作者:华为云EI专家胡琦

一夜之间,朋友圈都在“蚂蚁牙黑”!网友却担心......"Baby, don't worry, we have ModelArts!",是的,咱用 ModelArts 来制作,无需担心“有人模仿我的脸?”,也不用担心偌大的水印。不过,使用别人的脸可能真的有法律风险!本文将介绍如何借力一站式 AI 开发平台,“傻瓜式”操作实现生成“蚂蚁牙黑“小视频。

环境准备

ModelArts 和她的最佳搭档--对象存储服务 OBS ,您可以理解为是“网盘”,主要要来存放数据集、模型或其他文件。

ModelArtshttps://www.huaweicloud.com/product/modelarts.html AI开发平台ModelArts是面向开发者的一站式AI开发平台,为机器学习与深度学习提供海量数据预处理及半自动化标注、大规模分布式Training、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。

OBShttps://www.huaweicloud.com/product/obs.html
对象存储服务(Object Storage Service,OBS)提供海量、安全、高可靠、低成本的数据存储能力,可供用户存储任意类型和大小的数据。适合企业备份/归档、视频点播、视频监控等多种数据存储场景。

使用以上服务会有一定费用产生,或者您可以尝试认证为开发者会有一定代金券赠送,当然关注 ModelArts 和加入 ModelArts 开发者社区也会有机会获得大额代金券。

模型、素材准备

本次实现使用的是用于图像动画的一阶运动模型,这是一种基于关键点和局部仿射变换的图像动画方法,
论文地址:https://arxiv.org/abs/2003.00196

下载预训练模型及素材

最近手头紧,非常抱歉不能为大家提供 OBS 路径直接下载,我已将预训练模型及素材上传到 AI Gallery 数据集,请自行下载到您的 OBS 中。当然如果您有可快速下载的地址,欢迎分享!

源文件地址:https://drive.google.com/drive/folders/1kZ1gCnpfU0BnpdU47pLM_TQ6RypDDqgw?usp=sharing 或者https://drive.google.com/drive/folders/16inDpBRPT1UC0YMGMX3dKvRnOUsf5Dhn?usp=sharing 因为是源文件,因此不包含”蚂蚁牙黑“原视频素材,但我已添加至AI Gallery 数据集。如仍有需求,可以直接找我要,公众号:胡琦,WeChat:Hugi66;欢迎加入 ModelArts 开发者社区,广州地区的小伙伴可以加入我们共创 MDG 广州站哦!

AI Gallery 是在 ModelArts 的基础上构建的开发者生态社区,提供模型、算法、HiLens技能、数据集等内容的共享和交易。因此您可以下载分发的数据集或文件到您的 OBS ,使用时请遵守相应的政策和规则!打开 https://marketplace.huaweicloud.com/markets/aihub/datasets/detail/?content_id=00bc20c3-2a00-4231-bdfd-dfa3eb62a46d 点击下载按钮进入下载详情,设置 OBS 路径,确定下载即可将模型和素材下载到自己的 OBS 中,比如我路径是/modelarts-lab/first-order-motion-model。下载进度可以在 AI Gallery 个人中心-我的下载查看。

JUST DO IT -- ModelArts 我的笔记本

接下来开始使用 ModelArts--我的笔记本 ,即开即用的在线集成开发环境,可以轻松的构建、训练、调试、部署机器学习算法与模型。当前使用免费规格用于体验, 值得留意的是 72 小时内没有使用,会释放资源,因此需要注意文件备份。当然还可以使用 Notebook 免费算力,记得选择 GPU 环境哦!

当我们使用我的笔记本时默认开启的是 CPU 环境,因此我们需要切换到 GPU 环境。目前 ModelArts-我的笔记本 支持8 vCPU + 64 GiB + 1 x Tesla V100-PCIE-32GB。

新建Pytorch 1.0的.ipynb文件,开始我们的“蚂蚁呀嘿”体验之旅。

下载代码

!git clone https://github.com/AliaksandrSiarohin/first-order-model
# or
!git clone https://codehub.devcloud.cn-north-4.huaweicloud.com/ai-pome-free00001/first-order-model.git

github 速度慢,建议转存到华为云代码托管平台再拉取。

此处提供我已经缓存好的代码仓库地址,因此不再演示如何将 github 代码迁移到 codehub。(不保证我的账号欠费而无法访问,因此建议大家以自己的方式上传代码到 Notebook !)

利用 Moxing 拷贝文件到 JupyterLab,将之前下载到 OBS 中的模型和素材通过 Moxing 拷贝过来,此处注意替换为您的 OBS 路径。02.mp4是“蚂蚁呀嘿”的模版视频,

# 此处牛刀小试--用 Moxing 下载文件
import moxing as mox
# 此处需要替换您的 OBS 地址
mox.file.copy_parallel('obs://modelarts-lab/first-order-motion-model/first-order-motion-model-20210226T075740Z-001.zip' , 'first-order-motion-model.zip')
mox.file.copy_parallel('obs://modelarts-lab/first-order-motion-model/02.mp4' , '02.mp4')
# 解压
!unzip first-order-motion-model.zip
# 模版视频
!mv 02.mp4 first-order-motion-model/

  • JUST DO IT

准备工作完成之后,撸起袖子就是干!切换到first-order-model目录,然后将 source_image_path中的路径替换为”您的脸”所在的路径,脸的照片可以直接通过 Notebook 的文件上传功能上传。当然您还可以将默认的“蚂蚁牙黑”视频替换为您自定义的视频,格式为 mp4。一路执行可以查看到合成前的预览。

cd first-order-model
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.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())
  • 创建模型并加载 checkpoints

这一步完成之后,我们便得到了“蚂蚁呀嘿”的视频了--“generated.mp4”,这就结束了?不过,问题来了……

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())

  • 后续操作

如果您和我一样直接下载并打开上面操作的产物--generated.mp4,您一定会和我一样困惑:声音呢?是的,声音丢失了,因为核心代码只处理图像,声音需要我们自行找回,因为我们使用moviepy。不仅如此,我们还可以为视频加水印。

  • 安装 moviepy 为视频剪辑做准备

# 安装视频剪辑神器 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")

  • 别人花钱去水印,而我还要加水印,欢迎加入MDG!

# 还可以给视频加水印
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:
pass
reader.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())

至此,本次实现先告一段落,关于“多人运动”--合照的解决办法还没来得及探索,欢迎您在评论区分享指导,感谢!

本文分享自华为云社区《"蚂蚁牙黑",快用 ModelArts 自己实现一个!》,原文作者:胡琦 。

点击关注,第一时间了解华为云新鲜技术~

“蚂蚁牙黑”太火,想玩就用ModelArts做一个!的更多相关文章

  1. 玩个JAVA爬虫,没想玩大

    想玩个爬虫,爬些数据玩玩,不成想把自己玩“进去”了 想爬这个新浪的股票 大额交易页面 本以为用 HttpClient 直接爬链接,结果发现这个页面中,翻页数据压根就是动态赋值的,根本没有,那我根本无法 ...

  2. 想玩API,这些套路我来告诉你!

    小伙伴是不是时常听说各种api接口的问题呢,可能许多人第一感觉:那是什么个玩意儿,那么多人回去研究它,今天思梦PHP小编就来为你揭开他的神秘的面纱,先看一下百度百科上面的官方的解释: 其实说白了就是为 ...

  3. 朋友想玩下百度的ORC我鼓捣鼓捣thinkphp3集成百度sdk

    他想玩的是文字识别  那就玩下  咱们开始 1 先到百度文字识别  添加个应用  这样就有了APPID API KEY SECRET KEY https://console.bce.baidu.com ...

  4. 要想玩转FPGA,按这4个步骤来

    FPGA 作为一种高新技术,由于其结构的特殊性,可以重复编程,开发周期较短,越来越受到电子爱好者的青睐,其应用已经逐渐普及到了各行各业.因此,越来越多的学生或工程师都希望跨进FPGA的大门掌握这门技术 ...

  5. 媳妇儿喜欢玩某音中的动漫特效,那我就用python做一个图片转化软件。

    ​    最近某音上的动漫特效特别火,很多人都玩着动漫肖像,我媳妇儿也不例外.看着她这么喜欢这个特效,我决定做一个图片处理工具,这样媳妇儿的动漫头像就有着落了.编码    为了快速实现我们的目标,我们 ...

  6. 泥瓦匠想做一个与众不同的技术"匠"

    点击蓝字,关注泥瓦匠 本文阅读大约 3 分钟.感谢阅读 喝了最后一口百事可乐,想到它的 slogan:新一代的选择.新一代的选择,每个人选择不同,人生道路历程也不同.就像我刚毕业的时候,毕业选择不一样 ...

  7. “医疗信息化行业之中的联发科”- 我们在医疗行业中的定位及目标 想做一个面对中小企业的专业上游软件供应商 台湾联发科技颠覆掉的是一个封闭的手机产业系统 解决方案,即AgileHIS.NET数字化医院基础方案

    “医疗信息化行业之中的联发科”- 我们在医疗行业中的定位及目标   我们做中国医疗信息化行业之中的联发科 ---我们在医疗行业中的定位及目标 从我个人来讲,我从2001年到现在这10年之间基本上一直在 ...

  8. 【玩转PDF】贼稳,产品要做一个三方合同签署,我方了!

    一.前言 事情是这个样子的,小农的公司,之前有个功能需要签署来进行一系列的操作,于是我们引入了一个三方平台的签署--上上签,但是有一个比较尴尬的点就是,它不支持合同在浏览器上和附件一起预览的,我们想要 ...

  9. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

随机推荐

  1. 1155 Heap Paths

    题干前半略. Sample Input 1: 8 98 72 86 60 65 12 23 50   Sample Output 1: 98 86 23 98 86 12 98 72 65 98 72 ...

  2. - 迷宫问题 POJ - 3984 bfs记录路径并输出最短路径

    定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...

  3. WSL2 使用Docker运行.NET Core

    Docker的安装在前面说过了,此处就不说了,我们检查一下版本: 步入正题. 首先,我们为项目创建Dockerfile(无扩展名) 确保Docker是启动状态: 构建镜像,注意名称必须是全部小写(此处 ...

  4. CentOS6下mysql的安装与配置

    CentOS是免费的.开源的.可以重新分发的开源操作系统,CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一. ...

  5. transformers---FloatProgress not found. Please update jupyter and ipywidgets.

    问题 运行 huggingface transformers 的 demo,报错FloatProgress not found.具体如下: import torch from transformers ...

  6. 2018大都会赛 A Fruit Ninja【随机数】

    题目链接:戳这里 题意:一个平面里有n个点,问存不存在一条直线上有m个点,满足m >= n*x. 解题思路:0<x<1,且x小数点后只有1位,也就是说10*m > n.假设存在 ...

  7. sizeof和strlen在string类中的使用

    字符串的sizeof和strlen 考虑下面的问题: char a[] = "abcdef"; char b[20] = "abcdef"; string s ...

  8. MDN 文档高级操作进阶教程

    MDN 文档高级操作进阶教程 MDN 文档, 如何优雅的使用 MDN 文档上的富文本编辑器 pre & 语法高亮器 code & note box source code 上传附件 i ...

  9. Dart DevTools & Flutter

    Dart DevTools & Flutter https://flutter.dev/docs/development/tools/devtools/overview https://dar ...

  10. npm & app-node-env

    npm & app-node-env $ npm i -g app-node-env # OR $ yarn global add app-node-env demo $ ane env=ap ...