开发教程 | 基于ModelArts与HiLens端云协同开发行人检测与跟踪方案
2020/11/14更新
目前HiLens Studio(Beta)支持安装第三方库了(开发团队真是给力,这么快就做好了),在HiLens Studio(Beta)新建Terminal,执行
pip install --user scipy
即可完成scipy的安装,注意安装后会报一个错误,但实测发现不影响本次使用,大家可以放心使用。
之后,我们按照下面的教程直接在HiLens Studio(Beta)中就能看到最终效果了,太棒了。
目的
基于ModelArts与HiLens实现端云协同开发行人检测与跟踪方案:
在ModelArts上完成数据集的标注与发布,使用AI市场算法进行训练,训练资源可选Ascend 910或GPU;
在HiLens Studio (Beta)中转换模型,调试代码,实现行人检测与跟踪以及简单人数统计;
整体开发在华为云上完成,从零开始,由ModelArts无缝集成到HiLens,最终可部署到HiLens上,独立运行。考虑有些同学可能没有HiLens,那么可以在HiLens studio里运行程序,但由于HiLens Studio中暂不支持安装第三方库,所以仅能支持实现检测部分功能。
注意事项(必看):
1. 如果部署到自己的HiLens上运行,请先在自己的HiLens上安装scipy。安装可参考如下教程:
https://bbs.huaweicloud.com/forum/thread-62722-1-1.html
https://bbs.huaweicloud.com/forum/thread-61868-1-1.html
https://bbs.huaweicloud.com/forum/thread-81238-1-1.html
2. 整体开发过程基本免费,训练使用的是Ascend 910,目前也是免费使用的。但涉及OBS和HiLens Stduio(Beta)的使用,会产生少量费用,请注意个人余额,避免欠费。
3. 请提前申请HiLens Studio公测(如未申请,可采用旧版本开发模式,但操作稍麻烦一些)
公测申请链接:https://www.huaweicloud.com/product/hilens/hilens-studio.html
ModelArts上的准备工作
1. 准备数据集
这里就要说一下ModelArts AI 市场的数据集功能了,可以很方便地实现数据集的共享,不需要开发者自行下载,再上传到OBS桶等一系列复杂操作了,非常棒。
我已经将数据集发布到ModelArts的AI市场的数据集,大家订阅下载使用即可。数据集名称为person-4192,包括标注好了的4192张Person图片。注意这里最好选择保存数据集到OBS桶,之后的操作就和自己导入数据集到ModelArts一样了,来,有图有真相。
已经启动下载了,在“个人中心”的“数据集”下的“我的下载”中可以看到目前的下载进度。
我的下载备用链接:https://console.huaweicloud.com/modelarts/?region=cn-north-4#/aiMarket/deliverCenter/myDownload
当进度达到100%的时候,我们就可以导入数据集到ModelArts了。来ModelArt管理控制台,来创建数据集吧。
ModelArts管理控制台备用链接:https://console.huaweicloud.com/modelarts/?region=cn-north-4#/dataset
数据集导入需要一定时间,请耐心等待,导入完成后,显示100%,点击数据集进入,开始发布数据集,以便训练使用。
发布数据集需要一点时间,稍等即可。
2. 订阅算法,创建训练
我们使用的是ModelArts AI市场的YOLOv3_Resnet18算法(Ascend 910训练版本),点击订阅,即可免费订阅使用。
算法备用链接:https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=7087008a-7eec-4977-8b66-3a7703e9fd22
此外,还可以使用如下两种算法:
按照指引逐步操作即可,直到如下图界面,
之后会跳转到算法界面,先同步算法,后创建训练即可。
训练作业参考配置如图所示,其余训练参数保持默认即可。
之后就是等待训练完成了,预计耗时58分钟,请耐心等待,趁着这个时间,咱们聊聊在HiLens Studio(Beta)调试部署吧。
HiLens与HiLens Studio(Beta)上的准备工作(HiLens 可选)
1. 部署代码
来,让我们打开HiLens Studio(Beta)来一探究竟吧。注意:需要提前申请公测,才能使用哦。
初入伊始,我们看到的是亮白色的操作界面,点击新建工程即可,也就是“New Project”
PS: 我个人更喜欢暗黑色,所以我打算调成暗黑色,类似于Visual Studio那样,而HiLens Studio很贴心提供了界面格式的切换,来试试吧。
我选择的是Dark(Visual Studio),还有很多其他选择,大家可以试试,选择一种自己喜欢的。
来看看我选的效果吧,如下图所示,怎么样?有没有一种使用Visual Studio的感觉,很不错吧,特别是晚上使用,很护眼。
来来来,言归正传,来开始吧。选择如图所示技能模板。
之后,点击右侧的“确定”,就能看到新工程了。
我们首先来完成模型转换外的其他操作。
(1)上传代码
自下面的下载链接下载代码,解压,得到如图所示的文件结构,上传到新建工程的src/main/python目录下。
代码下载链接为:
链接:https://pan.baidu.com/s/1TfNHSlMySvv0iNrxF38eyw
提取码:u6ji
在新建工程的右侧目录下,找到src/main/python,删除该文件下main.py和utils.py,之后上传我们刚才下载的代码,如图所示。
(2)上传测试视频
和上传代码类似,先在如下链接下载测试视频,解压缩,上传到test目录下。测试视频较大,稍等一下即可。
测试视频下载链接为:
链接:https://pan.baidu.com/s/1AgeMXXCEb30iBd2emNUcdg
提取码:cksa
完成以上两步,最终可得到右侧目录结构为:
2. 调试部署
如果你做到这里了,恭喜你,你已经成功了一大半,就差模型转换了。也许58分钟已经过去了,咱们来看看模型转换吧。
模型转换的方式有多种多样了,有3种吧,分别是:
(1)ModelArts上完成模型转换,得到.om模型,导入到HiLens Studio;(在ModelArts模型转换,可参考该算法介绍界面的说明)
(2)导入.pb模型,在HiLens云端控制台完成模型转换;
(3)导入.pb模型,在HiLens Studio中使用命令完成模型转换。
大家可以选用自己喜欢的方式,这里选择的是第3种方式,我觉得命令行简单快捷,很舒服,一起来试试吧。
首先,要记得我们当时训练作业设置的模型训练输出路径哦,来看看吧:
找到训练作业输出路径下的frozen_graph文件夹,导入insert_op_conf.cfg和yolo3_resnet18.pb,不过一次只能导入一个文件,分两次导入即可。
导入成功后,如图所示。
下面开始模型转换吧。
在新建的Terminal输入如下命令,完成模型转换:
/opt/ddk/bin/aarch64-linux-gcc7.3.0/omg --model=./yolo3_resnet18.pb --input_shape='images:1,352,640,3' --framework=3 --output=./yolo3_resnet18 --insert_op_conf=./insert_op_conf.cfg
最后的succes表示模型转换成功了。
如果大家遇到什么问题的话,可以参考文档或到论坛提问哦。
文档链接:https://support.huaweicloud.com/usermanual-hilens/hilens_02_0098.html
论坛链接:https://bbs.huaweicloud.com/forum/forum-771-1.html
现在离成功就差一点点了,就是把模型放入我们代码中指定的路径,就是把刚才转化得到的.om模型拷贝到model文件夹下,
很简单的,赶快来吧。
对了,原来model文件夹下的driving_model.om模型可以删除掉,先前导入的yolo3_resnet18.pb和insert_op_conf.cfg也可以删除掉,这样可以减少安装到HiLens上的冗余,安装也能快点。
好了,如果你已经做到这里了,恭喜你,你已经成功了,可以安装到自己的HiLens上试试了。注意,一定要按照文中最前面注意中说的,在自己的HiLens上安装scipy库哦,否则会报错的。
同时,需要注意的是,因为HiLens Studio暂不支持安装第三方库,所以无法安装scipy库,也就无法在HiLens Studio中运行得到最终结果,但scipy库主要涉及的是跟踪部分,行人检测部分还是可以实现的,稍微修改一下代码就行了,我做了处理,大家只要用下面代码取代src/main/python下的main.py就行了,简单来说就是删除原来main.py下所有代码,复制下面全部代码粘贴到main.py就行了。
# -*- coding: utf-8 -*- # !/usr/bin/python3 # SkillFramework for YOLOv3_Resnet18 Person Detection and Sort Track # 导入相关库,其中MySort库用于跟踪 import os import cv2 import time import utils # 用于跟踪和计数(1) # import MySort import hilens import numpy as np def run(work_path): # 特别注意:参数要与创建技能时填写的检验值保持一致,这里使用的是hello,可自定义 hilens.init("hello") # 明确模型路径,并创建模型,用于推理 model_path = os.path.join(work_path, 'model/yolo3_resnet18.om') model = hilens.Model(model_path) # Hilens Studio中VideoCapture如果不填写参数,则默认读取test/camera0.mp4文件,这里使用的是自行上传的TownCentreXVID.mp4 # 在Hilens Kit中不填写参数则读取本地摄像头 camera = hilens.VideoCapture("./test/TownCentreXVID.mp4") # 图像通过HDMI输出到屏幕 display_hdmi = hilens.Display(hilens.HDMI) # 图像通过RTSP实现无线连接输出,其中的IP地址取决于具体网络,请根据实际情况修改 # display_rtsp = hilens.Display(hilens.RTMP, "rtmp://192.168.43.40/live/stream") while True: try: time_start = time.time() # 1. 读取摄像头输入(yuv nv21),在这里读取的是test/camera0.mp4 input_nv21 = camera.read() # 2. 转为RGB格式,并缩放为模型输入尺寸(DVPP and AIPP) input_rgb = cv2.cvtColor(input_nv21, cv2.COLOR_YUV2RGB_NV21) img_preprocess, img_w, img_h = utils.preprocess(input_rgb) # 3. 模型推理 output = model.infer([img_preprocess.flatten()]) # 4. 结果输出 # 获取检测结果 bboxes = utils.get_result(output, img_w, img_h) # 在图像上画框 # 用于跟踪和计数(2) input_rgb = cv2.resize(input_rgb, (640, 352)) output_rgb = utils.draw_boxes(input_rgb, bboxes) # 5. 目标跟踪 # frame = MySort.MySort(bboxes, img_preprocess) # frame = cv2.resize(frame, (1920, 1080)) # 6. 输出图像,必须是yuv nv21形式 # output_nv21 = hilens.cvt_color(frame, hilens.RGB2YUV_NV21) # 用于跟踪和计数(3) output_nv21 = hilens.cvt_color(output_rgb, hilens.RGB2YUV_NV21) display_hdmi.show(output_nv21) # display_rtsp.show(output_nv21) time_frame = 1000 * (time.time() - time_start) hilens.info('----- time_frame = %.2fms -----' % time_frame) except Exception: break if __name__ == "__main__": run(os.getcwd())
其实就是改了几行代码,取代了跟踪部分,感兴趣的小伙伴可以对比一下代码的差异,了解一下,友情提醒,我在修改的代码部分做了注释,注意看注释哦,不得不说好的注释和文档还是很关键的,这也是我加注释和写这篇文档的原因了。
好了,赶快试试吧。
最后按照惯例,就是效果展示环节了。
如果你没有HiLens,那么在HiLens Studio中运行,看到的效果,会是这样的:
备用视频链接:https://v.qq.com/x/page/x3162dax8va.html
如果你有HiLens,那么部署到HiLens上运行,效果会是这样的,注意,图中左上角的字和画面中的横线颜色和具体内容可调整,你看到的不一定是画面中的黄色字样和横线。
备用视频链接:https://v.qq.com/x/page/m3116smfqhu.html
画面中左上角从上到下,依次显示为当前画面行人数量、通过画面中间黄线的行人数量以及总行人数量。怎么样,是不是很有意思?赶快来运行试试吧。
好了,感谢大家花费时间读到这里,谢谢大家的支持。同时,大家也可以将上面自己开发的技能,或者对上面的技能优化或做二次开发的话,可以完成后,发布到技能市场,方便更多开发者学习使用,这里我也将上面技能发布到技能市场了。链接为:https://console.huaweicloud.com/hilens/?region=cn-north-4#/skillMarket/skillMarketDetail/a5ff173df419448795f2b97283b1a362/Pedestrian_Track_Count-HDMI/purchase/1
PS:发布技能的话,一定要选择个见图知意的图标,和尽量详细的技能介绍说明,这一点可以参考官方发布的技能哦。
注意:
本项目仅供学习分享使用,不保证模型精度和人数统计准确性,所有代码均可从开源渠道获得。
- 点赞
- 收藏
- 关注作者
评论(0)