摘要:CANN作为昇腾AI处理器的发动机,支持业界多种主流的AI框架,包括MindSpore、TensorFlow、Pytorch、Caffe等,并提供1200多个基础算子。

2021年7月8日,第四届世界人工智能大会在上海召开。华为轮值董事长胡厚崑在开幕式发表演讲,其中提到:华为推出了异构计算架构CANN(Compute Architecture for Neural Networks),CANN作为昇腾AI处理器的发动机,支持业界多种主流的AI框架,包括MindSpore、TensorFlow、Pytorch、Caffe等,并提供1200多个基础算子。同时,CANN具有开放易用的ACL(Ascend Computing Language)编程接口,并提供了网络模型的图级和算子级的编译优化、自动调优等功能。CANN对上支持多种AI框架,对下服务AI处理器与编程,是提升昇腾AI处理器计算效率的关键平台。

如何理解CANN,如何使用CANN,特别是如何基于CANN开放易用的ACL编程接口实现神经网络的快速部署呢?

相信我们大部分开发者对于训练一个模型并不陌生,但对于将该模型部署到边缘侧,做成一个应用落地,去产生价值(或者叫帮你赚钱?),可能就不是特别清楚了。但,一旦谈到可以帮你去帮你赚钱,我相信你一定会感兴趣的,对吗?

什么?赚钱!说到这个事儿,我就知道你不困了哈!

我们发现在昇腾社区上已经提供了不少可在线体验的案例,这些案例不但可以在线体验效果,还可以进行在线实验,同时开放了源代码,可以通过开源社区提供的资源进行学习并给基于这些案例进行二次开发,真真正正的体验、学习、开发三步走啊!

那么我们选择一些有意思的案例带大家学习下基于CANN的昇腾AI应用开发过程,今天要给大家介绍的就是这个能够吸引到你的卡通图像生成应用,无论是漂亮的小姐姐还是可爱的小萌宠都能帮你秒级生成,如下图,选择预置图片或者是上传自己的私照,点击“立即生成”即可体验。

首先介绍下如何找到该应用:

进昇腾社区https://www.hiascend.com/

开发者->应用案例,Ok,你已经可以看到那个狗狗了,案例标题是“卡通图像生成”,点击进去你就看到了。

体验就不说了,左边选择需要处理的图片,也可以上传自己的图片,然后点击生成就可以了,图片会上传到华为云昇腾AI计算资源上,推理后再回传到前端展示,相隔千里却仍能提供秒级体验,这里要给个大赞!

那么接下来言归正传,带你了解基于CANN的应用开发流程。完整开发流程如下:

0) 工程准备

硬件:服务器及推理卡准备就绪, 安装操作系统,配置网络。

训练后的模型:Caffe、MindSpore、TensorFlow模型;

1)模型转换

离线模型:Ascend310算子列表, ATC转换工具。

2) 算子开发及调试

自定义算子开发:TBE DSL,TBE TIK等算子开发工具。

3) 业务开发及调试

ACL接口:资源初始化,数据传输,数据预处理,模型推理,数据后处理等。

4)性能调优

性能优化:瓶颈分析,内存优化,模型优化等。

看起来还挺复杂的,对吧??但是我们呢,是来解决主要矛盾的(先完成应用开发),其他的优化过程(精度、性能等)留着以后慢慢消化,来日方长,不是么?

废话不多说了,假定模型我们已经有了,也符合我们的需求,模型呢也是昇腾AI处理器已经支持的模型(无需做算子开发),我们现在要做的就是理解模型,分析其前处理过程(给模型准备数据),后处理过程(结果展示),进行模型转换得到离线模型,然后就是代码开发了(其实就是调用CANN ACL的各种API完成模型加载、推理的过程而已), 这里选用python,CANN的pyACL用起来。

总结一下,在本例中我们只需要搞定如下过程:

  1. 理解模型 2. 模型转换 3. 基于CANN ACL接口进行代码开发

1、理解模型

Yang Chen、Yong-Jin LIU等人提出的算法 CartoonGAN: Generative Adversarial Networks for Photo Cartoonization基于GAN网络,迭代训练生成器和判别器,由判别器提供的对抗性损失约束,最终将自然图片转换为具有卡通风格的图片,效果惊艳。

下图为卡通图像生成的整体框架:

以Generative Adversarial Networks(GAN)为基础,其架构包括一个生成器(Generator)和一个判别器(Discriminator),通过迭代训练两个网络,由判别器提供的对抗性损失约束,最终使得网络能够将自然图片转换为具有卡通风格的图片结果,并且保持原图片的内容信息。

图1 卡通图像生成整体架构

生成器结构

生成器采用自编码器,为全卷积结构,包括编码器如图3,解码器如图4。

图3 编码器结构

图4 解码器结构

编码器输入为真实图片,其架构由7×7的卷积核,步长为1的卷积层开始,随后紧跟两个步长为2的降采样块,进行特征提取,对风格图片生成有用的信息将在这个过程中被提取。然后紧接4个残差块(Residual Block),用来重建内容特征。

解码器架构由5个残差块开始,通过两个上采样块(步长为2)来实现对不同风格特征的重建,最后在添加一层使用7×7卷积核、步长为1的卷积层,得到最终输出生成的卡通图片结果。

由于当前我们的目标是将训练好的模型做成一个AI应用,所以这里只需要了解生成器就够了,从上面的结构中可以看出,该模型的输入是图像,输出也是图像,那么预处理和后处理过程呢?

原始模型预处理和后处理

在Github能够找到其测试脚本:https://github.com/taki0112/CartoonGAN-Tensorflow/tree/890decc647fbfd90a5314290b2771c496562ada8

结合前面的理解,并通过对测试脚本的研读,能够理解其图像预处理和后处理的方法

昇腾CANN软件栈提供了两套专门用于数据预处理的工具,其中一套叫做AIPP(AI Preprocessing) ;另一套叫做DVPP(Digital Vision Preprocessing)。

DVPP是CANN软件栈中的数字视觉预处理模块,昇腾310 AI处理器支持抠图缩放、jpeg编解码、视频编解码、png解码等功能。详细请参考昇腾社区文档:

https://support.huaweicloud.com/devg-cannApplicationDev330/atlasapi_07_0131.html

AIPP用于在AI Core上完成图像预处理,包括色域转换(转换图像格式)、图像归一化(减均值/乘系数)和抠图(指定抠图起始点,抠出神经网络需要大小的图片)等,静态AIPP可以在ATC模型转换时通过设置参数完成,比较方便。详细请参考昇腾社区文档:https://support.huaweicloud.com/tg-cannApplicationDev330/atlasatc_16_0015.html

在这里,我们假设你已经了解了DVPP和AIPP,那么基于对原始模型的理解,在图像预处理时DVPP和AIPP如下分工(分工的原则:DVPP+AIPP的处理要等价于原始模型的预处理过程):

DVPP:

1.解码:JPEG图片先解码为YUV420SP,输出宽128,高16对齐,例如:若输入原始图像大小为(500, 375) 经过解码后图像大小变为(512, 384)

2.图像缩放:使用DVPP的VPC接口将图像缩放为模型要求的大小(256,256),要求宽16,高2对齐,将(512,384)图像中的有效数据(500,375)缩放到(256,256)

注:这里也可以考虑等比例缩放,但由于等比例缩放要涉及到用AIPP裁剪,后期再讲。

AIPP:

1.色域转换:YUV->RGB

2.图像标准化,AIPP配置mean_chn=[127.5,127.5,127.5] min_chn=[0.5,0.5,0.5] var_reci_chn=[0.007874,0.007874,0.007874]

2)后处理

根据原始模型图像后处理流程,将图像像素转换到[0,255],然后进行保存。该过程直接使用scipy库实现。

2、模型转换

原始网络模型是TensorFlow框架模型,而昇腾CANN软件栈需要的模型是.om离线模型,因此,需要通过ATC模型转换工具将.pb文件转换为Ascend 310处理器支持的Davinci模型文件。

ATC模型转换指令:

atc --output_type=FP32 --input_shape="train_real_A:1,256,256,3" --input_format=NHWC --output="./cartoonization" --soc_version=Ascend310 --insert_op_conf=./insert_op.cfg --framework=3 --model="./cartoonization.pb" --precision_mode=allow_fp32_to_fp16

重要参数说明:

--model:原始模型文件路径与文件名。

--output:转换后的离线模型的路径以及文件名。

--precision_mode=allow_fp32_to_fp16:设置网络模型的精度模式,优先保持原图精度,如果网络模型中算子支持float32,则保留原始精度float32;如果网络模型中算子不支持float32,则直接降低精度到float16。

--insert_op_conf:插入算子的配置文件路径与文件名,例如AIPP预处理算子。

AIPP配置文件,根据原始模型需处理进行AIPP文件配置,本模型的配置文件见下图:

更多参数介绍可阅读:https://support.huaweicloud.com/atctool-cann502alpha5infer/atlasatc_16_0037.html

3、应用开发

应用采用了下图所示的模块化设计,通过各模块之间的协调配合完成一张图片的推理输出。

其中各个模块的主要功能点如下所示:

1.运行资源申请;

2.加载模型文件,申请模型输入输出内存;

3.数据获取,获取要进行推理的原始图像;

4.数据预处理,模型的输入图像进行预处理;

5.模型推理,将预处理后的数据输入到模型进行推理;

6.推理结果解析,将推理结果进行后处理。

源码就不在这里show了,昇腾社区提供了更好的学习路径,可以直接通过在线实验学习开发过程,直接点击右上侧的在线实验,即可免费体验。

体验完毕后,大家还可以移步开源仓库去获取源码,如果有任何问题,鼓励大家去提issue与开发人员直接交流。https://gitee.com/ascend/samples/tree/master/python/contrib/cartoonGAN_picture

相关链接

模型论文参考链接如下:

https://openaccess.thecvf.com/content_cvpr_2018/papers/Chen_CartoonGAN_Generative_Adversarial_CVPR_2018_paper.pdf

原始模型部署链接如下:

https://gitee.com/syz825211943/cartoonization

相关源码可以在开源仓库如下地址中获取:

https://gitee.com/ascend/samples/tree/master/python/contrib/cartoonGAN_picture

点击关注,第一时间了解华为云新鲜技术~

十分钟带你了解CANN应用开发全流程的更多相关文章

  1. 【新手】【十分钟上手系列-一】快速开发vue插件

    2018.6.28 在这浮躁的前端娱乐圈,不会三两个新框架都觉得自己不是前端.哦,不是我说的.说到底.原生才是重中之重.加油. vue用了大半年多,一直在用ui库,插件等,没有自己的东西. 想想连个v ...

  2. pip:带你认识一个 Python 开发工作流程中的重要工具

    摘要:许多Python项目使用pip包管理器来管理它们的依赖项.它包含在Python安装程序中,是Python中依赖项管理的重要工具. 本文分享自华为云社区<使用Python的pip管理项目的依 ...

  3. 十分钟带你读懂《增长黑客》zz

    背景 “If you are not growing, then you are dying. ”(如果企业不在增长,那么就是在衰亡!) 这句话适用于企业,也适用于个人.人生毕竟不像企业,是非成败,似 ...

  4. 十分钟带你学会Http协议和Tomcat服务器的原理

    1. Http协议 1. 什么是Http协议 HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准 ...

  5. 【干货!!】十分钟带你搞懂 Java AQS 核心设计与实现!!!

    前言 这篇文章写完放着也蛮久的了,今天终于发布了,对于拖延症患者来说也真是不容易-哈哈哈. 言归正传,其实吧..我觉得对于大部分想了解 AQS 的朋友来说,明白 AQS 是个啥玩意儿以及为啥需要 AQ ...

  6. 十分钟带你理解Kubernetes核心概念

    什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...

  7. 十分钟带你看一遍ES6新特性

    let , const关键字 var 看习惯了java, 看js真的是忍不住想笑,比如说这个var,它太自由了,自由到{}根本限制不住它的生命周期 js的var关键字,无论在何处声明,都会被视为声明在 ...

  8. [转]十分钟带你理解Kubernetes核心概念

    本文将会简单介绍 Kubernetes的核心概念.因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍.相反,我们会使用一些图表(其中一些是动画)和示例来解释这些 ...

  9. VS2017+QT5.12.10+QGIS3.16环境搭建及开发全流程

    题记:大力发展生产力,助力高效采集.(转载请注明出处https://www.cnblogs.com/1024bytes/p/15477374.html) 本篇随笔分为五个部分: 一.获取QGIS3.1 ...

随机推荐

  1. DRF之权限和频率限制

    一.权限 权限可以限制用户对视图的访问和对具体数据对象的访问. 在执行视图的dispatch方法前,会先进行视图访问权限的判断 在通过get_object获取对象时,会进行模型对象访问权限的判断 源码 ...

  2. Vulkan移植GPUImage的安卓Demo展示

    演示Android apk下载 需要Android 8以上. 先看效果图,大约一百多种滤镜,有超过一半的滤镜有参数设置,其参数调整界面使用反射自动生成与绑定. 如下每种选择一些进行展示. 视觉效果 图 ...

  3. 如何查看wsdl文档

    http://www.360doc.com/content/16/1027/00/37651083_601648996.shtml

  4. Acunetix与WAF集成:Acunetix和F5 BigIP ASM

    该的Acunetix API让您有机会来实现任务自动化,从而提高效率-尤其是当你可以用加速您的工作流程的其他组件的功能整合.在此示例中,我们将在上一篇文章的基础上,向您展示如何在Bash脚本中使用Ac ...

  5. 使用Hugo框架搭建博客的过程 - 功能拓展

    前言 本文介绍一些拓展功能,如文章页面功能增加二级菜单,相关文章推荐和赞赏.另外,使用脚本会大大简化写作后的上传流程. 文章页面功能 这部分功能的拓展主要是用前端的JS和CSS,如果对前端不了解,可以 ...

  6. centos安装报错:license information (license not accepted)

    前言:在最近部署的centos系统发现个问题 出现报错:安装配置完成后,重启虚拟机出现license  information  (license not accepted) 截图: 解决方案: 在界 ...

  7. DL基础补全计划(三)---模型选择、欠拟合、过拟合

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  8. 短视频:用快影制作3D音乐视频

    用快影制作3D音乐视频1打开快影点击开始剪辑导入一张风景照片,按住照片向后拉到自己需要的时长2点击画中画,点击新增,画中画,导入一张照片3点击模板,选择圆形,调整圆形的大小,摆放到上面合适的位置,按照 ...

  9. Vue全局弹窗:一次注册,全局可弹

    Vue全局弹窗 今天来搞一个全局弹窗,不用每个文件都引入,只在main.js里作为全局原型引入就好了 先新建弹窗组件 toast.vue <template></template&g ...

  10. Hive——基本DML语句

    Hive--基本DML语句 DML:Data Manipulation Language(数据操作语言,与关系型数据库相似) 官方手册:https://cwiki.apache.org/conflue ...