张小白带您跟随胡琦大大一起做蚂蚁牙黑Part One:张小白的模仿
胡琦 大大的 《"蚂蚁牙黑",快用 ModelArts 自己实现一个!》 https://bbs.huaweicloud.com/blogs/245794 一发表,就受到了广泛的关注,张小白也不例外。那就跟随胡大大的脚步来一次Ant Teeth Black or not的旅行吧。。。
(关于蚂蚁牙黑的科学解释如下:蚂蚁没有牙齿,但是它有个跟牙齿类似的东西,叫做“腭”,有时候它是褐色的。。。 https://www.zhihu.com/question/318850248/answer/643027444 )。
Part One :张小白的模仿
点击 https://marketplace.huaweicloud.com/markets/aihub/datasets/detail/?content_id=00bc20c3-2a00-4231-bdfd-dfa3eb62a46d 打开胡大大提供的模型和素材,点击下载:
选择目标区域为 北京4,目标位置——自己去新建一个桶。
桶名为 ant-teeth-black-or-not
张小白有个多AZ的套餐,就选择多AZ存储的吧。(华为云的OBS真心不是很贵,我当时27元包了3年。。。吐血推荐一下。。)
点击立即创建
点击确定。
返回前一页面,刷新桶列表,选择刚才新建的桶
在该桶下新建文件夹 first-order-motion-model
确定后完成下载。
耐心等待下载完毕。
下载后的文件如下:
到华为云代码仓去clone github的代码仓。
到devcloud.huaweicloud.com
(注意选择 北京4,跟OBS一致)点击新建项目。
新建个Scrum项目:AntTeech
点击-代码-代码托管
选择“普通新建“右边向下箭头,选择“导入外部仓库”https://github.com/AliaksandrSiarohin/first-order-model.git
下一步。
确定后导入仓库。
等了好久,貌似 华为云抓 github的代码不大靠谱。。。
啥也没抓下来。
果断换成gitee过渡:
输入 https://github.com/AliaksandrSiarohin/first-order-model.git
原来已经有人导入过了。。。那就用gitee提供的地址吧
https://gitee.com/tao_buaa/first-order-model.git
回到devcloud的代码托管
新建一个导入:
下一步:
将代码仓改为 first-order-model-gitee
点击确定。
耐心等待代码导入的结果吧。。。
这个真的很快。。。(BTW:华为devcloud的大大们,是不是可以考虑研究下为啥你们从github同步东西慢了。。。难道是因为不如gitee吗?)
前面那个导入给了个惊叹号,看来是同步不了了。。。
胡大大的ModelArts的开发工具页面有个“我的笔记本Beta”:
然而张小白的ModelArts中并没有。
感觉被歧视了。。。。但是顽强的张小白没有打退堂鼓,他坚持认为:开发环境——NodeBook也是可以的:
于是开始创建新的Notebook
名称为notebook-ant-teech
工作环境:Pytorch 1.0.0
类型:GPU
规格:选择限制免费或者 第二个 0元的。。。
存储位置:选择前面建好的OBS的地址。
确定后
再下一步
(请注意圈圈里面的部分。AI真花钱。。。)
点击提交。
进入Notebook
打开hello.ipynb
胡大大提供的脚本做的真不错。现在看看感觉只需要把里面的若干路径改为自己建立的仓库地址和OBS地址就可以跑通了。。
找到自己刚才导入的那个Devcloud的代码仓地址,并复制地址
准备下载代码
!git clone https://codehub.devcloud.cn-north-4.huaweicloud.com/myyh00001/first-order-model-gitee.git
居然要用户名和密码,看来要设置下 ModelArts读Devcloud的权限吧。。早知道当时创建的时候将代码仓变成公开的了。。。
张小白暂时不想解决这个问题(其实也能解决)。想想反正代码都是一个源头,那就用胡大大提供的地址做clone吧。
OBS这块倒是自己从AI Gallary下载的,那就用张小白自己的吧:
# 此处牛刀小试--用 Moxing 下载文件
import moxing as mox
# 此处需要替换您的 OBS 地址
#mox.file.copy_parallel('obs://huqi88/first-order-motion-model-20210226T075740Z-001.zip' , 'first-order-motion-model.zip')
mox.file.copy_parallel('obs://ant-teeth-black-or-not/first-order-motion-model/first-order-motion-model-20210226T075740Z-001.zip' , 'first-order-motion-model.zip')
将那个有快2个G的zip文件解压:
cd的目录改一下
模板视频拷贝过来
mox.file.copy_parallel('obs://ant-teeth-black-or-not/first-order-motion-model/02.mp4' , '02.mp4')
用windows的自带画图,做一张张学友的256X256的头像
直接上传到notebook
到notebook拷贝这个文件,命名为02.png
mox.file.copy_parallel('obs://ant-teeth-black-or-not/first-order-motion-model/zhangxiaobai.png' , '02.png')
这样下面脚本的文件名就不用动了。。。(张小白你真懒。。。答:有AI为啥要那么勤快?)
然而,
执行核心代码的时候报错了。说找不到demo模块。。。。
经胡大大亲自指点,这个demo模块就在git clone的那个目录。。。张小白本想继续搞下去,后来想想,JupyterLab好像不错,应该玩一玩。结果就暂停上面的操作,准备用JupyterLab去搞定这一切。
于是张小白重新启动了notebook:(所谓重新启动就是先停止,再启动。。)
并且点击打开JupyterLab,在JupyterLab窗口重新打开刚才的hello.ipynb
第一步:下载代码仓
#!git clone https://codehub.devcloud.cn-north-4.huaweicloud.com/myyh00001/first-order-model-gitee.git
!git clone https://codehub.devcloud.cn-north-4.huaweicloud.com/ai-pome-free00001/first-order-model.git
第二步:拷贝模型和素材包
# 此处牛刀小试--用 Moxing 下载文件
import moxing as mox
# 此处需要替换您的 OBS 地址
#mox.file.copy_parallel('obs://huqi88/first-order-motion-model-20210226T075740Z-001.zip' , 'first-order-motion-model.zip')
mox.file.copy_parallel('obs://ant-teeth-black-or-not/first-order-motion-model/first-order-motion-model-20210226T075740Z-001.zip' , 'first-order-motion-model.zip')
解压素材包:
# 解压
!unzip first-order-motion-model.zip
关键的地方来了,进入代码仓主目录
cd first-order-model
从OBS拷贝 蚂蚁牙黑原视频,张小白上传的 张学友的图片(256X256),以及张小白的微信头像(作为水印)
mox.file.copy_parallel('obs://ant-teeth-black-or-not/first-order-motion-model/02.mp4' , '02.mp4')
mox.file.copy_parallel('obs://ant-teeth-black-or-not/first-order-motion-model/zhangxiaobai.png' , '02.png')
mox.file.copy_parallel('obs://ant-teeth-black-or-not/first-order-motion-model/water.png' , 'water.png')
加载、处理和预览视频和图片:
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-model/02.png'
source_image = imageio.imread(source_image_path)
# 此处可替换为您的视频路径,这里默认为“蚂蚁牙黑”
reader_path = '/home/ma-user/work/first-order-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)
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.close()
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
加上音频:
# 为生成的视频加上源视频声音
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-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")
将文件传回OBS
mox.file.copy_parallel('../result.mp4','obs://ant-teeth-black-or-not/first-order-motion-model/result.mp4' )
mox.file.copy_parallel('../result_water.mp4','obs://ant-teeth-black-or-not/first-order-motion-model/result_water.mp4' )
回到OBS页面将其下载下来:
在JupterLab上的操作简直有如神助,一气呵成。。。
打开看看结果
没水印的。。
有水印的:
完美!真佩服胡大大。。教程做得呱呱叫。。张小白五体投地。
(未完待续)
- 点赞
- 收藏
- 关注作者
评论(0)