摘要: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. gitlab hostname修改

    cd /var/opt/gitlab/gitlab-rails/etc vim gitlab.yml /home/git/gitlab/config/gitlab.yml production: &a ...

  2. 15 shell for循环

    除了 while 循环和 until 循环,Shell 脚本中还有for 循环,for 循环有两种使用形式:C语言风格的for循环与Python语言风格的for in循环,两种形式的for循环用法对比 ...

  3. Python字符串格式方式 %s format()

    p.p1 { margin: 0; font: 12px ".PingFang SC" } p.p2 { margin: 0; font: 12px "Helvetica ...

  4. linux 生成密钥

    p.p1 { margin: 0; font: 16px "Helvetica Neue" } span.s1 { font: 16px ".PingFang SC&qu ...

  5. XCTF Guess-the-Number

    一.发现是jar文件,一定想到反汇编gdui这个工具,而且运行不起来,可能是我电脑问题,我就直接反编译出来了. 也发现了flag,和对应的算法,直接拉出来,在本地运行,后得到flag 二.java代码

  6. ms17-010 永恒之蓝漏洞复现(CVE-2017-0143)

    0x01 首先对目标机的开放端口进行探测,我们可以使用探测神器nmap 发现开放的445端口,然后进行下一步的ms17-010的漏洞验证 0x02 打开MSF美少妇神器,用search命令搜索ms17 ...

  7. TestNG基础001

    一.什么是TestNG TestNG是一个强大的测试框架,NG是指Next Generation ,被视为是Junit的升级版本 二.TestNG适用范围 Java单元测试 接口测试 web自动化测试 ...

  8. Linux常用基础命令(二)

    Linux常用基础命令 一.-ls--列表显示目录内容 二.-alias--设置别名 三.-du--统计目录及文件空间占用情况 四.-mkdir--创建新目录 五.-touch--创建空文件 六.-l ...

  9. C语言:自增 自减

    一个整数类型的变量自身加 1 可以这样写: a = a + 1; 或者 a += 1; 不过,C语言还支持另外一种更加简洁的写法,就是: a++; 或者 ++a; 这种写法叫做自加或自增,意思很明确, ...

  10. R绘图(7): 把散点图的点换成扇形

    前几天分析了一批单细胞TCR的数据,需要画这样一个图: 行是不同的样本,列是不同的T细胞类型,每一个位置点的大小表示T细胞的数目多少,并且还需要根据T细胞所属的克隆型类型涂色.这个图用来描述TCR是我 ...