Fork me on GitHub

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

【摘要】 基于华为云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_channel
        self.n_class = n_class
        self.feature_scale = feature_scale
        self.use_deconv = use_deconv
        self.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

2. 下载完整工程

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

终端运行示例:

ls
cd work
wget https://alexed.obs.cn-north-4.myhuaweicloud.com/unet.zip
unzip 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.txt

3. 配置文件参数

文件参数脚本为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内的参数。

4. 数据集预处理

数据集预处理是指将类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/文件夹下。

5. 模型训练

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

  • preprocess_dataset.py:将类coco数据集转化成模型训练需要数据格式。
  • src/unet_xxx/:存放unet/unet++模型结构。
  • src/data_loader.py:存放数据加载功能函数。
  • src/eval_callback:存放cb函数,用于训练过程中进行eval
  • src/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])。

6. 推理验证

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值就越大。

7. 结果可视化

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

  • 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

8. 模型保存

如果想在昇腾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

2. 更新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

./bootstrap
make
sudo make install

运行完成效果图:

image.png

返回主目录:

cd

ECS部署

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                // 需要的三方库

2. 模型转换

这里要将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.cfg

framework:原始框架类型。
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。

3. 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.png
image.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解决方案的发展和成熟,已经比最初我刚刚接触的时候不可同日而语,发展迅速,展示出了蓬勃的生命力和广阔的发展前景,期待未来的更多惊喜。


本文地址:https://www.6aiq.com/article/1660717701552
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出