MindStudio下载-昇腾社区 (hiascend.com)https://www.hiascend.com/software/mindstudio/download
申请镜像:进入网页共建智能世界云底座-华为云华为云提供稳定可靠、安全可信、可持续发展的云服务,致力于让云无处不在,让智能无所不及,共建智能世界云底座。助力企业降本增效,全球300万客户的共同选择。7x24小时专业服务支持,5天内无理由退订,免费快速备案。https://www.huaweicloud.com/
右上方点击:用户名 > 我的凭证,选择 API凭证
复制 华北-北京四 的项目ID提交给昇腾官方人员,将会用于分享包含环境的ECS镜像,便于挂载之后直接使用,无需安装CANN、MindX SDK等。
接收镜像
控制台左上角菜单 服务列表 > 计算 > 镜像服务 IMS
选择 共享镜像 标签 > 全部接受 接受镜像建立ECS服务器并加载镜像
购买弹性云服务器
基础配置如下
选择共享镜像
网络配置
云服务器名称:ecs-Zixin;用户名:root;密码自己设置
确认购买,记录IP和密码,即可通过MindStudio的SSH Manager连接使用。
打开Session
选择SSH
创建用户信息
输入弹性云设置的账号名与密码
输入弹性云的IP地址
配置完成
创建CANN version
新增CANNsetiing
填写SSH信息
连接成功
镜像中CANN包地址: /usr/local/Ascend/ascend-toolkit/6.0.RC1
等待同步,完成后表明我们已经连接上了远程的服务器端,并且能使用服务器的cann进行开发。
配置完成。
在gitee上下载代码samples: CANN Samples - Gitee.comhttps://gitee.com/ascend/samples/tree/master/python/contrib/cartoonGAN_picture
在Mindstudio中打开项目
在远端下载原始模型,输入命令:创建一个名为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
下载成功
也可以在本地下载原始模型:获得model文件夹的路径
将原始模型和转换文件复制到该路径下
原始模型链接:
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
可以看到项目中的文件更新
将网址的图片保存到data目录下
https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/cartoonGAN_picture/scenery.jpg
或者直接通过终端控制获取样例需要的测试图片:进入data文件夹并下载图片
cd data
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/cartoonGAN_picture/scenery.jpg
原始网络模型是TensorFLow框架模型,而昇腾CANN软件栈需要的模型是.om离线模型,因此,需要通过ATC模型转换工具将.pb文件转换为Ascend 310处理器支持的Davinci模型文件。
选择刚刚在远端下载好的原始pb模型,将输出目录改到model文件夹下
模型转换成功
镜像中CANN包地址: /usr/local/Ascend/ascend-toolkit/6.0.RC1
镜像中MindX SDK地址:/usr/local/Ascend/mxManufacture-3.0.RC3
可以看到SDK 成功启用
同步ECS上的SDK:File -- Project Structure -- Platform Settings -- SDK
远端运行:选择Ascend training
本地运行:选择python与对应的SDK
进入远端src文件夹
cd /home/root/MindStudio-WorkSpace/cartoonGAN_picture_39f02200/src/
执行命令:运行
python3.9 cartoonization.py ../data/
生成图片
本实验主要介绍了基于昇腾CANN平台的卡通图像生成应用的开发方法。该应用选用的是CartoonGAN模型,以彩色图像做输入,将原始图像变为一张卡通图像。通过该实验,您可以了解如何在昇腾平台上实现一个基于CartoonGAN模型的推理应用。
1.掌握一个基于昇腾CANN平台的推理应用的基本结构。
2.理解CartoonGAN模型的网络结构及其数据预处理/后处理方式
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)
在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
通过对该测试脚本的研读,能够理解其图像预处理和后处理的方法
通过对该测试脚本的研读,能够理解其图像预处理和后处理方法。
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],然后进行保存。
运行管理资源申请的功能封装在了函数中。
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") |
读取本地图像数据后,使用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 |
构建模型的输入数据,构建模型输入数据的功能函数封装在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) |
根据已经加载到内存中,要进行推理的模型ID、构建好的模型推理输入数据,调用ACL库中模型推理接口进行模型推理。
模型推理功能函数封装在了Model.execute中。对应文件是acl_model.py
模型推理结果解析的功能函数封装在post_process中,对推理出的数据先进行色彩空间的转化RGB转成BGR,再将其resize成原图的大小,保存在outputs文件路径下。对应文件是cartoonization.py
推理接收后要卸载模型,并释放与模型推理相关的资源,此功能函数封装在class Model 的__del__(self)函数中。对应文件是acl_model.py
运行管理资源释放以及ACL去初始化的功能函数封装在class AclResource中的__del__函数,对应文件是acl_resource.py