华为云2020 AI实战营 第六章 视频分析 打卡指南

网友投稿 582 2022-05-29

华为云2020 AI实战营 第六章 视频分析 打卡指南

一、课程打卡

课程内容为《6.3 使用OSVOS算法实现视频物体分割》,打卡的方法如下:

下载课程中提供的pdf文件。点击6.4课程打卡后,选择右边的“下载文档”

打开pdf文件,根据pdf的提示一一执行。关键内容是:打开 https://nbviewer.jupyter.org/ 网址:

在url位置贴入pdf中的 .ipynb结尾的文件名,点击Go。系统会弹出以下操作指导页面。

这个文档非常细致。逐一执行即可。

一般情况下,按照步骤执行应该能得到预期的结果。但是本节课有点例外,主要是因为ModelArts的免费盘只有5G,但是相关的文件已经非常大,在按照顺序执行操作的时候,走到下面的步骤时,系统会报错:

报错内容如下:

原因是空间不足导致解压不完整,造成tools 目录不存在引起的。

此时,可以将notebook空间的一些大文件删掉,比如那个第2步生成的400多M的whl文件,重新执行下载和终端命令即可。

真正的终端执行应该达到以下效果:

再进一步执行,就会得到课程打卡所要的效果:

二、作业1打卡

作业内容为 以《6.2 使用C3D和I3D模型实现视频作业识别》为基础,实现一段根据视频计算得到rgb.npy和flow.npy文件的代码,并跑通I3D模型对新视频的动作识别预测,,打卡的方法如下:

下载作业中提供的pdf文件。点击6.5作业打卡后,选择右边的“下载文档”;

下载作业中需要的C3D和I3D的课程pdf文件。点击6.2后,选择右边的“下载文档”;

根据第2步下载的文件,打开https://nbviewer.jupyter.org/ ,并在打开的链接中输入 https://github.com/huaweicloud/ModelArts-Lab/blob/master/notebook/DL_video_action_recognition/action_recognition.ipynb ,并点击Go。系统会弹出操作指导页面。

下载 https://ai-course-common-26-bj4.obs.cn-north-4.myhuaweicloud.com/video/compute_rgb_flow.py 这个文件。

根据操作指导页面逐一执行。其中在执行以下步骤21时:

增加一个cell(再上图红色位置),贴入第四步下载的代码,并在video path的地方填入视频文件的路径 :

import os import cv2 import time import numpy as np def get_video_info(video_path):     _, ext = os.path.splitext(video_path)     if not ext in ['.avi', '.mp4']:         raise ValueError('Extension "%s" not supported' % ext)     cap = cv2.VideoCapture(video_path)     if not cap.isOpened():         raise ValueError("Could not open the file.\n{}".format(video_path))     print('视频分辨率: %d x %d' % (cap.get(cv2.CAP_PROP_FRAME_WIDTH), cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))     print('视频帧率:', cap.get(cv2.CAP_PROP_FPS))     print('视频总帧数:', cap.get(cv2.CAP_PROP_FRAME_COUNT)) def compute_rgb(video_path):     """Compute RGB"""     rgb = []     vidcap = cv2.VideoCapture(video_path)     count = 0     while True:         success, frame = vidcap.read()         if success is True:             count += 1             # if count % 2 == 0:             #     continue             frame = cv2.resize(frame, (342, 256))             frame = (frame / 255.) * 2 - 1             frame = frame[16:240, 59:283]             rgb.append(frame)         else:             break     vidcap.release()     rgb = rgb[:-1]     rgb = np.asarray([np.array(rgb)]).astype(np.float32)     return rgb def compute_TVL1(video_path):     """Compute the TV-L1 optical flow."""     flow = []     TVL1 = cv2.DualTVL1OpticalFlow_create()  # for opencv version: 3.4.2.17     vidcap = cv2.VideoCapture(video_path)     success, frame1 = vidcap.read()     prev_frame = cv2.cvtColor(frame1, cv2.COLOR_RGB2GRAY)     vid_len = int(vidcap.get(cv2.CAP_PROP_FRAME_COUNT))     bins = np.linspace(-20, 20, num=256)     for count in range(0, vid_len - 1):         success, frame2 = vidcap.read()         count += 1         # if count % 2 == 0:         #     continue         curr_frame = cv2.cvtColor(frame2, cv2.COLOR_RGB2GRAY)         curr_flow = TVL1.calc(prev_frame, curr_frame, None)         assert (curr_flow.dtype == np.float32)         # Truncate large motions         curr_flow[curr_flow >= 20] = 20         curr_flow[curr_flow <= -20] = -20         # digitize and scale to [-1;1]         curr_flow = np.digitize(curr_flow, bins)         curr_flow = (curr_flow / 255.) * 2 - 1         # cropping the center         curr_flow = curr_flow[8:232, 48:272]         flow.append(curr_flow)         prev_frame = curr_frame     vidcap.release()     flow = np.asarray([np.array(flow)]).astype(np.float32)     return flow video_path = '/home/ma-user/work/dataset_subset/Bowling/v_Bowling_g05_c01.avi'  # TODO,填写视频所在的路径 save_dir = os.path.dirname(video_path) + '_out' if not os.path.exists(save_dir):     os.mkdir(save_dir) get_video_info(video_path) start_time = time.time() print('Extract RGB...') rgb = compute_rgb(video_path) print('save rgb with shape ', rgb.shape) rgb_save_path = os.path.join(save_dir, os.path.basename(video_path).split('.')[0] + '_rgb.npy') np.save(rgb_save_path, rgb) print('Compute rgb in sec: ', time.time() - start_time) start_time = time.time() print('Extract Flow...') flow = compute_TVL1(video_path) print('Save flow with shape ', flow.shape) flow_save_path = os.path.join(save_dir, os.path.basename(video_path).split('.')[0] + '_flow.npy') np.save(flow_save_path, flow) print('Compute flow in sec: ', time.time() - start_time) print('save rgb npy at:', rgb_save_path) print('save flow npy at:', flow_save_path) print('Compute Success')

这个路径可以在后台通过teminal命令看到:

在以上步骤执行完后,修改下一步的内容,如图所示:(上一步执行结果的视频总帧数减一,如115-》114,save rgb npy和save flow npy的路径也贴入 _SAMPLE_PATHS里面)

然后继续执行以下步骤一直到最后。

作业的结果如下:

如上图所示,最后的视频动作识别结果为bowling。

三、作业2打卡

作业内容为 以《6.3 使用OSVOS算法实现视频物体分割》为基础,并换成breakdance数据集跑通整个案例。

仍然按照 课程打卡的方式(第1步和第2步)打开操作指导页面。

将步骤第2个cell的 seq_name改为breakdance

在第4个cell可以看出相关的结果变化:

测试模型的存储位置也发生了变化:

视频分隔结果也显示相关变化:

为避免犯跟课程打卡同样的错误,此时直接删除大文件:

然后继续按照提示继续执行,在执行到terminal命令的时候,记得把flamingo都换成breakdance:python tools/video_inpaint.py --frame_dir ../OSVOS-PyTorch/DAVIS_2016/JPEGImages/480p/breakdance --MASK_ROOT ../OSVOS-PyTorch/DAVIS_2016/Annotations/480p/breakdance --img_size 512 832 --FlowNet2 --DFC --ResNet101 --Propagation --enlarge_mask

继续依次执行,直到出现作业结果:

希望同学们能圆满完成以上打卡。感觉GT手表就在眼前。。。

AI开发平台ModelArts EI企业智能

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:JVM笔记-前端编译与优化
下一篇:《C++代码整洁之道:C++17 可持续软件开发模式实践》 —1 简  介
相关文章