使用MindStudio进行UAV场景下人群密度估计开发

本文的视频教程可点击下面链接:

https://www.bilibili.com/video/BV1be4y127Fa

1、项目介绍

任务场景:无人机场景下人群密度估计算法

任务描述:基于MindX SDK将其部署于昇腾平台上,实现无人机在线人群密度估计。

任务目标:在VisDrone2021数据集上实现,均方误差(MSE)不大于35,绝对误差(MAE)不大于20,且FPS不低于20最低实时检测帧数。

环境信息:昇腾设备: Ascend310;Mind SDK版本:2.0.4;CANN版本:5.0.4

2、模型介绍

本项目使用的模型为DM-Count,论文地址链接,其模型是基于VGG19()使用Pytorch框架开发,其论文表明高斯规则强加于注释标注会损害泛化性能。DM-Count则不需要任何高斯方法对真值标注进行处理,进而提升算法性能。

由于本项目是基于MindX SDK部署于昇腾边缘硬件,因此本文着重于在MindX SDK部署过程中所遇到的问题以及解决方法,为基于Mind SDK的开发人员排坑。对模型的训练本文只提及训练VisDrone2021数据集时需修改的代码。具体训练过程也可直接参考地址。

下载DM-Count项目,并使用MindStudio打开项目目录,其目录结构如图所示,

由于服务器需用内网连接的,因此本文对DM-Count布置本地实验环境,首先配置python环境以及SDK等,步骤如下图所示

3、模型训练

本项目是基于无人机场景,首先我们需要修改VisDrone2021数据集的标注文件以适用于DM-Count模型的训练。下载VisDrone2021数据集并将其移至DM-Count根目录,其数据集目录结构如下图所示,GT_文件夹为xml标注文件,RGB为无人机场景下RGB颜色模型JPG格式图像文件,TIR为红外拍摄的灰度JPG格式图像文件,两个文件夹图像一一对应。由于VisDrone2021测试数据集没有真实值标注,需要在官网提交检测结果才能获取测试精度,因此本项目将RGB文件夹下的数据以4:1随机分为训练集和测试集,即训练集1445张图像,测试集为362张图像。

然后在DroneRGBT/Train目录中新建xml2mat.py文件,添加如下图代码,并运行,其目的是将xml文件改为预处理所需用到的mat文件。运行结果在DroneRGBT/Train目录中生成mats文件夹,文件夹内.mat文件为对应图像标注文件。

然后,在此目录中新建spilt_tain_test.py文件夹生成train.txt和val.txt文件,即训练图像和测试图像,代码以及结果如下图所示,其train.txt和val.txt文件内容为训练和测试图像的文件名字。

3.1、标注文件修改

训练DM-Count需要对数据集进行预处理生成密度图和训练真实值,其源码如下图所示,原始代码中只对QNRF和NWPU数据集做了预处理,我们添加22-25行代码,即图中红色框部分,VisDrone2021数据集图像为640*512的固定大小,因此我们在main()函数中传入参数为:输入数据集路径,输出数据及路径,图像高度,图像宽度。

在DM-Count/preprocess/文件夹下复制preprocess_dataset_nwpu.py并重命名为preprocess_dataset_vis.py并修改main()函数,具体代码如下图所示

然后运行preprocess_dataset.py预处理文件,可生成train和val文件夹,其中每个文件夹下为训练图像,该训练图像的密度图以及真实值,即.jpg文件为训练或测试图像,.npy文件为该图像真实值, 以_densitymap.npy后缀的文件为该图像密度图。

至此,原DM-Count代码修改完毕,更改train.py文件如图所示,然后点击运行按钮等待运行完毕即可生成Pytorch框架的权重文件。

模型训练过程中需注意:

可能对于pytorch的版本会出现如下问题,

解决办法:

在datasets/crowd.py文件中修改如下代码

3.2、模型转换

完成训练之后,得到的Pytorch权重文件,因此我们在主目录新建pth2onnx.py将权重转换成Mind SDK所支持的onnx文件,其代码如下,3.1节所生成的权重文件在ckpts文件夹中,最后生成Visdrone_CrowdCounting.onnx

4、基于MindX SDK开发

完成开发后的UAV_CrowdCounting无人机场景下人群密度估计目录结构

4.1、创建MindX SDK(Python)工程

在MindStudio IDE中新建Ascend App项目,如图所示,首先,选择Ascend App,然后后可以命名项目名称,如图本项目名称为UAV_CrowdCounting,项目位置可以直接选择默认位置,紧接着部署服务器CANN,点击图中Change按钮

点击Change按钮之后,我们在远程连接中配置我们的服务器,如图所示,

成功连接服务器后,找到服务器中CANN安装文件夹,并选择其中使用的版本,我所使用的服务器只安装了5.0.4版本,如图所示

选择之后,点击Finish,等待MindStudio完成配置

成功配置之后,可以在创建项目页面看到CANN版本,然后点击下一步

本次项目使用python语言开发基于MindX SDK的UAV场景下的人群密度估计,选择模板如图所示,并在新的窗口打开

窗口变化如图所示,则完成了UAV_CrowdCounting项目的创建,并点击红框处,配置执行文件。

选择mian.py作为执行程序,如下图所示,

4.2、配置MindStudio的python环境

在MindStudio中配置接众智实验室服务器的开发环境,首先连接服务器,并测试测试是否连接成功,以确保与服务器文件夹完成映射。如图所示

将本地文件夹映射在服务器的文件夹中,路径可设置为自己方便寻找以及开发的目录下,如下图红色框所示,本项目映射在/home目录下。

勾选代码自动上传,即修改代码按ctrl+s可自动上传至服务器,如下图所示

增加远程的python SDK,如下图所示,以方便在本地运行服务器上的python环境

增加SSH Interpreter,即远程python解释器(服务器上使用的python),再将配置好的python SDK配置于本项目中,步骤如下图所示

4.3、ATC模型转换

至此,我们已将完成了该项目在MindStudio所需的环境,我们创建如图目录文件夹,转换模型时,首先我们需要设置aipp配置文件,并将其命名为aipp.cfg如图所示,

图中,我们使用静态模型,即aipp_mode设置为static,然后输入的图片格式为RGB888_U8,关闭色域转换,关闭R通道与B通道交换,即csc_switch和rbuv_swap_switch,因为我们在训练过程中会对图像进行归一化,aipp配置文件归一化的运算方式可参考链接。mean_chn_0,mean_chn_1,mean_chn_2分别代表RGB颜色每个通道中的均值,min_chn_0,min_chn_1,min_chn_2分别代表RGB颜色每个通道的最小值,var_reci_chn_0,var_reci_chn_1,var_reci_chn_2表示RGB颜色每个通道方差的倒数。例如,在本项目中,模型训练过程中使用使用了归一化和标准化,即相对应Pytorch框架中transforms.ToTensor()和transforms.Normalize()数据预处理方法。transforms.ToTensor()首先会将图像的像素值输入图像缩放为[0.0,1.0]之间,在将数据转化为张量,而transforms.Normalize()是逐通道的对图像进行标准化,本项目中mean= [0.485, 0.456, 0.406](各通道的均值),std= [0.229, 0.224, 0.225](各通道的标准差)。具体运算如下图所示,

完成aipp文件的设置后,我们可以将上文所训练的onnx模型文件或下载提供的模型并放置models

然后,我们可以点击模型转换按钮,进行模型转换,如图所示

添加models文件夹下的onnx模型,操作如下

完成之后如上操作后点击下一步,配置模型的图像预处理函数,

最后,点击Finish按钮,完成模型转换,如图可看到模型转换成功

4.4、配置插件

在MindStudio中,可以直接可视化编排插件,如下图所示,新建Mind SDK Pipeline,然后直接搜索或者选取项目所需用的插件,并对其进行连线,然后保存在pipeline文件夹中,并命名为crowdcount.pipeline,

在新建的pipeline中,首先选择输入插件(appsrc),获取图像输入数据,如下图所示,

然后在其他插件中选取图像解码插件(mxpi_imagedecoder),并将输入插件(appsrc)与解码插件连线,如下图所示,注意需以OpenCV方式解码图片并将图片转成RGB颜色模型,以符合模型推理数据格式避免检测精度下降。

接着引入缩放插件(mxpi_imageresize),同样以OpenCV方式将输入图片放缩到模型指定输入640*512的尺寸大小,以满足模型推理时图像的大小。如图所示,

紧接着调用推理插件(mxpi_tensorinfer)插件,并加载已转换好的om模型(写入相对路径,如在本项目中则为./models/uav_crowdcounting_norm.om,若使用绝对路径则会报错或保存不了文件)对输入数据张量进行推理。如图所示,

然后再使用输出插件appsink,从stream中获取数据。如下图所示

最后,对每个插件点击鼠标右键进行命名,如图所示

至此,插件配置完成,将文件保存在pipeline文件夹中,并命名为crowdcount.pipeline

配置插件过程中需注意:

1、图像解码插件mxpi_imagedecoder,在本项目模型推理使用的是RGB数据,因此图像解码插件要使用OpenCV处理方式,且需将输出数据改为RGB数据格式。

2、图像归一化或标准化处理插件mxpi_imagenormalize的使用,与4.2模型转换有相关联系,在初步模型转换过程中,我们使用mxpi_imagenormalize图像的归一化与标准化并未使用aipp配置文件,模型虽然能够完成转换,但是在模型推理的结果值为零,具体原因目前尚未知晓,解决方式是将图像的归一化或标准化配置在aipp文件中。

4.5、图片测试

首先我们需要在MindStudio中配置MindX SDK,如图所示,点击红色框按钮,然后选择MindX SDK配置,并点击安装Install SDK按钮

点击之后和配置CANN类似,完成远程CANN和SDK远程路径,然后等待配置完成。

如图所示,SDK配置完之后的效果

到此,我们准备好了模型, pipeline,以及MindX SDK,现在可以使用模型测试单张图片了,main.py编写单张测试代码,如图23所示,

其中创建StreamManager,以及创建Pipeline部分是常规代码,可按照一般流程开发即可,主要区别于对推理结果的处理,即红色框中的代码(69-78行)。模型最终输出为1*5120的一维张量,每个张量代表人群密度值,因此张量之和为该张图片的人群统计数。对于人群密度图,我们将1*5120的一维张量重塑成大小为64*80的数组,并进行最大最小归一化形成人群密度图,然后保存即完成单张图片的人群密度估计。

我们可以在3.1节中在生成的val文件夹下随意选取一张图片复制到data文件夹下并重命名为test.jpg,如图所示,然后点击运行按钮,测试该图像人群密度

运行之后,结果如图所示,

对于生成的密度图,我们可以新建一个名为vis_img.jpg的文件,然后同步服务器文件夹,即可在本地查看生成的人群密度图。

运行程序过程中需注意:

可能出现找不到如下模块的问题,

解决办法:在MindStudio中打开SSH远程连接,在用户目录下新建.profile文件,添加CANN和MindX SDK的环境变量。步骤如图所示

4.6、精度测试

在data文件夹下,将第3节中val.txt重命名为visdrone_test.txt放置data文件夹下,并新建VisDrone2021文件夹,在官网链接下载数据集,且将将数据集中RGB和GT_目录放置在新建的VisDrone2021目录中,步骤如下图所示,

新建eval.py文件之后,我们将测试代码写入eval.py文件中,代码如下

在精度测试中,主要代码则为获取VisDrone测试的数据集,即Dataset类,代码首先按照visdrone_test.txt文件中的图片名加载到Dataset类中,然后在迭代图片的时候以MxDataInput()读取图像的数据,与训练不同测试时是直接使用xml文件中的人群统计数,最后我们计算平均FPS,均方误差(MSE)以及绝对误差(MSE)。

由于我们设置了main.py程序作为MindStudio的运行文件,因此测试精度时,我们需要将运行文件更改为eval.py文件,步骤如下

更改完成之后,我们直接开始进度测试,如下图所示,为运行结果

在图中可以看到FPS未能满足最低20的要求,这可能是因为图片传输过程中有一些耗时,在服务器中均能满足任务要求,服务器中结果图下图所示

精度测试过程中需注意:

所遇问题如4.5中一致

获取帮助

如果有任何疑问,都可以前往MindStudio昇腾论坛获取更多信息。

展开阅读全文

页面更新:2024-03-24

标签:密度   文件夹   插件   模型   图像   场景   人群   代码   文件   测试   项目   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top