華為云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小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。