写点什么

基于华为云 ModelArts 和弹性云服务器 ECS 的 AI 全流程开发——昇腾工业质检应用实战【华为云至简致远】

作者:sofiya
  • 2022 年 8 月 07 日
  • 本文字数:10886 字

    阅读完需:约 36 分钟

【摘要】 基于华为云 ModelArts 和弹性云服务器 ECS 完成从训练到部署的 AI 全流程开发,介绍如何使用昇思 MindSpore 框架构建 U-Net 网络模型,使用线上昇腾澎湃算力在工业质检的模拟数据集上进行训练,并将保存的模型编译生成适配昇腾 AI 处理器的离线模型,使用 MindX SDK mxVision 进行推理,从而实现图像分割的任务。前言随着新一轮科技革命和产业变革的加速演进,全球各国都在借助新技术推动制造业升级,从工业 2.0 自动化开始兴起,到工业 3.0 信息化普及,如今正迈向工业 4.0 智能化。借助 IoT、工业大数据、人工智能等先进技术实现从低端劳动密集型产业向高端科技型产业的制造升级。


在应用人工智能技术之前,部分场景下已出现传统机器视觉进行质检的案例。但是由于产品零件复杂、光源多样等因素的限制,更多场景还是依赖于人工质检。而人工智能技术的融合可进一步提升检测精度,很多实践已证明 AI 算法可实现高达 99%以上检测精度,可以应用在绝大多数工业质检场景中,人工智能已经进入场景化应用时代。


image.png


从 AI 算法到工业制造场景化应用还有很远,算法开发、应用开发、业务部署是阻碍 AI 应用进入工业生产的三大鸿沟。


image.png


为此,华为昇腾计算秉承“硬件开放、软件开源”的理念,打造了昇腾智能制造使能平台,致力于推进制造行业转型升级。


在硬件方面,华为提供从模组/板卡到服务器/集群的 Atlas 系列化硬件。Atlas 200 AI 加速模块具有极致性能、超低功耗的特点,可以在端侧实现物体识别、图像分类等;Atlas 300I 推理卡提供超强 AI 推理性能,以超强算力加速应用,可广泛应用于推理场景。


在软件方面,为了帮助开发者跨越 AI 应用落地制造行业的三大鸿沟,华为提供了全栈软件平台与工具。特别是昇腾应用使能 MindX,帮助广大应用开发者快速开发 AI 应用,让 AI 进入制造行业。据介绍,MindX 中包含了“2+1+X”,其中“2”是深度学习使能 MindX DL 和智能边缘使能 MindX Edge,帮助开发者快速搭建深度学习和边缘推理的基础平台;“1”是优选模型库 ModelZoo,为开发者提供了各个场景下经过调优的模型,开发者只需根据自身场景需要,按需下载即可;最后是面向行业应用的 SDK,华为已经在昇腾社区发布了面向智能制造场景的 mxManufacture SDK 和 mxVision SDK,聚焦于工业质检场景,能够以很少的代码量、甚至于零代码完成制造行业 AI 应用开发。


image.png


简介在这里使用工业质检场景中的模拟数据集,采用 MindSpore 深度学习框架构建 U-Net 网络,在华为云平台的 ModelArts 上创建基于昇腾 910 处理器的训练环境,启动训练并得到图像分割的模型;之后在华为云平台的 ECS 弹性云服务器上创建基于昇腾 310 处理器的推理环境,将该模型转换成离线模型,使用 MindXSDKmxVision 执行推理任务。


image.png


应用场景效果图:


image.png


业务流层图:


image.png


基于华为云平台的 ModelArts 完成训练先来介绍一下基本概念!认识一下!


华为云 ModelArts 平台


image.png


ModelArts 是面向开发者的一站式 AI 平台,为机器学习与深度学习提供海量数据预处理及交互式智能标注、大规模分布式训练、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期 AI 工作流。


MindSpore 深度学习框架


image.png


昇思 MindSpore 是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标,提供支持异构加速的张量可微编程能力,支持云、服务器、边和端多种硬件平台。


Ascend 910


image.png


昇腾 910 是一款具有超高算力的 AI 处理器,其最大功耗为 310W,华为自研的达芬奇架构大大提升了其能效比。八位整数精度(INT8)下的性能达到 640TOPS,16 位浮点数(FP16)下的性能达到 320 TFLOPS。


作为一款高集成度的片上系统(SoC),除了基于达芬奇架构的 AI 核外,昇腾 910 还集成了多个 CPU、DVPP 和任务调度器(Task Scheduler),因而具有自我管理能力,可以充分发挥其高算力的优势。


昇腾 910 集成了 HCCS、PCIe 4.0 和 RoCE v2 接口,为构建横向扩展(Scale Out)和纵向扩展(Scale Up)系统提供了灵活高效的方法。HCCS 是华为自研的高速互联接口,片内 RoCE 可用于节点间直接互联。最新的 PCIe 4.0 的吞吐量比上一代提升一倍。


数据集数据集模拟工业质检场景,在 Atlas200DK 上标出蓝色区域,作为检测目标(前景),分为原始数据集和预处理后的数据集。


image.png


原始数据集 raw_data 的目录结构如下:


├── raw_data│ ├── annotations # 标注文件夹│ │ ├── image_info_annotations.json # 图像名称、图像宽度、高度等信息│ │ ├── instances_annotations.json # 目标检测、分割任务的数据集标注文件│ │ ├── panoptic_annotations # 空文件夹│ │ ├── panoptic_annotations.json # 全景标注信息│ │ └── stuff_annotations.json # 材料标注信息│ ├── annotations.xml # 分割信息、目标边界框信息、目标面积、对应图像 id 以及类别 id 等│ └── images│ ├── SW1hZ2VfMjAyMTA3MjcxNTA0MDAxNDA.jpg # 图片│ ├── SW1hZ2VfMjAyMTA3MjcxNTA0MDk1MzM.jpg│ ├── SW1hZ2VfMjAyMTA3MjcxNTA0MDY1NDU.jpg│ ├── SW1hZ2VfMjAyMTA3MjcxNTA0Mjc0NzA.jpg│ ├── …


预处理后的数据集 data 的目录结构如下:


.└─data└─SW1hZ2VfMjAyMTA3MjcxNTA0MDAxNDA├─image.png # 图片└─mask.png # 标签└─SW1hZ2VfMjAyMTA3MjcxNTA0MDk1MzM├─image.png└─mask.png...U-Net 网络 U-Net 网络是由 FCN 网络衍生而来,最初是为了解决生物图像的分割问题,在 2015 年 ISBI 细胞跟踪竞赛中,U-Net 获得了许多最佳奖项。由于分割效果好,U-Net 被广泛应用于图像分割领域,如卫星图像分割、工业瑕疵检测等。


image.png


U-Net 网络具有如下特点:


全卷积网络


U-Net 网络使用了 “全卷积网络” ,可以使用很少的训练图像就能产生更精确的分割。全卷积网络的主要思想是用连续的层来补充通常的收缩网络,其中池化算子被上采样算子取代。因此,这些层增加了输出的分辨率。为了定位,将收缩路径的高分辨率特征与上采样输出相结合。然后,一个连续的卷积层可以学习基于这个信息组装一个更精确的输出。因为全卷机网络和上采样在 FCN 网络中已出现,在此不过多讲述。


image.png


数据增强


当只有很少的训练样本可用时,可以通过数据增强来训练网络的不变性和鲁棒性。显微图像需要具备平移和旋转不变性,并且对形变和灰度变化鲁棒。因此将训练样本进行随机弹性形变是训练分割网络的关键。


image.png


上采样


这里介绍上采样中的反卷积(TransposedConvolution),是指在深度学习计算中,将图像尺寸由小分辨率到大分辨率的映射操作。注意,反卷积只能恢复尺寸,不能恢复数值。


image.png


压缩路径和扩张路径的 U 型结构


U-Net 网络是“编码器(Encoder)—解码器(Decoder)”网络,是包含压缩路径(contractingpath)和扩张路径(expandingpath)的 U 型结构。


image.png


其中,蓝/白色框表示 feature map;蓝色箭头表示 3x3 卷积,用于特征提取;灰色箭头表示 skip-connection,用于特征融合;红色箭头表示池化 pooling,用于降低维度;绿色箭头表示上采样 upsample,用于恢复维度;青色箭头表示 1x1 卷积,用于输出结果。同时,U-Net 网络采用了跳级结构(skipconnection),目的是为了融合特征信息,使深层和浅层的信息融合起来。还有 CopyandCrop,先通过 Crop 操作使得融合的特征图大小一致,之后再做 Copy 操作将两张特征图拼接(concatenation)起来。(copy and crop):在 UNet 有四个跳级结构,目的是为了融合特征信息,使深层和浅层的信息融合起来。不仅图片大小要一致(crop 操作),而且特征的维度(channels)也要一样(copy 操作)。Copy 是指拼接操作(concatenation),Crop 是指将图片裁剪,即图中的 Copy and Crop 操作。


image.png


纸上得来终觉浅,来看看 U-Net 相关网络代码(MindSpore):


class UNet(nn.Cell):"""Simple UNet with skip connection"""def init(self, in_channel, n_class=2, feature_scale=2, use_deconv=True, use_bn=True):super(UNet, self).init()self.in_channel = in_channelself.n_class = n_classself.feature_scale = feature_scaleself.use_deconv = use_deconvself.use_bn = use_bn


    filters = [64, 128, 256, 512, 1024]    filters = [int(x / self.feature_scale) for x in filters]
# Down Sample self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2, pad_mode="same") self.conv0 = UnetConv2d(self.in_channel, filters[0], self.use_bn) self.conv1 = UnetConv2d(filters[0], filters[1], self.use_bn) self.conv2 = UnetConv2d(filters[1], filters[2], self.use_bn) self.conv3 = UnetConv2d(filters[2], filters[3], self.use_bn) self.conv4 = UnetConv2d(filters[3], filters[4], self.use_bn)
# Up Sample self.up_concat1 = UnetUp(filters[1], filters[0], self.use_deconv, 2) self.up_concat2 = UnetUp(filters[2], filters[1], self.use_deconv, 2) self.up_concat3 = UnetUp(filters[3], filters[2], self.use_deconv, 2) self.up_concat4 = UnetUp(filters[4], filters[3], self.use_deconv, 2)
# Finale Convolution self.final = nn.Conv2d(filters[0], n_class, 1)
def construct(self, inputs): x0 = self.conv0(inputs) # channel = filters[0] x1 = self.conv1(self.maxpool(x0)) # channel = filters[1] x2 = self.conv2(self.maxpool(x1)) # channel = filters[2] x3 = self.conv3(self.maxpool(x2)) # channel = filters[3] x4 = self.conv4(self.maxpool(x3)) # channel = filters[4]
up4 = self.up_concat4(x4, x3) up3 = self.up_concat3(up4, x2) up2 = self.up_concat2(up3, x1) up1 = self.up_concat1(up2, x0)
final = self.final(up1)
return final
复制代码


那么赶紧来 ModelArts 实践吧!


在 ModelArts 执行训练说明


这里以脚本方式运行,可以在 Notebook 环境的终端执行(可参照“终端运行示例”的命令行),也可在 Notebook 环境中新建 MindSpore 的内核环境执行(可参照“运行脚本”的命令行)。


注意:Notebook 环境内上传、创建和编辑的文件均在/home/ma-user/work 目录下。


  1. 创建 NoteBook 环境我们登录 ModelArts,找到新版 NoteBook:


image.png


选择如下环境:


image.png


  1. 下载完整工程在 Notebook 环境内新建终端,执行如下代码,将项目代码 unet.zip 下载至云端环境内,并解压。注意以下在 Treminal 中执行,注意要切换到 work 目录:


终端运行示例:


lscd workwget https://alexed.obs.cn-north-4.myhuaweicloud.com/unet.zipunzip unet.zip 运行脚本:


!wget https://alexed.obs.cn-north-4.myhuaweicloud.com/unet.zip!unzip unet.zip 这里试试终端运行,先来下载工程


image.png


执行解压缩:


image.png


运行完成截图:


image.png


这里需要注意,如果解压缩的时候报错了,就将压缩包链接复制到浏览器打开,会自动下载到电脑本地,之后解压缩,再压缩成.zip 文件,之后再上传到 NoteBook,之后再解压就行了。切记,一定是先解压,后压缩,不要直接上传,因为还是会报错的。


我们可以得到工程完整目录结构:


├──unet├──README.md


├──data // 预处理后的数据集文件夹├──raw_data // 原始数据集├──out_model│ ├──om_script.sh // air 模型转 om 脚本│ ├──unet_hw960_bs1.air // 训练后的 air 文件│ ├──unet_hw960_bs1_noAIPP.om // om 文件,用于推理├──pred_visualization // 可视化图片保存文件├──src // 功能函数│ ├──unet_medical // U-Net 网络│ ├──unet_nested // U-Net++网络│ ├──config.py // 配置文件│ ├──data_loader.py // 数据加载│ ├──eval_callback.py // 训练时评估回调│ ├──loss.py // 损失函数│ ├──utils.py // 工具类函数├──draw_result_folder.py // 文件夹图片可视化├──draw_result_single.py // 单张图片可视化├──eval.py // 模型验证├──export.py // 模型导出,ckpt 转 air/mindir/onnx├──postprocess.py // 后处理├──preprocess.py // 前处理├──preprocess_dataset.py // 数据集预处理├──train.py // 模型训练├──requirements.txt3. 配置文件参数文件参数脚本为 src/config.py,包括 unet_medical,unet_nested,unet_nested_cell,unet_simple,unet_simple_coco,共 5 种配置,表示模型与数据集之间的组合。


这里使用 unet_simple_coco,表示使用 unet 模型,配合 coco 格式数据集进行训练,因此可根据实际开发情况修改 cfg_unet_simple_coco 内的参数。


  1. 数据集预处理数据集预处理是指将类 coco 数据集转化成模型训练需要数据格式。MindSpore 数据集预处理需调用脚本 src/ config.py。预计数据集预处理所需时间约为 10 分钟。这里既可以在终端运行,也可以在 Notebook 环境中新建 MindSpore 的内核环境执行。


终端运行示例:


python3 preprocess_dataset.py --data_url=./data/–data_url:数据集预处理后的保存路径。


运行脚本:


!python3 preprocess_dataset.py --data_url=./data/运行截图:


image.png


注意:预处理完的数据集会保存在/unet/data/文件夹下。


  1. 模型训练 MindSpore 模型训练需调用如下脚本:


preprocess_dataset.py:将类 coco 数据集转化成模型训练需要数据格式。src/unet_xxx/:存放 unet/unet++模型结构。src/data_loader.py:存放数据加载功能函数。src/eval_callback:存放 cb 函数,用于训练过程中进行 evalsrc/utils.py:mindspore 自定义 cb 函数,自定义 metrics 函数。train.py 预计模型训练所需时间约为 20 分钟。


终端运行示例:


python train.py --data_url=./data/ --run_eval=True–data_url:数据集输入路径。–run_eval:True 表示训练过程中同时进行验证。


运行脚本:


!python train.py --data_url=./data/ --run_eval=True 运行截图:


image.png


最终运行结果:


image.png


经过 5 轮的训练,图像分割模型已趋近收敛,并已找到最优 Dice 系数(Dice coefficient),说明模型预测值和标签的最高相似度达到大约 0.9968。


注:Dice 系数是一种度量集合相似度的函数,通常用于计算两个样本的相似度(取值范围为[0,1])。


  1. 推理验证 MindSpore 模型推理需调用如下脚本:


src/unet_xxx/:存放 unet/unet++模型结构。src/data_loader.py:存放数据预处理,数据加载功能函数。src/utils.py:mindspore 自定义 cb 函数,自定义 metrics 函数。eval.py 终端运行示例:


python eval.py --data_url=./data/ --ckpt_path=./ckpt_0/best.ckpt–data_url:数据集输入路径。–ckpt_path:ckpt 读取路径。


运行脚本:


!python eval.py --data_url=./data/ --ckpt_path=./ckpt_0/best.ckpt 运行截图:


image.png


最终运行结果截图:


image.png


经过交叉验证,Dice 系数为 0.9978,IOU 系数为 0.9954,说明模型在验证集表现优异。


注:IOU(Intersection over Union)是一个度量函数,用来描述两个物体边界框的重叠程度(取值范围为[0,1]),重叠的区域越大,IOU 值就越大。


  1. 结果可视化可以通过画图的方式将图像的结果可视化,方便查看。可视化方法有两种:


draw_result_single.py:单张图片可视化,输出单张图片的裁剪画图结果 crop_plot.png 和模型预测的结果 predict_plot.png。draw_result_folder.py:文件夹图片可视化,输出文件夹内图片的模型预测结果 predict.png。单张图片可视化,终端运行示例:


python draw_result_single.py --data_url=./data/SW1hZ2VfMjAyMTA3MjcxNTE2MzYzNzk --save_url=./pred_visualization --ckpt_path=./ckpt_0/best.ckpt–data_url:数据集输入路径(到单张图像)。–save_url:输出图像保存路径。–ckpt_path:ckpt 读取路径。


运行脚本:


!python draw_result_single.py --data_url=./data/SW1hZ2VfMjAyMTA3MjcxNTE2MzYzNzk --save_url=./pred_visualization --ckpt_path=./ckpt_0/best.ckpt 最终运行得到结果:


image.png


这是直接将运行结果绘制到原图上的结果,红色部分是预测的结果,其实还有蓝色的区域(标签),但是几乎看不到蓝色区域了,因为几乎全部被红色的预测结果覆盖了,可以预测准确度很高啊。


image.png


文件夹图片可视化,终端运行示例:


python draw_result_folder.py --data_url=./data/ --save_url=./pred_visualization --ckpt_path=./ckpt_0/best.ckpt–data_url:数据集输入路径(到图像文件夹)。–save_url:输出图像保存路径。–ckpt_path:ckpt 读取路径。


运行脚本:


!python draw_result_folder.py --data_url=./data/ --save_url=./pred_visualization --ckpt_path=./ckpt_0/best.ckpt 运行截图:


image.png


  1. 模型保存如果想在昇腾 AI 处理器上执行推理,可以通过网络定义和 CheckPoint 生成 AIR 格式模型文件。


终端运行示例:


python export.py --ckpt_file="./ckpt_0/best.ckpt" --width=960 --height=960 --file_name="out_model/unet_hw960_bs1" --file_format="AIR"ckpt_file: ckpt 路径。width: 模型输入尺寸。height: 模型输入尺寸。file_name: 输出文件名。file_format: 输出格式,必须为[“ONNX”, “AIR”, “MINDIR”]。运行脚本:


!python export.py --ckpt_file="./ckpt_0/best.ckpt" --width=960 --height=960 --file_name="out_model/unet_hw960_bs1" --file_format="AIR"输出结果:out_model/unet_hw960_bs1.air


最后将 unet_hw960_bs1.air 模型下载至本地,供后续 MindX SDK 推理实验使用。


贴心提示:结束后请及时停止 Notebook 训练作业,避免资源浪费和额外花费!!!


基于华为云平台的 ECS 完成部署让我们先来认识一下!


华为云 ECS 平台


image.png


弹性云服务器(Elastic Cloud Server, ECS)是一种云上可随时自助获取、可弹性伸缩的计算服务,可帮助您打造安全、可靠、灵活、高效的应用环境。


Ascend 310


image.png


昇腾 310 是一款高效、灵活、可编程的 AI 处理器。基于典型配置,八位整数精度(INT8)下的性能达到 22TOPS,16 位浮点数(FP16)下的性能达到 11 TFLOPS,而其功耗仅为 8W。昇腾 310 芯片采用华为自研的达芬奇架构,集成了丰富的计算单元,在各个领域得到广泛应用。随着全 AI 业务流程的加速,昇腾 310 芯片能够使智能系统的性能大幅提升,部署成本大幅降低。


昇腾 310 在功耗和计算能力等方面突破了传统设计的约束。随着能效比的大幅提升,昇腾 310 将人工智能从数据中心延伸到边缘设备,为平安城市、自动驾驶、云服务和 IT 智能、智能制造、机器人等应用场景提供了全新的解决方案,使能智慧未来。


搭建环境这里需要购买 ECS 服务-Ai1 资源,并进行环境的配置和升级,我们主要介绍下其中的 cmake 的升级部分。提醒下,以下操作基本全部以脚本方式运行,可以直接在弹性云服务器的终端执行,推荐使用 MobaXterm 连接 ECS。


注意 cmake 的升级过程耗时较长,请合理安排时间


  1. 更新软件 sudo apt update # 更新软件列表 sudo apt upgrade # 更新软件 sudo apt autoremove # 清除不必要的依赖 sudo apt autoclean # 清除缓存 sudo apt clean # 清除软件包缓存最终运行完成效果图:


image.png


  1. 更新 cmake 首先,清除旧版 camke(3.10.2):


sudo apt autoremove cmake 运行完成效果图:


image.png


接下来下载并解压新版 cmake(3.20.1)


mkdir codes # 创建 codes 文件夹 cd codes # 进入 codes 文件夹 wget https://github.com/Kitware/CMake/archive/refs/tags/v3.20.1.tar.gz --no-check-certificate # 下载 tar -zxvf v3.20.1.tar.gz # 解压 cd CMake-3.20.1 运行完成效果图:


image.png


安装 cmake


./bootstrapmakesudo make install 运行完成效果图:


image.png


返回主目录:


cdECS 部署


  1. 下载项目代码这里可以直接复制如下链接到浏览器打开,会自动下载到本地,之后将项目文件 unet_sdk.zip 上传至华为云 ECS 弹性云服务器/root/目录下,并解压。


https://alexed.obs.cn-north-4.myhuaweicloud.com/unet_sdk.zip或者像之前在 NoteBook 下载工程文件那样,直接在 ECS 的终端通过 wget 命令下载,直接下载到 ECS:


wget https://alexed.obs.cn-north-4.myhuaweicloud.com/unet_sdk.zip然后,将之前训练完成的 unet_hw960_bs1.air 模型上传至服务器/root/unet_sdk/model/目录下。


项目文件目录为:


├── unet_sdk├── README.md├── data //数据集│ ├── 1│ │ ├──image.png //图片│ │ ├──mask.png //标签│ ...├── model│ ├──air2om.sh // air 模型转 om 脚本│ ├──xxx.air //air 模型│ ├──xxx.om //om 模型│ ├──aipp_unet_simple_opencv.cfg // aipp 文件├── pipeline


│ ├──unet_simple_opencv.pipeline // pipeline 文件├── main.py // 推理文件


├── run.sh // 执行文件├── requirements.txt // 需要的三方库


  1. 模型转换这里要将 unet_hw960_bs1.air 模型转为昇腾 AI 处理器支持的.om 格式离线模型,此处模型转换需要用到 ATC 工具。


那么顺便聊聊 ATC 工具,昇腾张量编译器(Ascend Tensor Compiler,简称 ATC)是昇腾 CANN 架构体系下的模型转换工具,它可以将开源框架的网络模型或 Ascend IR 定义的单算子描述文件(json 格式)转换为昇腾 AI 处理器支持的.om 格式离线模型。模型转换过程中可以实现算子调度的优化、权值数据重排、内存使用优化等,可以脱离设备完成模型的预处理。


部分参数展示如下,更多详情请参考文档。


image.png


这里我们要运行脚本:


cd /root/unet_sdk/model/ # 切换至模型存储目录 atc --framework=1 --model=unet_hw960_bs1.air --output=unet_hw960_bs1 --input_format=NCHW --soc_version=Ascend310 --log=error --insert_op_conf=aipp_unet_simple_opencv.cfgframework:原始框架类型。model:原始模型文件路径与文件名。output:转换后的离线模型的路径以及文件名。input_format:输入数据格式。soc_version:模型转换时指定芯片版本。log:显示日志的级别。insert_op_conf:插入算子的配置文件路径与文件名,这里使用 AIPP 预处理配置文件,用于图像数据预处理。


如果运行结果显示 ATC run success,表示模型转换成功,得到 unet_hw960_bs1.om 模型。模型转换成功之后,可以使用 MindX SDK mxVision 运行脚本,在 Ascend 310 上进行推理。


image.png


注意 air 模型转 om 只支持静态 batch,这里 batchsize=1。


  1. MindX SDK mxVision 执行推理 MindX SDK 执行推理的业务流程:


通过 stream 配置文件,Stream manager 可识别需要构建的 element 以及 element 之间的连接关系,并启动业务流程。Stream manager 对外提供接口,用于向 stream 发送数据和获取结果,帮助用户实现业务对接。


plugin 表示业务流程中的基础模块,通过 element 的串接构建成一个 stream。buffer 用于内部挂载解码前后的视频、图像数据,是 element 之间传递的数据结构,同时也允许用户挂载元数据(Metadata),用于存放结构化数据(如目标检测结果)或过程数据(如缩放后的图像)。


image.png


这里简要介绍下 MindX SDK 基础概念:


image.png


更多详情可参考文档。


MindX SDK 业务流程编排:


Stream 配置文件以 json 格式编写,用户必须指定业务流名称、元件名称和插件名称,并根据需要,补充元件属性和下游元件名称信息。


以下为本次部署所用 pipeline/unet_simple_opencv.pipeline 文件内容如下,可根据实际开发情况进行修改。


{"unet_mindspore": {


"stream_config": {"deviceId": "0"},"appsrc0": {"props": {"blocksize": "4096000"},"factory": "appsrc","next": "mxpi_imagedecoder0"},"mxpi_imagedecoder0": {"props": {"cvProcessor": "opencv","outputDataFormat": "BGR"},"factory": "mxpi_imagedecoder","next": "mxpi_imagecrop0"},"mxpi_imagecrop0": {"props": {"cvProcessor": "opencv","dataSource": "ExternalObjects"},"factory": "mxpi_imagecrop","next": "mxpi_imageresize0"},"mxpi_imageresize0": {"props": {"handleMethod": "opencv","resizeType": "Resizer_Stretch","resizeHeight": "960","resizeWidth": "960"},"factory": "mxpi_imageresize","next": "mxpi_tensorinfer0"},"mxpi_tensorinfer0": {"props": {"dataSource": "mxpi_imageresize0","modelPath": "model/unet_hw960_bs1_AIPP.om"},"factory": "mxpi_tensorinfer","next": "mxpi_dumpdata0"},"mxpi_dumpdata0": {"props": {"requiredMetaDataKeys": "mxpi_tensorinfer0"},"factory": "mxpi_dumpdata","next": "appsink0"},"appsink0": {"props": {"blocksize": "4096000"},"factory": "appsink"}}}对于其的详细介绍如下:


image.pngimage.png


这里要针对性做些修改:


首先,修改 modelPath。打开 pipeline/unet_simple_opencv.pipeline 文件,将 mxpi_tensorinfer0 元件的属性 modelPath(模型导入路径)修改为之前模型转换后保存的模型 model/unet_hw960_bs1.om。修改后结果为:


"modelPath": "model/unet_hw960_bs1.om"接下来就可以运行脚本试试了。先激活 mxVision 环境变量:


. /root/mxVision/set_env.sh 之后,运行脚本:


cd /root/unet_sdk/ # 切换至推理脚本目录 bash run.sh 运行结果:


image.png


注意:由于 MindX SDK 默认日志级别为 debug,此日志级别下,dump_data 插件会将所有内容打印至终端,影响日志查看。因此可以通过修改日志级别的方式,避免打印不必要的信息。具体修改方法如下:


修改日志:


vi $MX_SDK_HOME/config/logging.conf 按 i 键修改 Line23 行,日志级别可改为 0 或 1 或 2。

Log level: -1-debug, 0-info, 1-warn, 2-error, 3-fatal

global_level=0 单击键盘的 Esc 键,输入:wq!,保存并退出。


提醒:实验结束后请及时关闭/删除 ECS 弹性云服务器,避免资源浪费和额外花费。


结语回顾整个过程,主要介绍如何使用 MindSpore 框架构建 U-Net 网络模型,使用线上昇腾算力在工业质检的模拟数据集上进行训练,并将保存的模型编译生成适配昇腾 AI 处理器的离线模型,部署在华为云 ECS 上,使用 MindX SDK mxVision 进行推理,从而实现图像分割的任务。通过这次体验,可以了解工业质检的背景,掌握 MindSpore 的基础使用,熟悉 U-Net 网络和图像分割的原理知识,掌握华为云 ModelArts 和 ECS 的环境搭建,熟悉昇腾 910 和昇腾 310 处理器的使用,掌握离线模型的转换方法,以及熟悉 MindX SDK mxVision 的使用。


总的来说,还是很不错的,能够感受到华为基于软硬件协同打造云端边的全栈全场景 AI 解决方案的发展和成熟,已经比最初我刚刚接触的时候不可同日而语,发展迅速,展示出了蓬勃的生命力和广阔的发展前景,期待未来的更多惊喜。

用户头像

sofiya

关注

还未添加个人签名 2022.08.01 加入

还未添加个人简介

评论

发布
暂无评论
基于华为云ModelArts和弹性云服务器ECS的AI全流程开发——昇腾工业质检应用实战【华为云至简致远】_sofiya_InfoQ写作社区