【每天进步一点点】Atlas 200 DK移植应用的一点感受

举报
Tianyi_Li 发表于 2020/07/24 23:57:53 2020/07/24
【摘要】 闲话少说,直接上正文吧!目录如图:1.1 不同平台的框架差异介绍以AI典型应用目标检测为例,其主要流程为:① 模型转换:将训练得到的模型转换为适配平台硬件环境的模型。② 图像预处理:对数据进行预处理,比如视频解码、图片解码,或者对图片进行指定的裁剪、缩放、格式转换等操作,以满足模型推理的需要。③ 模型推理:将预处理后的图像传输至模型,执行推理,输出结果。④ 图像后处理:对模型推理结果...

闲话少说,直接上正文吧!

目录如图:

image.png


1.1 不同平台的框架差异介绍

AI典型应用目标检测为例,其主要流程为:

①  模型转换:将训练得到的模型转换为适配平台硬件环境的模型。

②  图像预处理:对数据进行预处理,比如视频解码、图片解码,或者对图片进行指定的裁剪、缩放、格式转换等操作,以满足模型推理的需要。

③  模型推理:将预处理后的图像传输至模型,执行推理,输出结果。

④  图像后处理:对模型推理结果做后处理,比如将根据推理结果在图像上标注类别、检测框等、概率等信息。


在此基础上,比较GPU平台和Atlas平台的差异,这里以Atlas 200 DK为移植设备,其以Ascend 310处理器为推理核心

在GPU平台,由GPU或CPU完成对输入图像的预处理(比如常见的Crop、Resize处理、色域转换、减均值处理等),执行模型推理,推理结果在CPU或GPU做后处理,最后输出。

相比之下,在Atlas平台,输入图像由Host端发送到Device端,即Ascend 310处理器,在Device端完成处理。

image.png

image.png

PS:通过专用硬件电路设计的DVPP可实现Crop/Resize,AI Core上可实现色域转换、减均值、模型推理,多多利用,可以提高效率哦!


基于上述差异,AI应用从GPU平台移植到Atlas平台,需要注意在模型转换、数据预处理和不同平台下推理部分的处理。在模型转换时,将GPU平台使用的模型转换为适配Ascend处理器的.om模型,在转换

时可以通过参数设置,调用AIPP完成色域转换、减均值等处理。数据预处理部分,GPU平台模型推理的输入图像数据格式一般为BGR Planar INT8 RAW,Atlas平台的NN网络推理可以输入NV12 INT8 RA

W(可通过AIPP完成转换)或BGR Planar。在GPU平台上有GPU处理的部分,需要根据实际需要分别移植到DVPP、AI Core(包括AIPP)和Control CPU上处理。其中GPU平台模型加载、推理等处理的部

分,需要改为使用Atlas平台的模型管家AI Model Manager,调用Init接口(用于模型加载)和Process接口(用于模型推理)。

大体流程如图所示:

image.png


其实,真正的有所理解和感悟,还是需要多多实践,通过实践,发现问题,解决问题,才能有所收获,有更深入和牢固的记忆与理解,还在等什么,赶快去实践吧,大量案例供你实践!


1.2 模型转换

模型转换可是重头戏,关系到整个项目的成败。

通过专门的离线模型生成器(Offline Model Generator, OMG)可将其他平台下的模型转换成可以在Atlas平台上运行的.om离线模型。

目前,支持Caffe框架和TensorFlow框架下Frozen Graph Def格式的.pb模型转换,提供命令行和Mind Studio两种方式。

Mind Studio是基于昇腾AI处理器的集成开发环境,图形界面展示转换过程,这里需要指定一次输入模型的图像的数量、图像的宽度和高度,同时,支持昇腾AI处理器提供的硬件图像预处理模块AIPP,分为

为静态AIPP和动态AIPP,支持YUV420SP_U8(根据UV交织顺序不同,YUV420SP_U8又分为YUV420SP_UV_NV12和YUV420SP_VU_NV21两种格式,默认输入为YUV420SP_UV_NV12)、XRGB8888_

U8、RGB888_U8、YUV400_U8等格式,能够在AI Core上完成改变图像尺寸、色域转换、图像归一化(减均值/乘系数)和剪裁(需指定剪裁起始点,剪裁出神经网络需要大小的图片)等操作,能够可视

化转换完成的.om模型,对于不支持的算子,可自行定义算子(目前支持Caffe框架下自定义算子)。

此外,在模型转换过程中可对高精度数据进行低Bit量化,从而达到节约网络存储空间、降低传输时延以及提高运算执行效率的目的。当前支持Convolution、Full Connection、Convolution Depth wise三

种类型算子的量化,包括权重、偏置、数据量化。量化模式分为:无offset、数据offset。

模型转换大体流程图如下:


image.png


1.3 建立计算引擎流程图

Atlas平台对在昇腾AI处理器执行的应用做了层次上的划分,将一个具体的应用作为一个图(Graph),应用中的具体环节视为一个计算引擎(Engine)。

一个Graph中可以创建多个Engine,不同Graph之间的Engine相互独立。在创建Graph或Engine时需要指定Graph或Engine的ID号,ID号可由开发者自行指定,也可由系统默认分配。

一般,一个Graph及其中的Engine共同组成一个计算引擎流程图。

在执行应用前,要先创建Graph,根据实际需要,创建Engine用于执行每一步操作,执行完毕后,要销毁Graph。

以目标检测应用为例,执行一般流程包括数据输入、预处理、模型推理、后处理。

首先,创建一个Graph。然后根据数据输入、预处理、模型推理、后处理等不同操作创建引擎,并完成初始化,至此,对目标检测建立了计算引擎流程图,可以输入数据,执行推理。

在实际运行时,由流程编排器Matrix统一调用。Matrix提供统一的标准化中间接口,负责完成整个计算引擎流程图的建立、销毁和计算资源的回收,不受操作系统影响。

对于多模型协同推理的情况,在部署时,可以创建一个Graph,也可以创建多个Graph。


1.4 预处理

相比于在GPU平台上使用OpenCV等第三方库来完成图像预处理,在移植中用户可将图像预处理对应的改用DVPP Executor和AIPP来实现

DVPP Executor提供了丰富的媒体预处理能力接口,将输入图形转换为模型要求的格式。

目前支持H.264/H.265视频、JPEG和PNG格式图片的编解码,提供对图片和视频的格式转换、缩放、裁剪功能。


下面关于DVPP和AIPP的区别和联系,用我以前的回复来做下简单的自己的看法的总结:


DVPP和AIPP各有什么功能,有什么区别和联系?

1. AIPP(AI Preprocessing)用于在AI Core(Ascend 310处理器有两个AI Core)上完成图像预处理,包括改变图像尺寸、色域转换(转换图像格式)、减均值/乘系数(改变图像像素),在实际项目开发的时候,建议使用AIPP来完成预处理,提高程序运行效率。

AIPP区分为静态AIPP动态AIPP。在开发中只能选择静态AIPP或动态AIPP方式来处理图片,不能同时配置静态AIPP和动态AIPP两种方式。

(1)静态AIPP:模型转换时设置AIPP模式为静态,同时设置AIPP参数,模型生成后,AIPP参数值被保存在Davinci模型,每次模型推理阶段都使用相同的AIPP参数。

如果使用静态AIPP方式,多batch情况下共用同一份AIPP参数。

(2)动态AIPP:模型转换时设置AIPP模式为动态,每次模型推理前需要在推理Engine的代码中设置动态AIPP参数值,然后在模型推理时可使用不同的AIPP参数来完成推理。

如果使用动态AIPP方式,多batch使用不同的参数,体现在动态参数结构体中,每个batch可以配置不同的crop、resize等参数。


AIPP支持的图像输入格式包括:YUV420SP_U8、XRGB8888_U8、RGB888_U8、YUV400_U8

对于YUV420SP_U8,根据UV交织顺序不同,YUV420SP_U8又分为YUV420SP_UV(NV12)和YUV420SP_VU(NV21),默认为YUV420SP_UV(NV12):

配置文件模板中rbuv_swap_switch(R通道与B通道交换开关/U通道与V通道交换开关)设置为false,则AIPP输出为YUV420SP_UV(NV12)

配置文件模板中rbuv_swap_switch设置为true,则AIPP输出为YUV420SP_UV(NV12)。

对于RGB888_U8,根据rbuv_swap_switch参数的取值不同,AIPP输出不同:

配置文件模板中rbuv_swap_switch设置为false,则AIPP输出为RGB888_U8。

配置文件模板中rbuv_swap_switch设置为true,则AIPP输出为BGR888_U8。


这里需要注意的是:

(1)AIPP的输入格式为“YUV420SP_U8”(默认为“YUV420SP_UV”格式),若格式为“YUV420SP_VU”,请修改参数“rbuv_swap_switch”为false,否则会影响输出结果。

开启AIPP时,模型输入为“RGB888_U8”“BGR888_U8”,对应不同的色域转换矩阵。

(2)模型转换是否开启AIPP功能,执行推理业务时,对输入图片数据的要求:

模型转换时开启AIPP:图像选择XRGB8888_U8或RGB888_U8,使用该种配置转换后的模型,在进行推理业务时,输入图片数据要求为NHWC排布。

模型转换时没有开启AIPP,模型转换完毕,在进行推理业务时,输入图片数据要求为NCHW排布,因此需要用户自行把NHWC排布的原始图片数据转换为NCHW排布。


2. DVPP(Digital Vision Pre-Processing)也是负责图像预处理工作,不过相比于AIPP,更靠近数据源,使用独立的专用硬件电路来完成,可实现H.264/H.265视频的硬件编解码,以及

主流图片格式的硬件级转换,不过需要注意的是DVPP输出限定为YUV格式,同时自动进行输出图像宽高尺寸的128:16对齐。其大体在Atlas 200 DK中的结构如图所示:

image.png

3. 区别和联系DVPP和AIPP本质上都是图像预处理,只不过二者分工不同,DVPP使用专用硬件电路,更接近数据源,而AIPP是在AI Core上完成,更靠近模型推理,是对DVPP处理后的图像的进一步处理,以满足模型推理输入的要求。根据实际需要,可以选择只使用其中一个,也可以两个都用,甚至不使用都可以。


1.5 模型推理

移植时,需要将GPU平台上模型初始化(加载模型到内存)、创建输入输出Tensor、模型推理部分的实现逻辑修改为昇腾AI处理器上的实现。这里需要用户指定.om模型所在位置,并将输

入Tensor送入模

型,系统可按照默认设置,自行分配调度引擎,返回输出Tensor,即模型推理结果,类型为列表。用户也可以自行配置,完成指定引擎ID、申请内存等操作。

这部分封装地比较好,也比较简单,但也最为容易出错,需要对Ascend 310推理流程比较熟悉哦!


1.6 后处理(可视化部分)

这里的后处理,不算完全意义上的后处理,主要是涉及结果的可视化,不含推理结果解析部分。

与GPU平台类似,根据推理结果在图像上标注类别、检测框、概率等信息,支持使用第三方库,一般根据算法需要,自行设计。

以常见的目标检测——行人检测为例。

比如需要根据推理结果得到的行人的坐标框绘制方框,可以使用OpenCV库的rectangle函数实现:

具体代码为

1
cv2.rectangle(image,(min_x,  min_y), (max_x,max_y), (R,G,B), thickness = 5 )

其中,

image表示待画框的图片,

(min_x, min_y)表示方框的左上角坐标,

(max_x, max_y)为方框右下角坐标,这里的坐标默认以图像左上角为坐标原点。

(R, G, B)表示方框的颜色,比如(0,255,0)表示绿色。thickness是线条的粗细。

同时,如果希望做标记,也可以使用OpenCV的putText函数,代码为

1
cv2.putText(image, text, (x, y), Font, size, (B,G,R), thickness)

其中,

image是图像,

text是想要写的文本,类型是string,

(x, y)是text放置的位置,以图像左上角为坐标原点。

Font是字体,

size是字体大小,

(R,G,B)是字体颜色,

thickness是字体的粗细。

具体如何进行后处理,来做可视化,要根据具体的算法和最终要求而定,但基本操作和在PC端是一致的。


以上是我对Atlas 200 DK在使用中的一点感受,希望能对大家有所帮助,还有很多不足,如有错误,请大家批评指正哈,直接私信我就行哦!


最后聊聊昇腾处理器吧!

昇腾处理器是由海思公司设计研发的。

华为旗下海思半导体有限公司就是我国半导体行业的杰出代表,其中有PC处理器芯片“鲲鹏”、手机处理器芯片“麒麟”等等。

这里所用硬件Atlas 200 Developer Kit中的AI处理器Ascend 310也是还是海思半导体公司设计研发的。相信随着相应产品及产品线进一步拓展,能让更多AI开发者使用。

相比于通用处理器,AI处理器正处于发展阶段,未形成统一标准,与国外差距较小。而国产芯片的发展有助于摆脱国外的技术限制,走独立自主的发展之路,对国家

安全和发展有重要意义。













 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。