MindSpore21天實戰(zhàn)營(4)使用ModelArts和YoloV3-DarkNet50預(yù)訓(xùn)練模型實現(xiàn)籃球檢測
2020年初,科比意外去世,
讓我們回到20年前。。。
2000年,喬丹體育注冊。
2003年,喬丹退役。
2012年,喬丹起訴喬丹體育失敗;
2016年,喬丹體育的喬丹商標被撤銷,QIAODAN商標允許繼續(xù)使用。。。
-------------------以上都是插曲,我們這節(jié)實戰(zhàn)營的主角是Yolo。
yolo算法堪稱目標檢測史上的巨作。。。我們來隨便搜篇評價。。。。
所以無論是基于ModelArts的 2020 AI實戰(zhàn)營,還是張小白自制的 Atlas 200DK實踐教程(好像聽起來有點高大上),還是這次的MindSpore 21天培訓(xùn),玩轉(zhuǎn)Yolo是少不了的。
張小白的那篇文字:??Atlas 200DK系統(tǒng)折騰紀實:(3)強大的yolo3物體檢測——你想看的內(nèi)容已被系統(tǒng)提取 ?講述了Atlas 200DK的用戶如何使用yolo識別出小姐姐(下圖1),以及小姐姐寧可在什么上哭的那個豪車的(下圖2)。
既然能識別PC(Person & Car),那么識別籃球比賽中的選手應(yīng)該也沒啥問題吧。。讓我們實際來感受一下吧。。。
一、體驗作業(yè)
體驗作業(yè)的內(nèi)容是使用yolo算法對一張籃球比賽的圖片進行推理,分析出圖片中的籃球隊員及其動作(可能是進攻、防守、走路、跑步、蓋帽、摔跤。。。之類的動作吧)
先去?體驗作業(yè)一鍵下載包
在obs現(xiàn)有的?mindspore-21day-tutorials 桶上建立yoloV3目錄(關(guān)于OBS桶的購買和創(chuàng)建方法恕不贅述,可自行看文檔)
將一鍵下載包解壓,上傳到自建的yoloV3目錄下。
耐心等待470M的多個文件傳輸完畢。。其中:
ckpt_files 存放預(yù)訓(xùn)練模型
log存放日志
yolov3存放python腳本
basketball-dataset存放數(shù)據(jù)集(目前只有測試的一張圖片,因為我們下面會直接進行推理訓(xùn)練。。)
output存放推理的結(jié)果圖片
待測試的圖片如下:
我們來具體操作吧。。。
進入ModelArts控制臺的訓(xùn)練作業(yè)菜單?https://console.huaweicloud.com/modelarts/?region=cn-north-4#/trainingJobs
創(chuàng)建推理的訓(xùn)練作業(yè):
其中checkpoint_path設(shè)置為?s3:///mindspore-21day-tutorials/yoloV3/ckpt_files/yolov3-320_168000.ckpt
其他都按照圖例錄入就好。
點擊下一步,
確認后提交訓(xùn)練作業(yè)。
經(jīng)過1分33秒后(也許還要加上排隊的時間)訓(xùn)練成功,從下圖的日志可以看出它已經(jīng)上傳了推理的結(jié)果文件。
將obs的輸出目錄output的結(jié)果文件下載到本地。
下載并打開這個文件:
可見籃球隊員都已被標注(包括其動作——站立還是行走。。)
二、進階作業(yè)
進階作業(yè)要求找一段籃球比賽的視頻,將其轉(zhuǎn)成帶以上標注的視頻(你就想象成給視頻加個字幕啥的。。。)
張小白對此做了一點分析:其實進階作業(yè)和體驗作業(yè)的區(qū)別,就是一頭一尾加了東西。
頭上,輸入 input.mp4,調(diào)用opencv將該視頻文件轉(zhuǎn)為 圖片。
尾上,輸入 解析好的各個圖片,調(diào)用opencv將圖片序列轉(zhuǎn)成MP4視頻——output.mp4
這個可以有幾種做法,張小白用自以為最簡單的做法——全部在自己的筆記本電腦上完成視頻的頭尾轉(zhuǎn)換(視頻-》圖片,圖片-》視頻)
這樣子中間的照片序列全部上傳OBS,就可以使用體驗作業(yè)的方法完成每張籃球比賽圖片的推理任務(wù)就可以了。
這樣的做法,至少可以保證不是每次視頻轉(zhuǎn)換失敗后,都要重跑推理任務(wù)。
先準備籃球比賽,有朋友說用抓屏軟件EVCapture什么的,其實我們有手機啊。。手機拍視頻不是最拿手嗎?(當然也可以用手機截屏軟件直接錄體育視頻)
將拍好的視頻發(fā)給微信朋友,另一邊使用PC版微信另存為,就可以獲得input.mp4這個文件了。
張小白錄了30秒的喬丹視頻。。
視頻搞定。
第二件事情就是將視頻轉(zhuǎn)換為圖片,參考 進階作業(yè) 的要求。。。
使用PyCharm在本地運行 video2jpg.py文件:
此時input.mp4存入跟py文件相同的目錄下。并新建一個images的目錄存放解析后的圖片序列。
"""從視頻逐幀讀取圖片""" import?glob import?cv2 import?numpy?as?np cv2.__version__ #?讀取視頻文件 cap?=?cv2.VideoCapture('./input.mp4') #?獲取視頻幀率(30p/60p) frame_rate?=?round(cap.get(5)) #?獲取視頻幀數(shù) frame_num?=?cap.get(7) #?type(frame_num) #?由于frame_num是foat型,需要int()轉(zhuǎn)換 #?逐幀獲取圖片 for?i?in?range(int(frame_num)): ????ret,?frame?=?cap.read() ????cv2.imwrite('images\match_snapshot%d.jpg'?%?i,?frame) np.shape(frame) cap.release() cv2.destroyAllWindows()
執(zhí)行上述python腳本:python video2jpg.py
可以看到圖片已經(jīng)生成:從match_snapshot0.jpg到match_snapshot912.jpg ,30秒的文件居然有 913張之多。。
我們把這些文件上傳到 原來體驗作業(yè)的 test數(shù)據(jù)集的目錄下。
然后重新跑原來的推理訓(xùn)練作業(yè)——打開原來的yolo推理訓(xùn)練作業(yè):
點擊上圖箭頭所指的”修改“:
確認下數(shù)據(jù)來源的位置,直接點確定。。訓(xùn)練作業(yè)將重新開展。(不過輸出的圖片文件應(yīng)該放在了 output的V0002目錄下,這是增加了一個版本號的目錄。)
推理訓(xùn)練成功了,花了39秒。。。
但是太快了,總覺得哪里不對。
是的,去OBS一看,只處理了一個圖片,生成了一個output.jpg,就結(jié)束了。
看來還是得修改推理的python代碼:/mindspore-21day-tutorials/yoloV3/yolov3/predict.py
我們還是在本地PyCharm下看一下predict.py是怎么處理的吧。先將這個名字改為?predict_multi.py
其中這里參考了 @胡琦 大大的??[干貨分享] MindSpore21天實戰(zhàn)營(4):基于YOLOv3實現(xiàn)籃球檢測模型實戰(zhàn)??https://bbs.huaweicloud.com/forum/thread-86386-1-1.html?的處理:
在原來處理單個圖片的流程中,加個for循環(huán)遍歷該路徑下的所有圖片文件就可以了。。
將predict_multi.py傳到OBS中的 源代碼yolov3目錄下。
再次重新編輯前面的推理訓(xùn)練作業(yè):將啟動文件改為新傳的文件predict_multi.py
確定后運行作業(yè),執(zhí)行腳本。。
看到start inference...就知道在推理了。。
張小白在前面鏈接的博客中提到的。yoloV3就是416X416.。。
說明在跑了。。。有913個推理要跑呢。。。花了22分25秒。圖片推理結(jié)束了。。。
OBS的output桶里面也放滿了輸出的圖片:
將OBS的輸出的目錄下載,并拷貝到python工程目錄的images-out目錄下。(區(qū)分 image的原圖片)
(貌似推理得也不是非常精確。。有的人推到了,有的人沒推到。。。)
接著編寫 合成視頻的python腳本 jpg2video.py。
#?要轉(zhuǎn)換的圖片的保存地址,按順序排好,后面會一張一張按順序讀取。 import?glob import?cv2 #?import?numpy?as?np #?cv2.__version__ convert_image_path?=?'images-out' frame_rate?=?30 #?幀率(fps),尺寸(size),size為圖片的大小,本文轉(zhuǎn)換的圖片大小為1920×1080, #?即寬為1920,高為1080,要根據(jù)自己的情況修改圖片大小。 size?=?(960,?544) fourcc?=?cv2.VideoWriter_fourcc('M',?'P',?'4',?'V')?#?mp4 #?cv2.VideoWriter_fourcc('I',?'4',?'2',?'0') videoWriter?=?cv2.VideoWriter('output.mp4',?fourcc, ??????????????????????????????frame_rate,?size) for?img?in?glob.glob(convert_image_path?+?"/*.jpg"): ????read_img?=?cv2.imread(img) ????videoWriter.write(read_img) videoWriter.release()
這里frame_rate要取當時 video2jpg時的 fps,所以張小白還特意重新在 view2jpg.py中加了代碼,然后重run了腳本。。發(fā)現(xiàn)fps=30.
一開始使用這個腳本,執(zhí)行的時候報如下錯誤:
查了下,原來參數(shù) I420有誤,改為 MP4V。。。就成功轉(zhuǎn)換成output.mp4了。。
這是輸出mp4的截屏:
從上圖可以看出,還是有很多圖片是無法識別出人(可能是因為視頻轉(zhuǎn)圖片的時候圖片就比較糊),或者有可能出現(xiàn)密集框識別的情況。
這可能需要調(diào)參才能優(yōu)化。不過張小白急著交作業(yè),這塊就暫時沒搞了。等有時間,可以好好做個優(yōu)化。(如果自己能學(xué)會怎么優(yōu)化的話)。
(全文完,謝謝閱讀)
EI企業(yè)智能 AI開發(fā)平臺ModelArts 昇騰 Python MindSpore
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。