基于MindStudio的电力绝缘子检测

 目录

1. 写在前面

2. 任务介绍

任务目标:检测1080P的图片的FPS要在10以上

3. 模型简介

4. 流程介绍

4.1 配置MindStudio

4.1.1 新建一个项目,配置CANN

4.1.2 配置python

4.1.3 配置MindX SDK

4.1.4 从远端服务器拉取代码

4.2绘制流程图

首先绘制整个推理的流程图,画出的流程图如下

4.3 模型转换

4.3.1 pth转换成onnx

4.3.2 onnx转om模型

4.3.3 ATC代码转换om

4.4 Pipeline编排

4.4.1选择appsrc输入插件

4.4.2 选择mxpi_imagedecoder插件,将它们用线连接起来

4.4.3选择mxpi_imageresize,与decoder插件相连

4.4.4 选择mxpi_tensorinfer,与imageresize相连

4.4.5 选择mxpi_objectpostprocessor插件,与tensorinfer插件相连

4.4.6 选择appsink,与postprocessor插件相连

4.5编写main.py

5. 测试结果

5.1 配置app运行的python解释器

5.2运行main.py

5.3精度测试

6. FAQ

6.1 Getprotobuf得到的结果为空

6.2 初始化模型失败

7. 总结

1. 写在前面

本人最近一段时间完成了一次基于MindX SDK实现的模型推理和结果可视化。在项目的过程中我也踩到了不少坑,许多其实很细小的问题却花费了我几乎一天的时间才将其检查出来。现在我就对这次项目进行一次总结,并把我在其中遇到的问题和解决方法分享给大家。

2. 任务介绍

任务场景:应用开发

任务描述:首先编写Pipeline,完成整个推理的流程图,随后编写后处理插件,完成目标检测后处理,最后编写python文件进行结果的可视化。

任务目标:检测1080P的图片的FPS要在10以上

环境信息:昇腾设备:Ascend310;OS:Ubuntu Linux;CANN版本:5.0.4。

MindX SDK版本:2.0.4

3. 模型简介

YOLO的全称是you only look once,指只需要浏览一次就可以识别出图中的物体的类别和位置。

因为只需要看一次,YOLO被称为Region-free方法,相比于Region-based方法,YOLO不需要提前找到可能存在目标的Region

也就是说,一个典型的Region-base方法的流程是这样的:先通过计算机图形学(或者深度学习)的方法,对图片进行分析,找出若干个可能存在物体的区域,将这些区域裁剪下来,放入一个图片分类器中,由分类器分类。

因为YOLO这样的Region-free方法只需要一次扫描,也被称为单阶段(1-stage)模型。Region-based方法方法也被称为两阶段(2-stage)方法。

4. 流程介绍

4.1 配置MindStudio

本项目是通过MindStudio完成的,所以首先要做的就是下载安装MindStudio,并对其进行配置。

MindStudio下载地址

cke_83173.png

安装一路默认就可以了。

4.1.1 新建一个项目,配置CANN

点击change,配置CANN的路径

cke_26539.png

第一次配置的人需要配置远端服务器,点击+号进行配置。

cke_111421.png

配置完服务器后可以通过Test Connection进行连接测试连接是否成功,连接成功后点击OK完成。

cke_141759.png

配置完远端服务器后配置CANN,选择CANN Version的change进行修改CANN路径

cke_172115.png

选择自己的CANN,我这里选择的是5.0.4.alpha005

4.1.2 配置python

  1. 点击File->project Structure ->SDK 配置python SDK
  2. 点击SDKs->Add Python SDK

cke_202492.png

cke_232947.png

选取python路径,我这里选择的是远端的python解释器,所以选择SSH Interpreter

cke_290012.png

cke_320532.png

点击OK完成。

4.1.3 配置MindX SDK

点击File->Setting->Appearance->System Settings->MindX SDK->Install SDK配置MindX SDK,将CANN和MindX SDK路径配置好即可。

cke_353137.png

cke_385770.png

cke_455119.png

cke_485796.png

4.1.4 从远端服务器拉取代码

点击File->Settings->工具->Deployment,选择mapping,配置远端需要拉取代码的路径和本地存放拉取代码的路径。

在项目右键点击deployment->download from 即可拉取代码。

cke_526933.png

cke_559696.png

接下来就可以进行自己的代码开发啦。

4.2绘制流程图

首先绘制整个推理的流程图,画出的流程图如下

cke_592545.png

图像输入进来首先进行解码操作,解码好的图片进行压缩输出到模型里面进行推理,这里输入的图片是YUV格式的,所以通常要配置aipp来转换成RGB格式,我在这里就踩过一次坑,输入到模型里面的数据一直不对,导致模型无法进行推理,随后转换一下就没问题了。aipp是模型转换的参数,后续也会提到。

4.3 模型转换

我使用的是pytorch模型,他的权重是一个pth文件,而Mind_SDK里面支持的是om模型,所以我们需要进行一个转换。首先我们要把我们的pth文件转换成onnx文件,然后再转换成om模型。

4.3.1 pth转换成onnx

转换的代码如下

cke_623324.png

pth转换成onnx模型首先就是要加载权重,然后用权重来初始化自己的模型,随后调用torch自带的转onnx函数就可以完成模型的转换。注意这里的do_constant_folding,这个参数是是否进行一些常量的折叠,如果进行折叠会损失一些BM块,这种缺少的部分可能导致推理出错。

4.3.2 onnx转om模型

点击Ascend->Model Converter来进行模型转换

cke_656176.png

配置好onnx模型的路径,输出模型名称,以及输出模型的路径。MindStudio会自动读入模型的输出以及它的维度,我们需要把input type改为UINT8,其他不需要我们自己再去配置了。

cke_687010.png

配置aipp,我们只需要把我们写好的aipp文件引入即可。

cke_719915.png

Aipp文件的代码如下:

cke_752773.png

点击next,确认后点击finish就可以开始模型转换了。

cke_785666.png

4.3.3 ATC代码转换om

模型转换也可以采取代码形式,具体代码如下:

cke_818630.png

4.4 Pipeline编排

模型转换完成后,就可以按照流程图来编排Pipeline了,Mind

Studio支持Pipeline的可视化编排,我们可以通过可视化界面来完成Pipeline的编排。具体流程如下

4.4.1选择appsrc输入插件

cke_849566.png

4.4.2 选择mxpi_imagedecoder插件,将它们用线连接起来

选择mxpi_imagedecoder插件,与appsrc相连。如果找不到插件可以点击搜索栏进行搜索

cke_880567.png

cke_911589.png

4.4.3选择mxpi_imageresize,与decoder插件相连

调整resizeHeight和resizeWidth改成416,416,满足模型输入的要求。

cke_942643.png

4.4.4 选择mxpi_tensorinfer,与imageresize相连

选择mxpi_tensorinfer插件,配置好模型的文件路径,将其与mxpi_imageresize相连

cke_973735.png

4.4.5 选择mxpi_objectpostprocessor插件,与tensorinfer插件相连

这里需要配置三个路径,第一个是后处理配置文件,该文件取决于你用的什么后处理库,第二个是标签文件,取决于你检测模型检测的对象,常见模型的后处理可以参考Ascend给出的后处理方法,具体链接如下:

模型后处理配置参数 - MindX SDK 2.0.3.6 mxVision 用户指南 01 - 华为

我配置的后处理配置文件和标签文件如下:

cke_1004864.png

cke_1036030.png

我选用的后处理库是Ascend提供的yolov3后处理库,我们在我们的postProcessLibPath里面将这个文件路径选中就好了。详细的后处理库信息可以根据我上方给出的后处理方法的链接进行查看。

cke_1067260.png

4.4.6 选择appsink,与postprocessor插件相连

无需配置,直接相连即可,完整的Pipeline如下:

cke_1098508.png

最后要给pipeline的流设置一个名字

cke_1129792.png

cke_1161114.png

点击Save As保存

cke_1192498.png

4.5编写main.py

在完成上述插件的编写后,最后一部分就是跑通我们的pipeline,并对得到的结果进行展示了。main.py的代码如下

cke_1223884.png

cke_1257367.png

cke_1290887.png

上述代码大概的流程是:首先对streamManagerApi进行初始化,并通过pipeline创建stream,随后声明一个mxDataInput类来读入图像数据,然后通过sendData函数把数据传入stream中,我们可以使用key来读取pipeline中某插件的输出,这里我设置了一个key为后处理插件的名字,用来读取后处理的输出,读取到后处理的输出后通过MxpiObject类来把输出转成对象,最后再来画图,画图的函数取自Ascend开源的YOLOX中的visualize.py。

5. 测试结果

5.1 配置app运行的python解释器

修改自己的运行配置

cke_1324427.png

cke_1355907.png

5.2运行main.py

输入一张带有电力绝缘子的图片,查看输出,可以看到下图得到了正确的结果,并且对于1080P的图片,FPS达到17,满足FPS>10的要求。

cke_1389545.png

cke_1423159.png

5.3精度测试

下载好自己的coco的数据集,存放在test目录下的dataset目录,按顺序运行以下python文件,得到的精度如下图。可以看到与原模型的精度差距小于1%,满足精度需求。

cke_1454694.png

cke_1486277.png

cke_1517932.png

但是该模型也有一点问题。由于模型训练的数据集比较小,所以对于某些比较小的绝缘子无法检测到,但是整体上还是满足了项目的要求。

6. FAQ

6.1 Getprotobuf得到的结果为空

cke_1551781.png

我调用getprotobuf来获得某个插件的输出,结果报得到的输出为空。这种情况一般分两种,首先这种结果的原因是你输入的图片不含有你模型检测的对象,所以得到的检测结果为空。这种情况就有两个可能,一个是你输入的图片就是不含有检测对象,另外一种就是你推理过程出现了问题,导致你没有得到结果,所以你可以查看pipeline是否正确,或者自己模型转换是否出现了错误来解决这种问题。

6.2 初始化模型失败

E1223 10:25:15.540954 354 ModelInferenceProcessorDptr.hpp:136] [207001][Error code unknown] Failed to apply for the working memory.

E1223 10:25:15.541687 354 ModelInferenceProcessor.cpp:30] [207001][Error code unknown] Failed to init model, the model path is(/home/wx/RCAN/infer/model/rcan.om).

E1223 10:25:15.541745 354 MxpiTensorInfer.cpp:163] [mxpi_tensorinfer0][207001][Error code unknown] Failed to init model inference.

E1223 10:25:15.541800 354 MxpiTensorInfer.cpp:94] [mxpi_tensorinfer0][207001][Error code unknown] Init configs failed.

E1223 10:25:15.541827 354 MxGstBase.cpp:612] [mxpi_tensorinfer0][207001][Error code unknown] Plugin initialize failed.

E1223 10:25:15.542353 354 MxsmStream.cpp:700] [6003][stream change state fail] Failed to set the state of the Stream, named: rcan_superResolution.

E1223 10:25:15.542429 354 MxStreamManagerDptr.cpp:425] [6003][stream change state fail] create stream(rcan_superResolution) failed.

I1223 10:25:15.542475 354 MxsmStream.cpp:753] Begin to destroy stream(rcan_superResolution).

I1223 10:25:15.542623 354 MxsmStream.cpp:809] Send custom eos to the Stream successfully.

I1223 10:25:15.542676 354 MxsmStream.cpp:815] Send eos to the Stream successfully.

W1223 10:25:15.542794 354 MxsmStream.cpp:823] Failed to flush the Stream data.

I1223 10:25:15.542954 354 MxGstBase.cpp:814] element(mxpi_tensorinfer0) gst_change_state READY_TO_NULL.

I1223 10:25:15.543155 354 MxsmStream.cpp:800] Destroys the stream(rcan_superResolution) successfully.

Traceback (most recent call last):

File "main.py", line 34, in sr_infer.load_pipeline(args.pipeline_path)

File "/home/wx/RCAN/infer/sdk/sr_infer_wrapper.py", line 79, in load_pipeline raise RuntimeError("Failed to create stream.")

RuntimeError: Failed to create stream.

I1223 10:25:15.578159 354 MxStreamManager.cpp:76] Begin to destroy management threads.

这种报错就是转模型出现了问题,如果你是使用的tensorflow的模型的话,可以使用netron查看自己的模型是否是有控制流算子(比如switch和merge),这两类算子Ascend不支持直接转换,需要通过一些方法来将其转换成函数类算子,具体的流程可以查看

定制网络修改(TensorFlow) - CANN 5.0.1 开发辅助工具指南 (推理) 01 - 华为

这就是我主要遇到的两个问题,这两个问题当时也花了我很久的时间来解决,所以希望我的经验能给你一点帮助,当然如果你在使用MindStudio开发的时候遇到了一些问题,你可以通过华为云论坛来分享自己的问题,上面有很多的大佬会热心的帮你解决的,我遇到的很多小问题都是通过论坛来解决的,希望对你有一点帮助。

cke_1589897.png

华为云论坛链接

7. 总结

说实在话,MindStudio是一款挺不错的开发软件,MindX SDK也对小白非常有好,也许你和我一样是个刚刚入门人工智能,不知道怎么进行开发的代码小白。那么我觉得你可以尝试使用一下这款软件,他的许多方法可以帮助你快速学习深度学习并且能够迅速掌握项目开发的基本流程,这对于我们这些入门者来说是非常好的了解和学习深度学习的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值