【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例

1.开发环境配置

  1.1下载Mindstudio

MindStudio下载-昇腾社区 (hiascend.com)https://www.hiascend.com/software/mindstudio/download

  1.2购买弹性云,加载镜像

申请镜像:进入网页共建智能世界云底座-华为云华为云提供稳定可靠、安全可信、可持续发展的云服务,致力于让云无处不在,让智能无所不及,共建智能世界云底座。助力企业降本增效,全球300万客户的共同选择。7x24小时专业服务支持,5天内无理由退订,免费快速备案。https://www.huaweicloud.com/

右上方点击:用户名 > 我的凭证,选择 API凭证

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第1张图片

复制 华北-北京四 的项目ID提交给昇腾官方人员,将会用于分享包含环境的ECS镜像,便于挂载之后直接使用,无需安装CANN、MindX SDK等。

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第2张图片

接收镜像

控制台左上角菜单 服务列表 > 计算 > 镜像服务 IMS

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第3张图片

 选择 共享镜像 标签 > 全部接受 接受镜像【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第4张图片建立ECS服务器并加载镜像

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第5张图片

购买弹性云服务器

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第6张图片

基础配置如下

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第7张图片

选择共享镜像

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第8张图片

网络配置

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第9张图片  【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第10张图片

云服务器名称:ecs-Zixin;用户名:root;密码自己设置

确认购买,记录IP和密码,即可通过MindStudio的SSH Manager连接使用。

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第11张图片

  1.3 MobaXterm登录SSH

打开Session

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第12张图片

选择SSH

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第13张图片

创建用户信息

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第14张图片

输入弹性云设置的账号名与密码

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第15张图片

输入弹性云的IP地址

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第16张图片

配置完成

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第17张图片

  1.4 配置CANN

新建project【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第18张图片

 创建CANN version

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第19张图片

新增CANNsetiing

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第20张图片【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第21张图片

填写SSH信息

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第22张图片

连接成功

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第23张图片

镜像中CANN包地址: /usr/local/Ascend/ascend-toolkit/6.0.RC1

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第24张图片

等待同步,完成后表明我们已经连接上了远程的服务器端,并且能使用服务器的cann进行开发。

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第25张图片

配置完成。

2.实操过程

2.1准备工作

在gitee上下载代码samples: CANN Samples - Gitee.comhttps://gitee.com/ascend/samples/tree/master/python/contrib/cartoonGAN_picture

在Mindstudio中打开项目

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第26张图片

在远端下载原始模型,输入命令:创建一个名为test1的文件夹并进入

mkdir test1
cd test1

下载原始模型文件

​
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/cartoonization/cartoonization.pb --no-check-certificate

​

下载对应的cfg文件文件

​
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/cartoonization/insert_op.cfg --no-check-certificate

下载成功

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第27张图片

也可以在本地下载原始模型:获得model文件夹的路径

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第28张图片

将原始模型和转换文件复制到该路径下

原始模型链接:

https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/cartoonization/cartoonization.pb

转换文件链接:

https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/cartoonization/insert_op.cfg

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第29张图片

可以看到项目中的文件更新

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第30张图片

将网址的图片保存到data目录下

https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/cartoonGAN_picture/scenery.jpg

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第31张图片

或者直接通过终端控制获取样例需要的测试图片:进入data文件夹并下载图片

cd data
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/cartoonGAN_picture/scenery.jpg

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第32张图片

2.2模型转换

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

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第33张图片

选择刚刚在远端下载好的原始pb模型,将输出目录改到model文件夹下

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第34张图片

模型转换成功

2.3配置SDK

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第35张图片

镜像中CANN包地址: /usr/local/Ascend/ascend-toolkit/6.0.RC1

镜像中MindX SDK地址:/usr/local/Ascend/mxManufacture-3.0.RC3

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第36张图片

可以看到SDK 成功启用

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第37张图片

同步ECS上的SDK:File -- Project Structure -- Platform Settings -- SDK

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第38张图片  【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第39张图片

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第40张图片

2.4配置运行

远端运行:选择Ascend training

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第41张图片

本地运行:选择python与对应的SDK

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第42张图片

进入远端src文件夹

cd /home/root/MindStudio-WorkSpace/cartoonGAN_picture_39f02200/src/

执行命令:运行

python3.9 cartoonization.py ../data/

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第43张图片

生成图片

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第44张图片

3.卡通同学生成案例CartoonGang_picture介绍

  3.1实验内容与目标

       3.1.1实验内容

本实验主要介绍了基于昇腾CANN平台的卡通图像生成应用的开发方法。该应用选用的是CartoonGAN模型,以彩色图像做输入,将原始图像变为一张卡通图像。通过该实验,您可以了解如何在昇腾平台上实现一个基于CartoonGAN模型的推理应用。

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第45张图片

       3.1.2实验目标

1.掌握一个基于昇腾CANN平台的推理应用的基本结构。

2.理解CartoonGAN模型的网络结构及其数据预处理/后处理方式

  3.2网络结果

CartoonGAN模型原理如下图所示,以Generative Adversarial Networks(GAN)为基础,其架构包括一个生成器(Generator)和一个判别器(Discriminator),对于生成器,它希望生成样本尽可能符合真实样本的分布,而判别器则希望尽可能的区分真实样本与生成样本,通过迭代训练两个网络(即生成器和判别器),生成图像卡通化的结果,该模型将生成器替换为自编码结构,使得生成器具有更强的生成能力。

编码器输入为真实图片 ,其架构由7×7的卷积核,步长为1的卷积层开始,随后紧跟两个降采样块(步长为2),对特征进行提取,对风格图片生成有用的信息将在这个过程中被提取,然后紧接4个残差块(Residual Block),用来重建内容特征。解码器架构由5个残差块开始,通过两个上采样块(步长为2)来实现对不同风格特征的重建,最后在添加一层使用7×7卷积核、步长为1的卷积层,得到最终输出生成的卡通图片结果。

为了辅助生成器生成更好的结果,判别器需要判断输出图像是否是真实的卡通图片。因为判断是否真实依赖于图片本身特征,不需要抽取最高层的图片特征信息,所以设计成较为浅层的框架,首先对输入进行卷积核为3x3的卷积,然后紧接两个步长为2的卷积块来降低分辨率,并且提取重要的特征信息,最后使用一个3×3的卷积层得到最终提取的特征,再与真实标签进行损失计算。

模型的输入数据形状为(256,256,3),输入数据色域格式为RGB,输出数据形状为(256,256,3)

【MindStudio训练营第一期】大作业:cartoonGAN_picture卡通生成案例_第46张图片

  3.3理解图像预处理和后处理方法

        3.3.1原始模型的预处理和后处理方法 

在Github能够找到其测试脚本

GitHub - taki0112/CartoonGAN-Tensorflow at 890decc647fbfd90a5314290b2771c496562ada8Simple Tensorflow implementation of CartoonGAN (CVPR 2018) - GitHub - taki0112/CartoonGAN-Tensorflow at 890decc647fbfd90a5314290b2771c496562ada8https://github.com/taki0112/CartoonGAN-Tensorflow/tree/890decc647fbfd90a5314290b2771c496562ada8
通过对该测试脚本的研读,能够理解其图像预处理和后处理的方法

通过对该测试脚本的研读,能够理解其图像预处理和后处理方法。

     3.3.2昇腾CANN平台上模型预处理和后处理方法

1)预处理

基于对原始模型的理解,以及对DVPP和AIPP的了解,在图像预处理时DVPP和AIPP如下分工:

DVPP:

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

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

AIPP:

1.色域转换:YUV->RGB

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

2)后处理

根据原始模型图像后处理流程,将图像像素转换到[0,255],然后进行保存。

4.开发步骤和关键代码分析

  4.1运行管理资源申请

运行管理资源申请的功能封装在了函数中。

  4.2加载模型文件,构建模型输出内存

1)加载本地om模型文件到内存中,并创建并获取模型的描述信息,此函数功能封装在class Model的init_resource函数中。对应文件是acl_model.py

1.def _init_resource(self):    

2.        print("Init model resource")    

3.        #load model file    

4.        self.model_id, ret = acl.mdl.load_from_file(self.model_path)    

5.        check_ret("acl.mdl.load_from_file", ret)    

6.        self.model_desc = acl.mdl.create_desc()    

7.        ret = acl.mdl.get_desc(self.model_desc, self.model_id)    

8.        check_ret("acl.mdl.get_desc", ret)    

9.    

10.       #get model output    

11.       output_size = acl.mdl.get_num_outputs(self.model_desc)    

12.    

13.       #create model output dataset    

14.       self._gen_output_dataset(output_size)    

15.       print("[Model] class Model init resource stage success")    

16.    

17.       #get model output description    

18.       self._get_output_desc(output_size)    

19.    

20.       #create input buffer     

21.       self._init_input_buffer()    

22.       return SUCCESS

2)根据模型的描述信息,获取模型的每路输出数据在设备上所需的空间大小

此函数功能封装在class Model的函数_gen_output_dataset中。

ACL库内置数据类型说明:aclmdlDataset主要用于描述模型推理时的输入数据或输出数据,模型可能存在多个输入、多个输出,每个输入或输出的内存地址、内存大小用aclDataBuffer类型的数据来描述。对应文件是acl_model.py

1.def _gen_output_dataset(self, size):    

2.     print("[Model] create model output dataset:")    

3.     dataset = acl.mdl.create_dataset()    

4.     for i in range(size):    

5.         # create output memory     

6.         size = acl.mdl.get_output_size_by_index(self.model_desc, i)

7.

8.         buffer, ret = acl.rt.malloc(size, ACL_MEM_MALLOC_NORMAL_ONLY)

9.         check_ret("acl.rt.malloc", ret)

10.

11.        dataset_buffer = acl.create_data_buffer(buffer, size)

12.

14.        _, ret = acl.mdl.add_dataset_buffer(dataset, dataset_buffer)  

16.        if ret:    

17.             #free resource     

18.             acl.rt.free(temp_buffer)    

19.             acl.destroy_data_buffer(dataset)    

20.             check_ret("acl.destroy_data_buffer", ret)    

21.    self.output_dataset = dataset    

22.    print("[Model] create model output dataset success") 

  4.3读取本地图像数据并进行预处理

读取本地图像数据后,使用DVPP的jpegd功能对图像数据进行解码;将解码后的图片传入dvpp的接口crop_and_paste中,将原图抠图粘贴到和模型所需要的大小一致的图上,对应的文件是acl_devpp.py 和cartoonization.py。

acl_devpp.py

1.def crop_and_paste(self, image, width, height, crop_and_paste_width, crop_and_paste_height):      

2.    '''     

3.    :image: input image    

4.    

5.    :width: input image width        

6.    :height: input image height     

7.    

8.    :crop_and_paste_width: crop_and_paste_width    

9.    

10.   :crop_and_paste_height: crop_and_paste_height    

11.    

12.   :return: return AclImage       

13.   '''       

14.   print('[Dvpp] vpc crop and paste stage:')       

15.   input_desc = self._gen_input_pic_desc(image)        

16.   output_desc, out_buffer, out_buffer_size = \       

17.        self._gen_resize_out_pic_desc(crop_and_paste_width, crop_and_paste_heigh     

18.   self._crop_config = acl.media.dvpp_create_roi_config(0, (width >> 1 << 1) - 1, 0, (height >> 1 << 1) - 1)      

19.   self._paste_config = acl.media.dvpp_create_roi_config(0, crop_and_paste_width - 1, 0, crop_and_paste_height - 1)      

20.   ret = acl.media.dvpp_vpc_crop_and_paste_async(self._dvpp_channel_desc,       

21.                                                  input_desc,    

22.    

23.                                                  output_desc,    

24.    

25.                                                  self._crop_config,    

26.    

27.                                                  self._paste_config,        

28.                                                  self._stream)        

29.   check_ret("acl.media.dvpp_vpc_crop_and_paste_async", ret)    

30.   ret = acl.rt.synchronize_stream(self._stream)    

31.   check_ret("acl.rt.synchronize_stream", ret)    

32.   print('[Dvpp] vpc crop and paste stage success')       

33.   stride_width = align_up16(crop_and_paste_width)     

34.   stride_height = align_up2(crop_and_paste_height)      

35.   return AclImage(out_buffer, stride_width,      

36.                    stride_height, out_buffer_size, MEMORY_DVPP)    

cartoonization.py

1.  def pre_process(self, image):  

2.        yuv_image = self._dvpp.jpegd(image)   

3.        crop_and_paste_image = \  

4.            self._dvpp.crop_and_paste(yuv_image, image.width, image.height, self._model_width, self._model_height)  

5.        print("[Sample] crop_and_paste yuv end")  

6.        return crop_and_paste_image 

  4.4构建模型输入数据,进行模型推理

构建模型的输入数据,构建模型输入数据的功能函数封装在class Model的函数_gen_input_dataset中。对应文件是acl_model.py

1.  def _gen_input_dataset(self, data, data_size):   

2.        self.input_dataset = acl.mdl.create_dataset()   

3.        input_dataset_buffer = acl.create_data_buffer(data, data_size)   

4.        _, ret = acl.mdl.add_dataset_buffer(   

5.            self.input_dataset,   

6.            input_dataset_buffer)   

7.        if ret:  

8.            ret = acl.destroy_data_buffer(self.input_dataset)    

9.            check_ret("acl.destroy_data_buffer", ret)  

  4.5模型推理

根据已经加载到内存中,要进行推理的模型ID、构建好的模型推理输入数据,调用ACL库中模型推理接口进行模型推理。

模型推理功能函数封装在了Model.execute中。对应文件是acl_model.py

  4.6解析模型推理结果

模型推理结果解析的功能函数封装在post_process中,对推理出的数据先进行色彩空间的转化RGB转成BGR,再将其resize成原图的大小,保存在outputs文件路径下。对应文件是cartoonization.py

  4.7资源释放

推理接收后要卸载模型,并释放与模型推理相关的资源,此功能函数封装在class Model 的__del__(self)函数中。对应文件是acl_model.py

运行管理资源释放以及ACL去初始化的功能函数封装在class AclResource中的__del__函数,对应文件是acl_resource.py

你可能感兴趣的:(Mindstudio,服务器,运维)