开发教程 | 基于ModelArts与HiLens端云协同开发行人检测与跟踪方案

目的

基于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://marketplace.huaweicloud.com/markets/aihub/datasets/detail/?content_id=3d67fd03-2e16-4c70-908f-feb8f50334b9

已经启动下载了,在“个人中心”的“数据集”下的“我的下载”中可以看到目前的下载进度。

我的下载备用链接: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

                                     

画面中左上角从上到下,依次显示为当前画面行人数量、通过画面中间黄线的行人数量以及总行人数量。怎么样,是不是很有意思?赶快来运行试试吧。



注意:

本项目仅供学习分享使用,不保证模型精度和人数统计准确性,所有代码均可从开源渠道获得。



合智互联客户成功服务热线:400-1565-661

admin
admin管理员

上一篇:HBase实用技巧:一种全量+增量数据的迁移方法
下一篇:云原生2.0时代:开启应用定义基础设施新时代

留言评论

暂无留言
取消
扫码支持