使用MindStudio开发铝材表面缺陷检测

BiliBili视频链接:使用MindStudio开发铝材表面缺陷检测_哔哩哔哩_bilibili

使用MindStudio开发铝材表面缺陷检测

 

使用MindStudio开发铝材表面缺陷检测

1. MindStudio介绍

2. 案例模型

3. 环境搭建

3.1 安装MindX SDK和CANN包并配置环境变量

3.2 在windows开发环境同步CANN

3.3 在windows开发环境同步MindX SDK

4. 开发过程

4.1 创建工程

4.2 配置python解释器

4.3 开发步骤

4.4 项目下载连接以及项目结构

5. 运行

5.1 配置远程映射

5.2 精度测试

6. FAQ

1 尺寸不匹配

2 模型路径未进行正确配置

3 未修改pipeline中后处理插件的postProcessLibPath属性

4 同步远端CANN开发包失败

7. 一些个人经验总结

8. Mindstuido下载连接

9. 开发过程中用到的链接

1. MindStudio介绍

MindStudio提供AI开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够使开发者在一个工具上就能高效便捷地完成AI应用开发 ·MindStudio采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。MindStudio-昇腾社区 (hiascend.com)

2. 案例模型

在本案例中,目的是基于MindX SDK,在华为云昇腾平台上,使用MindStudio开发端到端铝材缺陷检测的参考设计,实现对图像中的铝材进行缺陷类型分类和定位的功能,达到功能要求,并对精度进行测试。

3. 环境搭建

开发环境为windows版本的MindStudio,运行环境在远端linux上。

3.1 安装MindX SDK和CANN包并配置环境变量

请先确保远端环境上MindX SDK软件包已安装完成,安装方式请参见安装MindX SDK开发套件

确保远端环境上CANN包已安装完成,安装方式请参见该链接

在远端服务器上配置环境变量

  • 执行如下命令,打开.bashrc文件
    vim ~/.bashrc
    在.bashrc文件中添加以下环境变量
    . ${MX_SDK_HOME}/set_env.sh
    . ${HOME}/Ascend/ascend-toolkit/set_env.sh
    其中${MX_SDK_HOME}为MindX SDK安装目录,${HOME}为用户目录(如果CANN 开发包装在用户目录,否则为/usr/local/),配置的时候请自行替换成相应目录
    保存退出.bashrc文件
    执行如下命令使环境变量生效
    source ~/.bashrc
    查看环境变量
    env

3.2 在windows开发环境同步CANN

工具栏点击“File > Settings > Appearance & Behavior > System Settings > CANN”进入CANN管理界面。点击Change CANN配置CANN包。

 

配置远程连接以及远端CANN包路径(配置到版本号一级)

 

3.3 在windows开发环境同步MindX SDK

工具栏点击“File > Settings > Appearance & Behavior > System Settings > MindX SDK”或依次点击“Ascend>MindX SDK Manager”进入MindX SDK管理界面。界面中“MindX SDK Location”为软件包的默认安装路径,默认安装路径为“C:\Users*用户名*\Ascend\mindx_sdk”。单击“Install SDK”进入“Installation settings”界面。

在“Installation settings”界面

    • “Remote Connection”:远程连接的用户及IP。
    • “Remote CANN Location”:远端环境上CANN开发套件包的路径,请配置到版本号一级。
    • “Remote SDK Location”:远端环境上SDK的路径,请配置到版本号一级。IDE将同步该层级下的“include”、“opensource”、“python”、“samples”文件夹到本地Windows环境,层级选择错误将导致安装失败。
    • “Local SDK Location”:同步远端环境上SDK文件夹到本地的路径。默认安装路径为“C:\Users*用户名*\Ascend\mindx_sdk”。

 

安装完成之后,界面如图所示:

 

4. 开发过程

4.1 创建工程

工具栏点击“File > New > Project

 

选择左侧Ascend APP,创建Ascend APP应用工程,,创建MindX SDK空白工程(提供MindX SDK开发框架,不包含代码逻辑),点击finish完成创建。

 

创建完成之后目录结构如下图所示

 

删除config文件夹,创建models和pipeline里的文件,以备后续开发自己的业务流程,目录结构如图所示。

 

4.2 配置python解释器

依次点击File->Project Structure,选择SDKs,添加Python SDK如下图所示:

 

选择SSH interpreter,配置远程服务器,MindStudio会自动侦测远程python环境(如果PATH环境变量已正确配置python的路径),点击OK

 

Project中选择配置好的远程SDK,点击Apply点击OK。完成python解释器的配置。

 4.3 开发步骤

4.3.1 确定业务流程

根据铝材表面缺陷检测SDK推理的具体需求,这里将流程依次划分为图片获取、图片解码、图像缩放、目标检测、序列化、结果发送。

4.3.2 寻找合适的插件

首先根据已有SDK插件的功能描述和规格限制来匹配业务功能(SDK插件列表详见已有插件介绍)。当SDK提供的插件无法满足功能需求时,用户可以参考插件开发介绍开发自定义插件,该部分为SDK高阶特性。在本案例中,已有SDK插件已经满足业务需求。铝材表面缺陷检测流程图以及pipeline编排流程图如下所示:

  • 1 铝材表面缺陷检测流程图
  •  

  • 2 铝材表面缺陷检测pipeline示意图

4.3.3 准备模型推理文件和数据

步骤1 训练铝材缺陷检测对应的yolov5模型,输出pt模型文件。

pt模型文件链接:https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/ascend_community_projects/Aluminum_surface_defect_detection/best.pt

步骤2 将pt模型文件转换成onnx,也可直接通过以下链接下载onnx模型。

onnx模型文件链接:https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/ascend_community_projects/Aluminum_surface_defect_detection/best.onnx

下载yolov5官方源码6.1版本Releases · ultralytics/yolov5 (github.com),进入项目根目录,将best.pt模型文件复制到项目目录,执行命令

python export.py --weights best.pt –simplify

模型转换成功之后,显示的日志信息如下图所示,在项目根目录会生成best.onnx模型文件

 

步骤3 将转化后的YOLOv5模型onnx文件存放至./models/yolov5/。

步骤4 AIPP配置

由于yolov5模型的输入为rgb格式,pipeline中的图像解码为yuv格式,且数据类型不同,需要在atc转换模型时使用aipp预处理,该案例所需进行的aipp预处理包括色域转化以及归一化操作,aipp配置步骤如下:

在./models/yolov5文件夹创建insert_op.cfg配置文件,所需添加的配置内容的属性:

参数

参数说明

aipp_mode

每次模型推理过程采用固定的AIPP预处理参数进行处理

Related_input_rank

related_input_rank参数为可选,标识对模型的第几个输入做AIPP处理,从0开始,默认为0。例如模型有两个输入,需要对第2个输入做AIPP,则配置related_input_rank为1。

# 类型: 整型

Input_format

输入图像格式,必选。取值范围:YUV420SP_U8、XRGB8888_U8、RGB888_U8、YUV400_U8

src_image_size_w

src_image_size_h

原始图像的宽度、高度

宽度取值范围为[2,4096]或0;高度取值范围为[1,4096]或0,对于YUV420SP_U8类型的图像,要求原始图像的宽和高取值是偶数

crop

AIPP处理图片时是否支持抠图

类型:bool

取值范围:true/false,true表示支持,false表示不支持

Csc_switch

色域转换开关,静态AIPP配置

类型:bool

取值范围:true/false,true表示开启色域转换,false表示关闭

rbuv_swap_switch

R通道与B通道交换开关/U通道与V通道交换开关

类型:bool

取值范围:true/false,true表示开启通道交换,false表示关闭

matrix_rxcy

X和y代表矩阵的行和列

一旦确认了AIPP处理前与AIPP处理后的图片格式,即可确定色域转换相关的参数值(matrix_r*c*配置项的值是固定的,不需要调整)

var_reci_chn

归一化配置参数

把需要处理的数据经过处理后限制在一定范围内,方便后面数据的处理。

pixel_out_chx(i)=[pixel_in_chx(i)-mean_chn_i-min_chn_i]*var_reci_chn

最终配置参数如下图所示:

 

 

配置文件的教程请参考如下链接:配置文件模板 - CANN 5.0.4 ATC工具使用指南 01 - 华为 (huawei.com)

  • 5 模型转换

模型转换有两种方式,一种是通过MindStudio可视化操作,另一种是通过命令行的方式,使用MindStudio进行模型转换参考该链接

使用命令方式进行模型转换步骤如下:

首先开启一个SSH会话

 

切换到项目根目录,运行如下命令:

atc  --input_shape="images:1,3,640,640" --out_nodes="Transpose_286:0;Transpose_336:0;Transpose_386:0" --output_type=FP32 --input_format=NCHW --output="./models/yolov5/yolov5_add_bs1_fp16" --soc_version=Ascend310 --framework=5 --model="./models/yolov5/best.onnx" --insert_op_conf=./models/yolov5/insert_op.cfg

模型转换成功,模型保存在--output定义的路径下,输出结果如图所示:

 

Atc中各个参数代表的含义请参考这个链接:参数说明 - CANN 5.0.4 ATC工具使用指南 01 - 华为 (huawei.com)。常见的报错请参考这个链接:FAQ - CANN 5.0.4 ATC工具使用指南 01 - 华为 (huawei.com)

4.3.4 编写后处理配置文件

 在./models/yolov5创建模型后处理配置文件yolov5addbs1_fp16.cfg,对后处理参数进行配置:

表1 配置文件中各个参数的意义

参数名称

参数介绍

修改方法

默认值

CLASS_NUM

铝材缺陷检测的类别数目。

在models/yolov5/yolov5_add_bs1_fp16.cfg文件中修改CLASS_NUM的大小即可

10

BIASES_NUM

铝材缺陷检测锚点框数量

在models/yolov5/yolov5_add_bs1_fp16.cfg文件中修改BIASES_NUM的大小即可

18

BIASES

铝材缺陷检测锚点框,用kmeans计算最合适的锚点框

在models/yolov5/yolov5_add_bs1_fp16.cfg文件中修改BIASES即可

17,14,161,31,113,69,649,17,637,32,636,73,625,132,640,202,626,365

YOLO_TYPE

YOLO输出特征向量的维度数,YOLOv5使用的是3

在models/yolov5/yolov5_add_bs1_fp16.cfg文件中修改YOLO_TYPE即可

3

SCORE_THRESH

是否为框的阈值,大于此值才认定为框

在models/yolov5/yolov5_add_bs1_fp16.cfg文件中修改SCORE_THRESH的大小即可

0.25

IOU_THRESH

两个框的IOU阈值,超过此值则被认定为同一个框,用于nms算法

在models/yolov5/yolov5_add_bs1_fp16.cfg文件中修改IOU_THRESH的大小即可

0.5

OBJECTNESS_THRESH

识别目标置信度的阈值,大于阈值才会认定为目标

在models/yolov5/yolov5_add_bs1_fp16.cfg文件中修改OBJECTNESS_THRESH的大小即可

0.0

YOLO_VERSION

YOLO版本号,本项目使用的YOLOv5,故取值为5

在models/yolov5/yolov5_add_bs1_fp16.cfg文件中修改YOLO_VERSION的大小即可

5

4.3.5 配置names文件

在./models/yolov5文件夹下创建aldefectdetection.names文件,按顺序配置相应类名,该文件为数据集中所有类别,后处理插件通过读取改文件,返回准确的类别名称,达到缺陷识别的目的:

 

4.3.6 可视化流程编排

根据已经确定的业务流程和合适的插件,利用MindStudio进行可视化插件编排,需要用到的为以下六个插件。

  •     1. appsrc # 输入
  •     2. mxpi_imagedecoder # 图像解码
  •     3. mxpi_imageresize # 图像缩放
  •     4. mxpi_tensorinfer # 模型推理(铝材缺陷检测)
  •     5. mxpi_objectpostprocessor # 模型后处理(yolov5)
  •     6. appsink # 输出

用MindStudio进行可视化流程编排,工具栏依次点击“Ascend > MindX SDK Pipeline :

 

搜索流程编排中需要用到的插件:

 

将插件依次拖动到如下界面并连接起来,Format选项可以整理插件连接的排列,让界面更加美观。

 

点击需要配置参数的插件,在如下区域设置合适的参数:

 

点击save,生成相应的pipeline代码,该代码会将可视化pipeline中设置的参数也加载到对应的插件中去:

{
  "classification+detection": {
    "stream_config": {
      "deviceId": "0"
    },
    "appsrc0": {
      "props": {
        "blocksize": "409600"
      },
      "factory": "appsrc",
      "next": "mxpi_imagedecoder0"
    },
    "mxpi_imagedecoder0": {
      "factory": "mxpi_imagedecoder",
      "next": "mxpi_imageresize0"
    },
    "mxpi_imageresize0": {
       "props": {
                "dataSource": "mxpi_imagedecoder0",
                "resizeType": "Resizer_KeepAspectRatio_Fit",
                "resizeWidth":"640",
                "resizeHeight":"640",
                "paddingType":"Padding_NO",
                "interpolation":"2"
            },
      "factory": "mxpi_imageresize",
      "next": "mxpi_tensorinfer0"
    },

    "mxpi_tensorinfer0": {
      "props": {
        "dataSource": "mxpi_imageresize0",
        "modelPath": "./models/yolov5/yolov5_add_bs1_fp16.om"
      },
      "factory": "mxpi_tensorinfer",
      "next": "mxpi_objectpostprocessor0"
    },
    "mxpi_objectpostprocessor0": {
      "props": {
                "dataSource": "mxpi_tensorinfer0",
                "postProcessConfigPath": "./models/yolov5/yolov5_add_bs1_fp16.cfg",
                "labelPath": "./models/yolov5/aldefectdetection.names",
                "postProcessLibPath": "${HOME}/MindX_SDK/mxVision-2.0.4/lib/modelpostprocessors/libyolov3postprocess.so"
            },
      "factory": "mxpi_objectpostprocessor",
      "next": "mxpi_dataserialize0"
    },
    "mxpi_dataserialize0": {
      "props": {
        "outputDataKeys": "mxpi_objectpostprocessor0"
      },
      "factory": "mxpi_dataserialize",
      "next": "appsink0"
    },

    "appsink0": {
      "props": {
        "blocksize": "4096000"
      },
      "factory": "appsink"
    }
  }
}

 可视化流程编排极大地提升了开发效率,通过这种方式用户可以很快的完成pipeline的编排。

4.3.7 编写main.py文件

main文件的编写逻辑如下图所示:

  •  

 

 

  按照上述流程图,完成代码开发,其中,通过SendDataWithUniqueId将数据送入流里,GetResultWithUniqueId从流里获取数据,最终用opencv将位置信息和类别信息标记在图片上并保存。

主函数main.py:

    1. 初始化流管理器,如果初始化失败,则提示用户并退出程序:

 

2.通过streamManagerApi创建流,导入pipeline文件,如果失败,则提示用户并退出程序

 

3. 构建输入数据,并对输入数据进行检查,确保输入的图片存在且不为空,否则提示用户并退出程序。

 

4. 对输入数据进行预处理,对齐YOLOv5数据预处理操作。

 

5. 将输入数据传入到指定流中,并通过uniqueId获取指定流的输出结果:

 

6. 读取流中的结果,并将位置信息和类别信息输出到图片上,保存图片

 

7. 销毁流

 

4.4 项目下载连接以及项目结构

完整项目请在此处下载:ascend_community_projects: MindX边缘开发套件社区代码仓库

项目目录结构如下所示:

├── models

│   ├── yolov5

│   │   ├── aldefectdetection.names      # 铝材缺陷检测类别

│   │   ├── insert_op.cfg # yolov5 aipp转换配置

│   │   ├── yolov5_add_bs1_fp16.cfg # yolov5后处理配置

│   │   ├── yolov5_add_bs1_fp16.om       # 铝材缺陷检测模型

│   │   ├── best.onnx                    # 用于模型转换

├── pipeline

│   └── AlDefectDetection.pipeline       # pipeline文件

├── main.py

├── eval.py

├── eval_pre.py # letterbox预处理

├── plots.py # 绘图工具类

├── utils.py # 工具类

└── test.jpg

5. 运行

5.1 配置远程映射

 在工具栏"Tools > Deployment> Configuration"在Connection选项中配置远程连接。

 

在Mappings选项中配置远程映射,同步远端和本地代码。配置远端路径之后点击OK完成映射。

 

 在工具栏点击"Tools > Deployment> Upload to"上传本地代码到远端服务器

 

  在精度测试下载的数据集中任意选择一张图片放在项目的根目录下,并命名为test.jpg

在main.py文件点击右键,Modify Run Configuration,配置python解释器,选择远端python解释器,配置完成之后点击apply,点击OK。

 

配置完成之后即可右键运行main.py文件得到结果,在程序中,通过输出流里取得的数据,我们可以看到图片的位置和类别信息。通过这些位置信息,我们进一步作出结果图:

 

 

5.2 精度测试

准备测试数据https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/ascend_community_projects/Aluminum_surface_defect_detection/testDatas.zip和om模型文件:https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/ascend_community_projects/Aluminum_surface_defect_detection/yolov5_add_bs1_fp16.om

运行项目根目录下的eval.py,该文件是在main.py的基础上循环输入测试数据集图片得到结果。

生成的位置信息和类别信息会以txt文件的形式保存在项目目录下的test/testouttxt/。在map.py界面右键,修改运行配置,添加路径参数

 

 配置命令行参数:

 

其中--gt为测试集数据的标签路径,--testpath为模型输出结果的路径(即上述test/testpre_post/),包括分类结果、位置信息和置信度参数。

结果如下图所示:

 

mAP0.5为0.8135478,mAP0.5:0.95为0.5587293358。

其中mAP是目标检测模型中常用的评价指标,它的英文全称是(Mean Average Precision),翻译过来就是平均精确率的平均。mAP0.5是指计算标准为IOU阈值大于0.5,也就是预测框和标签IOU>0.5为正样本。mAP0.5:0.95是指取IOU阈值为以0.05为步长,0.5为起始数据,一直到IOU阈值为0.95的十组数据的平均精度。

6. FAQ

1 尺寸不匹配

问题描述:

提示mxpi_tensorinfer0The input of the model does not match] The datasize of concated inputTensors0 does not match model inputTensors0. Tensor Dtype: TENSORDTYPEUINT8, model Dtype: TENSORDTYPEUINT8.

 

解决方案:

模型经过插件处理后的图像与模型输入不匹配,检查模型经过pipeline之后的尺寸大小是否和模型输入匹配。

2 模型路径未进行正确配置

问题描述:

提示 Failed to get model, the model path is invalidate.

 

解决方案:

检查模型存放路径,正确配置模型路径。

3 未修改pipeline中后处理插件的postProcessLibPath属性

问题描述:

提示[Object, file or other resource doesn't exist] The postprocessing DLL does not exist

 

解决方案:

修改pipeline文件中mxpi_objectpostprocessor0插件的postProcessLibPath属性,修改为{SDK安装路径}/lib/modelpostprocessors/libyolov3postprocess.so

4 同步远端CANN开发包失败

问题描述:

提示[PermissionError: [Errno 13] Permission denied: '/usr/local/Ascend/ascend-toolkit/5.0.4/pyACL/scene.info' Command execute fail, exitStatus = 1]

 

解决方案:

将CANN开发包安装到用户目录下。

7. 一些个人经验总结

  在编写pipeline的时候,MindStudio提供的可视化流程编排极大地提高了开发效率,在MindStudio可以通过拖动的方式完成pipeline的编写,参数也可以很方便的在可视化流程编排中配置;

  在开发中我们难免会遇到各种各样奇奇怪怪的问题,昇腾论坛是个不错的选择,有问必答,从大四开始已经陆陆续续问了挺多问题,答复速度比较快,开发中受阻,不妨在论坛里请求大佬寻求帮助,链接:华为云论坛云计算论坛开发者论坛_技术论坛-华为云 (huaweicloud.com)

 

  在做模型转换前,最好用netron确定一下输出节点,找到正确输出节点,才能让om模型正确输出,netron下载链接:lutzroeder/netron: Visualizer for neural network, deep learning, and machine learning models (github.com)

  1. Mindstuido下载连接

   链接:(MindStudio下载-昇腾社区 (hiascend.com)

  1. 开发过程中用到的链接

  MindX SDK 2.0.4 mxVision 用户指南:MindX SDK 2.0.4 mxVision 用户指南 01 - 华为 (huawei.com)

  CANN安装指南(在用MindStudio可能会由于权限问题,导致远端CANN开发包同步不到本地,可以安装该包到用户目录下) :在昇腾设备上安装 - CANN 5.0.4 软件安装指南 01 - 华为 (huawei.com)

 基于MindStudio的MindX SDK应用开发全流程:基于MindStudio的MindX SDK应用开发全流程哔哩哔哩bilibili

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值