MindSpore21天实战营(4)使用ModelArts和YoloV3-DarkNet50预训练模型实现篮球检测

网友投稿 720 2022-05-30

2020年初,科比意外去世,

让我们回到20年前。。。

2000年,乔丹体育注册。

2003年,乔丹退役。

2012年,乔丹起诉乔丹体育失败;

2016年,乔丹体育的乔丹商标被撤销,QIAODAN商标允许继续使用。。。

-------------------以上都是插曲,我们这节实战营的主角是Yolo。

yolo算法堪称目标检测史上的巨作。。。我们来随便搜篇评价。。。。

所以无论是基于ModelArts的 2020 AI实战营,还是张小白自制的 Atlas 200DK实践教程(好像听起来有点高大上),还是这次的MindSpore 21天培训,玩转Yolo是少不了的。

张小白的那篇文字:  Atlas 200DK系统折腾纪实:(3)强大的yolo3物体检测——你想看的内容已被系统提取  讲述了Atlas 200DK的用户如何使用yolo识别出小姐姐(下图1),以及小姐姐宁可在什么上哭的那个豪车的(下图2)。

既然能识别PC(Person & Car),那么识别篮球比赛中的选手应该也没啥问题吧。。让我们实际来感受一下吧。。。

一、体验作业

体验作业的内容是使用yolo算法对一张篮球比赛的图片进行推理,分析出图片中的篮球队员及其动作(可能是进攻、防守、走路、跑步、盖帽、摔跤。。。之类的动作吧)

先去 体验作业一键下载包

在obs现有的 mindspore-21day-tutorials 桶上建立yoloV3目录(关于OBS桶的购买和创建方法恕不赘述,可自行看文档)

将一键下载包解压,上传到自建的yoloV3目录下。

耐心等待470M的多个文件传输完毕。。其中:

ckpt_files 存放预训练模型

log存放日志

yolov3存放python脚本

basketball-dataset存放数据集(目前只有测试的一张图片,因为我们下面会直接进行推理训练。。)

output存放推理的结果图片

待测试的图片如下:

我们来具体操作吧。。。

进入ModelArts控制台的训练作业菜单 https://console.huaweicloud.com/modelarts/?region=cn-north-4#/trainingJobs

创建推理的训练作业:

其中checkpoint_path设置为 s3:///mindspore-21day-tutorials/yoloV3/ckpt_files/yolov3-320_168000.ckpt

其他都按照图例录入就好。

点击下一步,

确认后提交训练作业。

经过1分33秒后(也许还要加上排队的时间)训练成功,从下图的日志可以看出它已经上传了推理的结果文件。

将obs的输出目录output的结果文件下载到本地。

下载并打开这个文件:

可见篮球队员都已被标注(包括其动作——站立还是行走。。)

二、进阶作业

进阶作业要求找一段篮球比赛的视频,将其转成带以上标注的视频(你就想象成给视频加个字幕啥的。。。)

张小白对此做了一点分析:其实进阶作业和体验作业的区别,就是一头一尾加了东西。

头上,输入 input.mp4,调用opencv将该视频文件转为 图片。

尾上,输入 解析好的各个图片,调用opencv将图片序列转成MP4视频——output.mp4

这个可以有几种做法,张小白用自以为最简单的做法——全部在自己的笔记本电脑上完成视频的头尾转换(视频-》图片,图片-》视频)

这样子中间的照片序列全部上传OBS,就可以使用体验作业的方法完成每张篮球比赛图片的推理任务就可以了。

这样的做法,至少可以保证不是每次视频转换失败后,都要重跑推理任务。

先准备篮球比赛,有朋友说用抓屏软件EVCapture什么的,其实我们有手机啊。。手机拍视频不是最拿手吗?(当然也可以用手机截屏软件直接录体育视频)

将拍好的视频发给微信朋友,另一边使用PC版微信另存为,就可以获得input.mp4这个文件了。

张小白录了30秒的乔丹视频。。

视频搞定。

第二件事情就是将视频转换为图片,参考 进阶作业 的要求。。。

使用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)) # 获取视频帧数 frame_num = cap.get(7) # type(frame_num) # 由于frame_num是foat型,需要int()转换 # 逐帧获取图片 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()

执行上述python脚本:python video2jpg.py

可以看到图片已经生成:从match_snapshot0.jpg到match_snapshot912.jpg ,30秒的文件居然有 913张之多。。

我们把这些文件上传到 原来体验作业的 test数据集的目录下。

然后重新跑原来的推理训练作业——打开原来的yolo推理训练作业:

点击上图箭头所指的”修改“:

确认下数据来源的位置,直接点确定。。训练作业将重新开展。(不过输出的图片文件应该放在了 output的V0002目录下,这是增加了一个版本号的目录。)

推理训练成功了,花了39秒。。。

但是太快了,总觉得哪里不对。

是的,去OBS一看,只处理了一个图片,生成了一个output.jpg,就结束了。

看来还是得修改推理的python代码:/mindspore-21day-tutorials/yoloV3/yolov3/predict.py

我们还是在本地PyCharm下看一下predict.py是怎么处理的吧。先将这个名字改为 predict_multi.py

其中这里参考了 @胡琦 大大的  [干货分享] MindSpore21天实战营(4):基于YOLOv3实现篮球检测模型实战  https://bbs.huaweicloud.com/forum/thread-86386-1-1.html 的处理:

在原来处理单个图片的流程中,加个for循环遍历该路径下的所有图片文件就可以了。。

将predict_multi.py传到OBS中的 源代码yolov3目录下。

再次重新编辑前面的推理训练作业:将启动文件改为新传的文件predict_multi.py

确定后运行作业,执行脚本。。

看到start inference...就知道在推理了。。

张小白在前面链接的博客中提到的。yoloV3就是416X416.。。

说明在跑了。。。有913个推理要跑呢。。。花了22分25秒。图片推理结束了。。。

OBS的output桶里面也放满了输出的图片:

MindSpore21天实战营(4)使用ModelArts和YoloV3-DarkNet50预训练模型实现篮球检测

将OBS的输出的目录下载,并拷贝到python工程目录的images-out目录下。(区分 image的原图片)

(貌似推理得也不是非常精确。。有的人推到了,有的人没推到。。。)

接着编写 合成视频的python脚本 jpg2video.py。

# 要转换的图片的保存地址,按顺序排好,后面会一张一张按顺序读取。 import glob import cv2 # import numpy as np # cv2.__version__ convert_image_path = 'images-out' frame_rate = 30 # 帧率(fps),尺寸(size),size为图片的大小,本文转换的图片大小为1920×1080, # 即宽为1920,高为1080,要根据自己的情况修改图片大小。 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了脚本。。发现fps=30.

一开始使用这个脚本,执行的时候报如下错误:

查了下,原来参数 I420有误,改为 MP4V。。。就成功转换成output.mp4了。。

这是输出mp4的截屏:

从上图可以看出,还是有很多图片是无法识别出人(可能是因为视频转图片的时候图片就比较糊),或者有可能出现密集框识别的情况。

这可能需要调参才能优化。不过张小白急着交作业,这块就暂时没搞了。等有时间,可以好好做个优化。(如果自己能学会怎么优化的话)。

(全文完,谢谢阅读)

EI企业智能 AI开发平台ModelArts 昇腾 Python MindSpore

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

上一篇:如何创建您的第一个Python元类?
下一篇:【第一个java程序】doc命令是什么?
相关文章