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

举报
张辉 发表于 2020/07/30 17:20:57 2020/07/30
【摘要】 走向拥有GT手表之路。

一、课程打卡

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


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

  2. 打开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模型对新视频的动作识别预测,,打卡的方法如下:


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

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

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

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

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

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



  6. 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')
  7. 这个路径可以在后台通过teminal命令看到:


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

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

  10. 作业的结果如下:

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



三、作业2打卡

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

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

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

      

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

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

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

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

  7. 然后继续按照提示继续执行,在执行到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


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



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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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