张小白带您跟随胡琦大大一起做蚂蚁牙黑Part One:张小白的模仿

举报
张辉 发表于 2021/03/07 22:59:33 2021/03/07
【摘要】 本篇仅仅是按照胡大大的博客操作了一番。没啥技术含量。

胡琦 大大的 《"蚂蚁牙黑",快用 ModelArts 自己实现一个!》 https://bbs.huaweicloud.cn/blogs/245794 一发表,就受到了广泛的关注,张小白也不例外。那就跟随胡大大的脚步来一次Ant Teeth Black or not的旅行吧。。。

(关于蚂蚁牙黑的科学解释如下:蚂蚁没有牙齿,但是它有个跟牙齿类似的东西,叫做“腭”,有时候它是褐色的。。。  https://www.zhihu.com/question/318850248/answer/643027444  )。

Part One :张小白的模仿

点击 https://marketplace.huaweicloud.cn/markets/aihub/datasets/detail/?content_id=00bc20c3-2a00-4231-bdfd-dfa3eb62a46d 打开胡大大提供的模型和素材,点击下载

image.png

选择目标区域为 北京4,目标位置——自己去新建一个桶。

image.png

桶名为 ant-teeth-black-or-not

张小白有个多AZ的套餐,就选择多AZ存储的吧。(华为云的OBS真心不是很贵,我当时27元包了3年。。。吐血推荐一下。。)

image.png

点击立即创建

image.png

点击确定

返回前一页面,刷新桶列表,选择刚才新建的桶 

image.png

在该桶下新建文件夹 first-order-motion-model

image.png

image.png


确定后完成下载。

耐心等待下载完毕。

image.png

下载后的文件如下:

image.png


到华为云代码仓去clone github的代码仓。

到devcloud.huaweicloud.cn

image.png

(注意选择 北京4,跟OBS一致)点击新建项目

新建个Scrum项目:AntTeech

image.png

点击-代码-代码托管

image.png

选择“普通新建“右边向下箭头,选择“导入外部仓库https://github.com/AliaksandrSiarohin/first-order-model.git 

image.png


下一步

image.png

确定后导入仓库。

等了好久,貌似 华为云抓 github的代码不大靠谱。。。

image.png

啥也没抓下来。

果断换成gitee过渡:

image.png

输入 https://github.com/AliaksandrSiarohin/first-order-model.git  

image.png

原来已经有人导入过了。。。那就用gitee提供的地址吧

https://gitee.com/tao_buaa/first-order-model.git

回到devcloud的代码托管

新建一个导入:

image.png

下一步

将代码仓改为 first-order-model-gitee

image.png

点击确定

耐心等待代码导入的结果吧。。。

image.png

这个真的很快。。。(BTW:华为devcloud的大大们,是不是可以考虑研究下为啥你们从github同步东西慢了。。。难道是因为不如gitee吗?)

前面那个导入给了个惊叹号,看来是同步不了了。。。

image.png

胡大大的ModelArts的开发工具页面有个“我的笔记本Beta”:

image.png

然而张小白的ModelArts中并没有。

image.png

感觉被歧视了。。。。但是顽强的张小白没有打退堂鼓,他坚持认为:开发环境——NodeBook也是可以的:

image.png

于是开始创建新的Notebook

image.png

名称为notebook-ant-teech

工作环境:Pytorch 1.0.0

类型:GPU

规格:选择限制免费或者 第二个 0元的。。。

存储位置:选择前面建好的OBS的地址。

image.png

确定

image.png


下一步

image.png

(请注意圈圈里面的部分。AI真花钱。。。)

点击提交

image.png

进入Notebook

image.png


打开hello.ipynb

image.png

胡大大提供的脚本做的真不错。现在看看感觉只需要把里面的若干路径改为自己建立的仓库地址和OBS地址就可以跑通了。。

找到自己刚才导入的那个Devcloud的代码仓地址,并复制地址

image.png

准备下载代码

!git clone https://codehub.devcloud.cn-north-4.huaweicloud.cn/myyh00001/first-order-model-gitee.git

image.png

居然要用户名和密码,看来要设置下 ModelArts读Devcloud的权限吧。。早知道当时创建的时候将代码仓变成公开的了。。。

张小白暂时不想解决这个问题(其实也能解决)。想想反正代码都是一个源头,那就用胡大大提供的地址做clone吧。

image.png

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

image.png

将那个有快2个G的zip文件解压:

image.png

cd的目录改一下

image.png

模板视频拷贝过来

mox.file.copy_parallel('obs://ant-teeth-black-or-not/first-order-motion-model/02.mp4' , '02.mp4')

image.png

用windows的自带画图,做一张张学友的256X256的头像

image.png

直接上传到notebook

image.png

到notebook拷贝这个文件,命名为02.png

mox.file.copy_parallel('obs://ant-teeth-black-or-not/first-order-motion-model/zhangxiaobai.png' , '02.png')

image.png

这样下面脚本的文件名就不用动了。。。(张小白你真懒。。。答:有AI为啥要那么勤快?)

image.png

image.png

然而,

执行核心代码的时候报错了。说找不到demo模块。。。。

image.png

经胡大大亲自指点,这个demo模块就在git clone的那个目录。。。张小白本想继续搞下去,后来想想,JupyterLab好像不错,应该玩一玩。结果就暂停上面的操作,准备用JupyterLab去搞定这一切。

于是张小白重新启动了notebook:(所谓重新启动就是先停止,再启动。。)

image.png

并且点击打开JupyterLab,在JupyterLab窗口重新打开刚才的hello.ipynb

image.png

第一步:下载代码仓

#!git clone https://codehub.devcloud.cn-north-4.huaweicloud.cn/myyh00001/first-order-model-gitee.git
!git clone https://codehub.devcloud.cn-north-4.huaweicloud.cn/ai-pome-free00001/first-order-model.git

image.png

第二步:拷贝模型和素材包

# 此处牛刀小试--用 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')

image.png

解压素材包:

# 解压
!unzip first-order-motion-model.zip

image.png

关键的地方来了,进入代码仓主目录

cd first-order-model

image.png

从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')

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

image.png

image.png

加载模型

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

image.png

生成结果视频:

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

image.png

后两个是动的:

image.png


安装视频频编辑神器

# 安装视频剪辑神器 moviepy
!pip install moviepy

image.png


加上音频

# 为生成的视频加上源视频声音
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")

image.png

加上水印

# 还可以给视频加水印
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")

image.png

将文件传回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' )

image.png

回到OBS页面将其下载下来

image.png

在JupterLab上的操作简直有如神助,一气呵成。。。

image.png

打开看看结果

没水印的。。

image.png

有水印的:

image.png

完美!真佩服胡大大。。教程做得呱呱叫。。张小白五体投地。

(未完待续)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。