Files
ascend_community_projects/insulatorDetection
li-zhenyun f1b6a5161b fo
2022-11-04 16:30:33 +08:00
..
2022-11-04 15:04:31 +08:00
2022-09-25 09:39:27 +08:00
2022-10-17 19:50:04 +08:00
2022-10-24 11:44:03 +08:00
2022-10-24 17:16:28 +08:00
fo
2022-11-04 16:30:33 +08:00

insualtorDetection

1.介绍

本开发样例基于mindSDK开发在昇腾芯片上对输入的图片进行电力绝缘子的检测并将检测结果进行保存。

1.1 支持的产品

本项目以昇腾Atlas310卡为主要的硬件平台。

1.2 支持的版本

支持的SDK版本为 2.0.4, CANN 版本为 5.0.4。

1.3 软件方案介绍

基于mindSDK的电力绝缘子检测模型的推理流程为

待检测图片通过appsrc插件输入然后使用mxpi_imagedecoder将图片进行解码再通过图像缩放插件mxpi_imageresize将图片缩放至合适的分辨率缩放后的图像输入模型推理插件mxpi_tensorinfer得到输出随后将得到的输出输入后处理插件mxpi_objectpostprocessor进行后处理最后将结果输出给appsink完成整个pipeline流程最后在外部使用python对得到的结果进行绘制完成可视化显示本系统的各模块及功能如表所示:

表1 系统方案各功能模块描述:

序号 子系统 功能描述
1 图片输入 获取jpg格式图片
2 图片解码 解码图片为YUV420p
3 图片缩放 将图片缩放到合适的分辨率
4 模型推理 对输入的张量进行推理
5 电力绝缘子检测后处理 对模型推理输出进行计算得到检测框
6 结果可视化 将电力绝缘子检测结果保存为可视化图片

1.4 代码目录结构与说明

项目名为insualtorDetection项目目录如图所示

├─python
│      colorlist.txt
│      visualize.py
│      main.py
│
├─data (自行创建,存放测试图片)
│
├─img   
│      test_output.png 
│      fps.png
│      precision.png
│
├─model
│      label.names
│      yolo.cfg  
│      run.sh
│      yolo_aipp.cfg
│
├─test
│      map_calculate.py
│      parse_COCO.py  
│      testmain.py
│
├─pipeline
│      detect.pipeline

1.5 特性及适用场景

项目适用于光照条件较好,背景简单,且图片较清晰的测试图片

以下几种情况下,检测效果不够理想:
1.图片中的绝缘子很小,使得检测置信度偏低或者检测不到。
2.由于该模型训练的数据集很小,不能包含到所有的绝缘子类型,所以对部分绝缘子检测不到。

2. 环境依赖

2.1 环境变量

运行模型前要设置环境变量,命令如下,请自行修改bash脚本中的SDK_PATH和ascend_toolkit_path

. ${SDK-path}/set_env.sh  ## 修改${SDK-path}为你自己的SDK安装路径

2.2 软件依赖

依赖软件 版本
CANN 20.4.0
python 3.9.2
MindX SDK 2.0.4
opencv-python 4.5.3
numpy 1.21.2
webcolors 1.12
Pillow 9.0.1

3.模型转换

模型转换是将onnx文件转成MindX_SDK可以使用的om模型om模型的链接已上传至 https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/ascend_community_projects/Insulator_detection/insulator.om 。用户可以直接下载使用如需将onnx转化成om请按下列步骤进行操作。

步骤1 下载onnx模型文件

本工程原型是pytorch模型需要使用atc工具转换为om模型模型权重文件已上传至 https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/ascend_community_projects/Insulator_detection/insulator.onnx

步骤2 将模型放到models目录下

步骤3 AIPP配置

由于pipeline中的解码格式为YUV而模型的输入格式为RGB所以需要在atc模型转换的时候配置AIPPAIPP配置的内容如下

aipp_op {
    aipp_mode: static
    input_format : YUV420SP_U8
    csc_switch : true
    rbuv_swap_switch : false
    matrix_r0c0 : 256
    matrix_r0c1 : 0
    matrix_r0c2 : 359
    matrix_r1c0 : 256
    matrix_r1c1 : -88
    matrix_r1c2 : -183
    matrix_r2c0 : 256
    matrix_r2c1 : 454
    matrix_r2c2 : 0
    input_bias_0 : 0
    input_bias_1 : 128
    input_bias_2 : 128
    var_reci_chn_0 : 0.003921568627451
    var_reci_chn_1 : 0.003921568627451
    var_reci_chn_2 : 0.003921568627451
}


步骤4 转换模型

跳转到models目录运行如下命令进行模型转换。

bash run.sh

模型转换结果如下如果出现ATC run success说明转换模型成功

ATC start working now, please wait for a moment.
ATC run success, welcome to the next use.

4.编译运行

4.1 获取测试图片

新建一个data文件夹将需要测试的jpg图片放入该文件夹。

4.2 运行推理工程

进入python目录打开main.py其中有个FILENAME为输入的图片路径RESULTNAME为输出的图片路径将其修改为自己需要的路径。执行python文件

python main.py

图片结果保存在自己设置的RESULTFILE目录下。

5.评估精度

数据集链接 https://mindx.sdk.obs.myhuaweicloud.com/ascend_community_projects/Insulator_detection/dataset.zip

在test目录下创建dataset文件夹把下载的coco数据集的JPEGImages和test.json放到该文件夹下,运行如下代码。

python parse_coco.py   # 将coco数据集转换为可以进行精度评估的文件

python testmain.py     # 运行自己的模型得到数据集的测试结果

python map_calculate.py  # 计算AP

精度评估的结果会存放到output文件下评估的结果如下图

precision precision1

SDK跑的精度为89.48%原模型精度为90.31%两者相差0.83%目标精度要求SDK跑的精度与原模型精度相差不超过1%SDK模型精度大于80%,符合精度要求。

6.FPS测试

选择一张1080P的图片放到data目录下跳转至python目录

python main.py

结果如下,目标要求是1080P的图片检测fps达到10以上符合要求。 fps