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

举报
张辉 发表于 2020/11/08 09:07:34 2020/11/08
【摘要】 本文介绍了如何使用ModelArts和MindSpore环境进行YoloV3-DarkNet50篮球比赛检测。

2020年初,科比意外去世,

让我们回到20年前。。。

2000年,乔丹体育注册。

2003年,乔丹退役。

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

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

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


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


image.png

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


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


image.png


image.png


image.png


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


一、体验作业

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

先去 体验作业一键下载包 

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

image.png

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

image.png

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

  • ckpt_files 存放预训练模型

  • log存放日志

  • yolov3存放python脚本

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

  • output存放推理的结果图片

待测试的图片如下:

image.png


我们来具体操作吧。。。

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

image.png

创建推理的训练作业:

image.png

image.png

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

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

点击下一步, 

image.png

确认后提交训练作业。

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

image.png

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

image.png

下载并打开这个文件:

image.png

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


二、进阶作业

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


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

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

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

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

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

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


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

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

image.png

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

image.png

视频搞定。


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

使用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

image.png


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

image.pngimage.png


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

image.png

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

image.png

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

image.png

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

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

image.png

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

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

image.png

看来还是得修改推理的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循环遍历该路径下的所有图片文件就可以了。。

image.png

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

image.png

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

image.png

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

image.png

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

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

image.png

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

image.png

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

image.png

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

image.png

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


接着编写 合成视频的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.

image.png

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

image.png

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

image.png

这是输出mp4的截屏:

image.png

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

image.png

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


(全文完,谢谢阅读)

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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