技术标签: 深度学习 目标检测 AI 人工智能 ai MindStudio
目 录
3 未修改pipeline中后处理插件的postProcessLibPath属性
MindStudio提供AI开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够使开发者在一个工具上就能高效便捷地完成AI应用开发 ·MindStudio采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。MindStudio-昇腾社区 (hiascend.com)
在本案例中,目的是基于MindX SDK,在华为云昇腾平台上,使用MindStudio开发端到端铝材缺陷检测的参考设计,实现对图像中的铝材进行缺陷类型分类和定位的功能,达到功能要求,并对精度进行测试。
开发环境为windows版本的MindStudio,运行环境在远端linux上。
请先确保远端环境上MindX SDK软件包已安装完成,安装方式请参见安装MindX SDK开发套件。
确保远端环境上CANN包已安装完成,安装方式请参见该链接
在远端服务器上配置环境变量
工具栏点击“File > Settings > Appearance & Behavior > System Settings > CANN”进入CANN管理界面。点击Change CANN配置CANN包。
配置远程连接以及远端CANN包路径(配置到版本号一级)
工具栏点击“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”界面
安装完成之后,界面如图所示:
工具栏点击“File > New > Project
选择左侧Ascend APP,创建Ascend APP应用工程,,创建MindX SDK空白工程(提供MindX SDK开发框架,不包含代码逻辑),点击finish完成创建。
创建完成之后目录结构如下图所示
删除config文件夹,创建models和pipeline里的文件,以备后续开发自己的业务流程,目录结构如图所示。
依次点击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编排流程图如下所示:
4.3.3 准备模型推理文件和数据
步骤1 训练铝材缺陷检测对应的yolov5模型,输出pt模型文件。
步骤2 将pt模型文件转换成onnx,也可直接通过以下链接下载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)
模型转换有两种方式,一种是通过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进行可视化插件编排,需要用到的为以下六个插件。
用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:
2.通过streamManagerApi创建流,导入pipeline文件,如果失败,则提示用户并退出程序
3. 构建输入数据,并对输入数据进行检查,确保输入的图片存在且不为空,否则提示用户并退出程序。
4. 对输入数据进行预处理,对齐YOLOv5数据预处理操作。
5. 将输入数据传入到指定流中,并通过uniqueId获取指定流的输出结果:
6. 读取流中的结果,并将位置信息和类别信息输出到图片上,保存图片
7. 销毁流
完整项目请在此处下载: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
在工具栏"Tools > Deployment> Configuration"在Connection选项中配置远程连接。
在Mappings选项中配置远程映射,同步远端和本地代码。配置远端路径之后点击OK完成映射。
在工具栏点击"Tools > Deployment> Upload to"上传本地代码到远端服务器
在精度测试下载的数据集中任意选择一张图片放在项目的根目录下,并命名为test.jpg
在main.py文件点击右键,Modify Run Configuration,配置python解释器,选择远端python解释器,配置完成之后点击apply,点击OK。
配置完成之后即可右键运行main.py文件得到结果,在程序中,通过输出流里取得的数据,我们可以看到图片的位置和类别信息。通过这些位置信息,我们进一步作出结果图:
准备测试数据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的十组数据的平均精度。
问题描述:
提示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之后的尺寸大小是否和模型输入匹配。
问题描述:
提示 Failed to get model, the model path is invalidate.
解决方案:
检查模型存放路径,正确配置模型路径。
问题描述:
提示[Object, file or other resource doesn't exist] The postprocessing DLL does not exist
解决方案:
修改pipeline文件中mxpi_objectpostprocessor0插件的postProcessLibPath属性,修改为{SDK安装路径}/lib/modelpostprocessors/libyolov3postprocess.so
问题描述:
提示[PermissionError: [Errno 13] Permission denied: '/usr/local/Ascend/ascend-toolkit/5.0.4/pyACL/scene.info' Command execute fail, exitStatus = 1]
解决方案:
将CANN开发包安装到用户目录下。
在编写pipeline的时候,MindStudio提供的可视化流程编排极大地提高了开发效率,在MindStudio可以通过拖动的方式完成pipeline的编写,参数也可以很方便的在可视化流程编排中配置;
在开发中我们难免会遇到各种各样奇奇怪怪的问题,昇腾论坛是个不错的选择,有问必答,从大四开始已经陆陆续续问了挺多问题,答复速度比较快,开发中受阻,不妨在论坛里请求大佬寻求帮助,链接:华为云论坛云计算论坛开发者论坛_技术论坛-华为云 (huaweicloud.com)。
在做模型转换前,最好用netron确定一下输出节点,找到正确输出节点,才能让om模型正确输出,netron下载链接:lutzroeder/netron: Visualizer for neural network, deep learning, and machine learning models (github.com)
链接:(MindStudio下载-昇腾社区 (hiascend.com)
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
文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文
文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作 导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释: cwy_init/init_123..._达梦数据库导入导出
文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js
文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6
文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输
文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...
文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure
文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割
文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答
文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。
文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入
文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf