本文的视频教程可点击下面链接: https:www。bilibili。comvideoBV1be4y127Fa1、项目介绍 任务场景:无人机场景下人群密度估计算法 任务描述:基于MindXSDK将其部署于昇腾平台上,实现无人机在线人群密度估计。 任务目标:在VisDrone2021数据集上实现,均方误差(MSE)不大于35,绝对误差(MAE)不大于20,且FPS不低于20最低实时检测帧数。 环境信息:昇腾设备:Ascend310;MindSDK版本:2。0。4;CANN版本:5。0。42、模型介绍 本项目使用的模型为DMCount,论文地址链接,其模型是基于VGG19()使用Pytorch框架开发,其论文表明高斯规则强加于注释标注会损害泛化性能。DMCount则不需要任何高斯方法对真值标注进行处理,进而提升算法性能。 由于本项目是基于MindXSDK部署于昇腾边缘硬件,因此本文着重于在MindXSDK部署过程中所遇到的问题以及解决方法,为基于MindSDK的开发人员排坑。对模型的训练本文只提及训练VisDrone2021数据集时需修改的代码。具体训练过程也可直接参考地址。 下载DMCount项目,并使用MindStudio打开项目目录,其目录结构如图所示, 由于服务器需用内网连接的,因此本文对DMCount布置本地实验环境,首先配置python环境以及SDK等,步骤如下图所示 3、模型训练 本项目是基于无人机场景,首先我们需要修改VisDrone2021数据集的标注文件以适用于DMCount模型的训练。下载VisDrone2021数据集并将其移至DMCount根目录,其数据集目录结构如下图所示,GT文件夹为xml标注文件,RGB为无人机场景下RGB颜色模型JPG格式图像文件,TIR为红外拍摄的灰度JPG格式图像文件,两个文件夹图像一一对应。由于VisDrone2021测试数据集没有真实值标注,需要在官网提交检测结果才能获取测试精度,因此本项目将RGB文件夹下的数据以4:1随机分为训练集和测试集,即训练集1445张图像,测试集为362张图像。 然后在DroneRGBTTrain目录中新建xml2mat。py文件,添加如下图代码,并运行,其目的是将xml文件改为预处理所需用到的mat文件。运行结果在DroneRGBTTrain目录中生成mats文件夹,文件夹内。mat文件为对应图像标注文件。 然后,在此目录中新建spilttaintest。py文件夹生成train。txt和val。txt文件,即训练图像和测试图像,代码以及结果如下图所示,其train。txt和val。txt文件内容为训练和测试图像的文件名字。 3。1、标注文件修改 训练DMCount需要对数据集进行预处理生成密度图和训练真实值,其源码如下图所示,原始代码中只对QNRF和NWPU数据集做了预处理,我们添加2225行代码,即图中红色框部分,VisDrone2021数据集图像为640512的固定大小,因此我们在main()函数中传入参数为:输入数据集路径,输出数据及路径,图像高度,图像宽度。 在DMCountpreprocess文件夹下复制preprocessdatasetnwpu。py并重命名为preprocessdatasetvis。py并修改main()函数,具体代码如下图所示 然后运行preprocessdataset。py预处理文件,可生成train和val文件夹,其中每个文件夹下为训练图像,该训练图像的密度图以及真实值,即。jpg文件为训练或测试图像,。npy文件为该图像真实值,以densitymap。npy后缀的文件为该图像密度图。 至此,原DMCount代码修改完毕,更改train。py文件如图所示,然后点击运行按钮等待运行完毕即可生成Pytorch框架的权重文件。 模型训练过程中需注意: 可能对于pytorch的版本会出现如下问题, 解决办法: 在datasetscrowd。py文件中修改如下代码 3。2、模型转换 完成训练之后,得到的Pytorch权重文件,因此我们在主目录新建pth2onnx。py将权重转换成MindSDK所支持的onnx文件,其代码如下,3。1节所生成的权重文件在ckpts文件夹中,最后生成VisdroneCrowdCounting。onnx 4、基于MindXSDK开发 完成开发后的UAVCrowdCounting无人机场景下人群密度估计目录结构 4。1、创建MindXSDK(Python)工程 在MindStudioIDE中新建AscendApp项目,如图所示,首先,选择AscendApp,然后后可以命名项目名称,如图本项目名称为UAVCrowdCounting,项目位置可以直接选择默认位置,紧接着部署服务器CANN,点击图中Change按钮 点击Change按钮之后,我们在远程连接中配置我们的服务器,如图所示, 成功连接服务器后,找到服务器中CANN安装文件夹,并选择其中使用的版本,我所使用的服务器只安装了5。0。4版本,如图所示 选择之后,点击Finish,等待MindStudio完成配置 成功配置之后,可以在创建项目页面看到CANN版本,然后点击下一步 本次项目使用python语言开发基于MindXSDK的UAV场景下的人群密度估计,选择模板如图所示,并在新的窗口打开 窗口变化如图所示,则完成了UAVCrowdCounting项目的创建,并点击红框处,配置执行文件。 选择mian。py作为执行程序,如下图所示, 4。2、配置MindStudio的python环境 在MindStudio中配置接众智实验室服务器的开发环境,首先连接服务器,并测试测试是否连接成功,以确保与服务器文件夹完成映射。如图所示 将本地文件夹映射在服务器的文件夹中,路径可设置为自己方便寻找以及开发的目录下,如下图红色框所示,本项目映射在home目录下。 勾选代码自动上传,即修改代码按ctrls可自动上传至服务器,如下图所示 增加远程的pythonSDK,如下图所示,以方便在本地运行服务器上的python环境 增加SSHInterpreter,即远程python解释器(服务器上使用的python),再将配置好的pythonSDK配置于本项目中,步骤如下图所示 4。3、ATC模型转换 至此,我们已将完成了该项目在MindStudio所需的环境,我们创建如图目录文件夹,转换模型时,首先我们需要设置aipp配置文件,并将其命名为aipp。cfg如图所示, 图中,我们使用静态模型,即aippmode设置为static,然后输入的图片格式为RGB888U8,关闭色域转换,关闭R通道与B通道交换,即cscswitch和rbuvswapswitch,因为我们在训练过程中会对图像进行归一化,aipp配置文件归一化的运算方式可参考链接。meanchn0,meanchn1,meanchn2分别代表RGB颜色每个通道中的均值,minchn0,minchn1,minchn2分别代表RGB颜色每个通道的最小值,varrecichn0,varrecichn1,varrecichn2表示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中,可以直接可视化编排插件,如下图所示,新建MindSDKPipeline,然后直接搜索或者选取项目所需用的插件,并对其进行连线,然后保存在pipeline文件夹中,并命名为crowdcount。pipeline, 在新建的pipeline中,首先选择输入插件(appsrc),获取图像输入数据,如下图所示, 然后在其他插件中选取图像解码插件(mxpiimagedecoder),并将输入插件(appsrc)与解码插件连线,如下图所示,注意需以OpenCV方式解码图片并将图片转成RGB颜色模型,以符合模型推理数据格式避免检测精度下降。 接着引入缩放插件(mxpiimageresize),同样以OpenCV方式将输入图片放缩到模型指定输入640512的尺寸大小,以满足模型推理时图像的大小。如图所示, 紧接着调用推理插件(mxpitensorinfer)插件,并加载已转换好的om模型(写入相对路径,如在本项目中则为。modelsuavcrowdcountingnorm。om,若使用绝对路径则会报错或保存不了文件)对输入数据张量进行推理。如图所示, 然后再使用输出插件appsink,从stream中获取数据。如下图所示 最后,对每个插件点击鼠标右键进行命名,如图所示 至此,插件配置完成,将文件保存在pipeline文件夹中,并命名为crowdcount。pipeline 配置插件过程中需注意: 1、图像解码插件mxpiimagedecoder,在本项目模型推理使用的是RGB数据,因此图像解码插件要使用OpenCV处理方式,且需将输出数据改为RGB数据格式。 2、图像归一化或标准化处理插件mxpiimagenormalize的使用,与4。2模型转换有相关联系,在初步模型转换过程中,我们使用mxpiimagenormalize图像的归一化与标准化并未使用aipp配置文件,模型虽然能够完成转换,但是在模型推理的结果值为零,具体原因目前尚未知晓,解决方式是将图像的归一化或标准化配置在aipp文件中。4。5、图片测试 首先我们需要在MindStudio中配置MindXSDK,如图所示,点击红色框按钮,然后选择MindXSDK配置,并点击安装InstallSDK按钮 点击之后和配置CANN类似,完成远程CANN和SDK远程路径,然后等待配置完成。 如图所示,SDK配置完之后的效果 到此,我们准备好了模型,pipeline,以及MindXSDK,现在可以使用模型测试单张图片了,main。py编写单张测试代码,如图23所示, 其中创建StreamManager,以及创建Pipeline部分是常规代码,可按照一般流程开发即可,主要区别于对推理结果的处理,即红色框中的代码(6978行)。模型最终输出为15120的一维张量,每个张量代表人群密度值,因此张量之和为该张图片的人群统计数。对于人群密度图,我们将15120的一维张量重塑成大小为6480的数组,并进行最大最小归一化形成人群密度图,然后保存即完成单张图片的人群密度估计。 我们可以在3。1节中在生成的val文件夹下随意选取一张图片复制到data文件夹下并重命名为test。jpg,如图所示,然后点击运行按钮,测试该图像人群密度 运行之后,结果如图所示, 对于生成的密度图,我们可以新建一个名为visimg。jpg的文件,然后同步服务器文件夹,即可在本地查看生成的人群密度图。 运行程序过程中需注意: 可能出现找不到如下模块的问题, 解决办法:在MindStudio中打开SSH远程连接,在用户目录下新建。profile文件,添加CANN和MindXSDK的环境变量。步骤如图所示 4。6、精度测试 在data文件夹下,将第3节中val。txt重命名为visdronetest。txt放置data文件夹下,并新建VisDrone2021文件夹,在官网链接下载数据集,且将将数据集中RGB和GT目录放置在新建的VisDrone2021目录中,步骤如下图所示, 新建eval。py文件之后,我们将测试代码写入eval。py文件中,代码如下 在精度测试中,主要代码则为获取VisDrone测试的数据集,即Dataset类,代码首先按照visdronetest。txt文件中的图片名加载到Dataset类中,然后在迭代图片的时候以MxDataInput()读取图像的数据,与训练不同测试时是直接使用xml文件中的人群统计数,最后我们计算平均FPS,均方误差(MSE)以及绝对误差(MSE)。 由于我们设置了main。py程序作为MindStudio的运行文件,因此测试精度时,我们需要将运行文件更改为eval。py文件,步骤如下 更改完成之后,我们直接开始进度测试,如下图所示,为运行结果 在图中可以看到FPS未能满足最低20的要求,这可能是因为图片传输过程中有一些耗时,在服务器中均能满足任务要求,服务器中结果图下图所示 精度测试过程中需注意: 所遇问题如4。5中一致获取帮助 如果有任何疑问,都可以前往MindStudio昇腾论坛获取更多信息。