欢迎关注我的公众号 [极智视界],获取我的更多笔记分享

  大家好,我是极智视界,本文介绍一下 谈谈昇腾 CANN AIPP

  昇腾 CANN 的全称是 Compute Architecture for Neural Networks,是昇腾针对 AI 场景推出的异构计算架构。前几天写了一篇《极智AI | 昇腾 CANN ATC 模型转换》,里面介绍了昇腾 CANN ATC 模型转换工具。而这里的 AIPP 是在 ATC 工具里的一个高级功能,类似于昇腾的 DVPP (数字视觉预处理)。AIPP(Artificial Intelligence Pre-Processing)智能图像预处理,用于在 AI Core 上完成图像预处理,包括改变图像尺寸、色域转换(转换图像格式)、减均值/乘系数(改变图像像素),数据处理之后再进行真正的模型推理。 AIPP 与DVPP相比,由于 DVPP 各组件基于处理速度和处理占有量的考虑,对输出有特殊的限制,如输出图片需要长宽对齐,且其输出格式通常为 YUV420SP 等格式。这样的设定虽在视频分析的场景下有非常广阔的输入,但深度学习模型的输入通常为 RGB 或 BRG,且输入图片尺寸各异,因此 ATC 工具流程中提供了 AIPP 功能模块。

  AIPP 是一个非常实用高性能的模块,非常实用 体现在你可以把很多本身游离于模型之外的前处理做到模型里面,而且这些前处理都是十分常见的,如色域转换、归一化、图像缩放、通道转换等;高性能 体现在 AIPP 是直接调用 AI Core 进行计算的,所以性能十分强悍。总结来说,AIPP 主要具备如下的能力:

  来看 ATC 是怎么使用 AIPP,一般可以通过 --insert_op_conf 来指定 AIPP 配置文件,将 AIPP 算子插入模型。这里以 caffe 框架的 resnet50 模型插入 AIPP 算子为例进行说明:

atc --model=/path/resnet50.prototxt \--weight=/path/resnet50.caffemodel \--framework=0 \--insert_op_conf=/path/insert_op.cfg  \--output=/path/out/caffe_resnet50 \--soc_version=${soc_version}

  对上面的参数进行说明:

  • –model & --weight:原始模型文件;
  • –framework:0 表示输入的模型是 caffe 框架的;
  • –insert_op_conf:输入 AIPP 配置文件 (模版如下);
  • –ouput:生成的 om 模型文件;
  • –soc_version:昇腾卡版本;

  下面是 AIPP 的配置文件模版 (包含了 AIPP 各个功能模块的详细说明):

# AIPP的配置以aipp_op开始,标识这是一个AIPP算子的配置,aipp_op支持配置多个
aipp_op {#========================= 全局设置(start) =================================
# aipp_mode指定了AIPP的模式,必须配置
# 类型:enum
# 取值范围:dynamic/static,dynamic 表示动态AIPP,static 表示静态AIPP
aipp_mode:  # related_input_rank参数为可选,标识对模型的第几个输入做AIPP处理,从0开始,默认为0。例如模型有两个输入,需要对第2个输入做AIPP,则配置related_input_rank为1。
# 类型: 整型
# 配置范围 >= 0
related_input_rank: 0# related_input_name参数为可选,标识对模型的第几个输入做AIPP处理,此处需要填写为模型输入的name(input对应的值)或者模型首层节点的输出(top参数对应的取值)。该参数只适用于Caffe网络模型,且不能与related_input_rank参数同时使用。
# 例如模型有两个输入,且输入name分别为data、im_info,需要对第二个输入做AIPP,则配置related_input_name为im_info。
# 类型:string
# 配置范围:无
related_input_name: ""#========================= 全局设置(end) =====================================#========================= 动态AIPP需设置,静态AIPP无需设置(start) ====================
# 输入图像最大的size,动态AIPP必须配置(如果为动态batch场景,N为最大档位数的取值)
# 类型:int
max_src_image_size: 0
# 若输入图像格式为YUV400_U8,则max_src_image_size>=N * src_image_size_w * src_image_size_h * 1。
# 若输入图像格式为YUV420SP_U8,则max_src_image_size>=N * src_image_size_w * src_image_size_h * 1.5。
# 若输入图像格式为XRGB8888_U8,则max_src_image_size>=N * src_image_size_w * src_image_size_h * 4。
# 若输入图像格式为RGB888_U8,则max_src_image_size>=N * src_image_size_w * src_image_size_h * 3。# 是否支持旋转,保留字段,暂不支持该功能
# 类型:bool
# 取值范围:true/false,true表示支持旋转,false表示不支持旋转
support_rotation: false
#========================= 动态AIPP需设置,静态AIPP无需设置(end)====================#========================= 静态AIPP需设置,动态AIPP无需设置 (start)=================
# 输入图像格式,可选
# 类型: enum
# 取值范围:YUV420SP_U8、XRGB8888_U8、RGB888_U8、YUV400_U8
input_format:
# 说明:模型转换完毕后,在对应的*.om模型文件中,上述参数分别以1、2、3、4枚举值呈现。# 原始图像的宽度、高度
# 类型:int32
# 取值范围 & 约束:宽度取值范围为[2,4096]或0;高度取值范围为[1,4096]或0,对于YUV420SP_U8类型的图像,要求原始图像的宽和高取值是偶数
src_image_size_w: 0
src_image_size_h: 0
# 说明:请根据实际图片的宽、高配置src_image_size_w和src_image_size_h;只有crop,padding功能都没有开启的场景,src_image_size_w和src_image_size_h才能取值为0或不配置,该场景下会取网络模型输入定义的w和h,并且网络模型输入定义的w取值范围为[2,4096],h取值范围为[1,4096]。
# C方向的填充值,保留字段,暂不支持该功能
# 类型: float16
# 取值范围:[-65504, 65504]
cpadding_value: 0.0#========= crop参数设置(配置样例请参见AIPP配置 > Crop/Padding配置说明) =========
# AIPP处理图片时是否支持抠图
# 类型:bool
# 取值范围:true/false,true表示支持,false表示不支持
crop: false# 抠图起始位置水平、垂直方向坐标,抠图大小为网络输入定义的w和h
# 类型:int32
# 取值范围 & 约束: [0,4095]、对于YUV420SP_U8类型的图像,要求取值是偶数
# 说明:load_start_pos_w<src_image_size_w,load_start_pos_h<src_image_size_h
load_start_pos_w: 0
load_start_pos_h: 0# 抠图后的图像size
# 类型:int32
# 取值范围 & 约束: [0,4096]、load_start_pos_w + crop_size_w <= src_image_size_w、load_start_pos_h + crop_size_h <= src_image_size_h
crop_size_w: 0
crop_size_h: 0
# 说明:若开启抠图功能,并且没有配置padding,该场景下crop_size_w和crop_size_h才能取值为0或不配置,此时抠图大小(crop_size[W|H])的宽和高取值来自模型文件--input_shape中的宽和高,并且--input_shape中的宽和高取值范围为[1,4096]。# 抠图约束如下:
# 若input_format取值为YUV420SP_U8,则load_start_pos_w、load_start_pos_h必须为偶数。
# 若input_format取值为其他值,对load_start_pos_w、load_start_pos_h无约束。
# 若开启抠图功能,则src_image_size[W|H] >= crop_size[W|H]+load_start_pos[W|H]。#================================== resize参数设置 ================================
# AIPP处理图片时是否支持缩放,保留字段,暂不支持该功能
# 类型:bool
# 取值范围:true/false,true表示支持,false表示不支持
resize: false# 缩放后图像的宽度和高度,保留字段,暂不支持该功能
# 类型:int32
# 取值范围 & 约束:resize_output_h:[16,4096]或0;resize_output_w:[16,1920]或0;resize_output_w/resize_input_w∈[1/16,16]、resize_output_h/resize_input_h∈[1/16,16]
resize_output_w: 0
resize_output_h: 0
# 说明:若开启了缩放功能,并且没有配置padding,该场景下resize_output_w和resize_output_h才能取值为0或不配置,此时缩放后图像的宽和高取值来自模型文件--input_shape中的宽和高,并且--input_shape中的高取值范围为[16,4096],宽取值范围为[16,1920]。#======== padding参数设置(配置样例请参见AIPP配置 > Crop/Padding配置说明) =========
# AIPP处理图片时padding使能开关
# 类型:bool
# 取值范围:true/false,true表示支持,false表示不支持
padding: false# H和W的填充值,静态AIPP配置
# 类型: int32
# 取值范围:[0,32]
left_padding_size: 0
right_padding_size: 0
top_padding_size: 0
bottom_padding_size: 0
# 说明:AIPP经过padding后,输出的H和W要与模型需要的H和W保持一致,其中W取值要<=1080。# 上下左右方向上padding的像素取值,静态AIPP配置
# 类型:uint8/int8/float16
# 取值范围分别为:[0,255]、[-128, 127]、[-65504, 65504]
padding_value: 0
# 说明:该参数取值需要与最终AIPP输出图片的数据类型保持一致。#================================ rotation参数设置 ==================================
# AIPP处理图片时的旋转角度,保留字段,暂不支持该功能
# 类型:uint8
# 范围:{0, 1, 2, 3} 0不旋转,1顺时针90°,2顺时针180°,3顺时针270°
rotation_angle: 0#========= 色域转换参数设置(配置样例请参见AIPP配置 > 色域转换配置说明) =============
# 色域转换开关,静态AIPP配置
# 类型:bool
# 取值范围:true/false,true表示开启色域转换,false表示关闭
csc_switch: false# R通道与B通道交换开关/U通道与V通道交换开关
# 类型:bool
# 取值范围:true/false,true表示开启通道交换,false表示关闭
rbuv_swap_switch :false# RGBA->ARGB, YUVA->AYUV交换开关
# 类型:bool
# 取值范围:true/false,true表示开启,false表示关闭
ax_swap_switch: false# 单行处理模式(只处理抠图后的第一行)开关,保留字段,暂不支持该功能
# 类型:bool
# 取值范围:true/false,true表示开启单行处理模式,false表示关闭
single_line_mode: false# 若色域转换开关为false,则本功能不起作用。
# 若输入图片通道数为4,则忽略A通道或X通道。
# YUV转BGR:
# | B |   | matrix_r0c0 matrix_r0c1 matrix_r0c2 | | Y - input_bias_0 |
# | G | = | matrix_r1c0 matrix_r1c1 matrix_r1c2 | | U - input_bias_1 | >> 8
# | R |   | matrix_r2c0 matrix_r2c1 matrix_r2c2 | | V - input_bias_2 |
# BGR转YUV:
# | Y |   | matrix_r0c0 matrix_r0c1 matrix_r0c2 | | B |        | output_bias_0 |
# | U | = | matrix_r1c0 matrix_r1c1 matrix_r1c2 | | G | >> 8 + | output_bias_1 |
# | V |   | matrix_r2c0 matrix_r2c1 matrix_r2c2 | | R |        | output_bias_2 |# 3*3 CSC矩阵元素
# 类型:int16
# 取值范围:[-32677 ,32676]
matrix_r0c0: 298
matrix_r0c1: 516
matrix_r0c2: 0
matrix_r1c0: 298
matrix_r1c1: -100
matrix_r1c2: -208
matrix_r2c0: 298
matrix_r2c1: 0
matrix_r2c2: 409# RGB转YUV时的输出偏移
# 类型:uint8
# 取值范围:[0, 255]
output_bias_0: 16
output_bias_1: 128
output_bias_2: 128# YUV转RGB时的输入偏移
# 类型:uint8
# 取值范围:[0, 255]
input_bias_0: 16
input_bias_1: 128
input_bias_2: 128#============================== 减均值、乘系数设置 =================================
# 计算规则如下:
# 当uint8->uint8时,本功能不起作用
# 当uint8->fp16时,pixel_out_chx(i) = [pixel_in_chx(i) – mean_chn_i – min_chn_i] * var_reci_chn# 每个通道的均值
# 类型:uint8
# 取值范围:[0, 255]
mean_chn_0: 0
mean_chn_1: 0
mean_chn_2: 0
mean_chn_3: 0# 每个通道的最小值
# 类型:float16
# 取值范围:[0, 255]
min_chn_0: 0.0
min_chn_1: 0.0
min_chn_2: 0.0
min_chn_3: 0.0# 每个通道方差的倒数
# 类型:float16
# 取值范围:[-65504, 65504]
var_reci_chn_0: 1.0
var_reci_chn_1: 1.0
var_reci_chn_2: 1.0
var_reci_chn_3: 1.0
}#========================= 静态AIPP需设置,动态AIPP无需设置 (end)=======================

  需要注意的是,AIPP 归一化功能中,一般我们使用的归一化参数来自于 ImageNet 的统计,以 RGB 来说,即:mean[0.485, 0.456, 0.406],var[0.229, 0.224, 0.225]。归一化的计算方式一般为:((pixel(x)/255.0) - mean)/var。所以这里的 AIPP 该如何配置呢?AIPP 里需要把 mean 转换到 [0~255],也即 mean*255 相应的 var 转换到 1/(var*255) ,那么 AIPP 就可以这么配置:

aipp_op{...mean_chn_0: 123    # 原 0.485 -> 123 Rmean_chn_1: 117    # 原 0.456 -> 117 Gmean_chn_2: 104    # 原 0.406 -> 104 Bvar_reci_chn_0: 0.0171    # 原 0.229 -> 0.0171 Rvar_reci_chn_1: 0.0175    # 原 0.224 -> 0.0175 Gvar_reci_chn_2: 0.0174    # 原 0.225 -> 0.0174 B
}

  好了,以上分享了 谈谈昇腾 CANN AIPP,希望我的分享能对你的学习有一点帮助。

 【极智视界】

《极智AI | 谈谈昇腾 CANN AIPP》

搜索关注我的微信公众号【极智视界】,获取我的更多经验分享,让我们用极致+极客的心态来迎接AI !

极智AI | 谈谈昇腾 CANN AIPP相关推荐

  1. 极智AI | 谈谈 caffe 框架

      欢迎关注我的公众号 [极智视界],获取我的更多笔记分享   大家好,我是极智视界,本文介绍一下 谈谈 caffe 框架.   大部分同学应该都知道,caffe 是一个 古老而又优秀的深度学习训练框 ...

  2. 极智AI | 谈谈几种量化策略:MinMax、KLD、ADMM、EQ

      欢迎关注我的公众号 [极智视界],获取我的更多笔记分享   O_o   >_<   o_O   O_o   ~_~   o_O   本文主要聊一下深度学习模型量化相关策略.   模型小 ...

  3. 极智AI | 谈谈模型剪枝之通道剪枝策略

      欢迎关注我的公众号 [极智视界],获取我的更多笔记分享   大家好,我是极智视界.本文主要聊一聊模型剪枝之通道剪枝相关实践分享.   模型剪枝是模型推理加速的重要实现技术手段,模型剪枝往往期望达到 ...

  4. 极智AI | 昇腾 CANN ATC 模型转换

      欢迎关注我的公众号 [极智视界],获取我的更多笔记分享   大家好,我是极智视界,本文介绍一下 昇腾 CANN ATC 模型转换.   昇腾 CANN 的全称是 Compute Architect ...

  5. 极智AI | 再谈昇腾CANN量化

    欢迎关注我的公众号 [极智视界],获取我的更多笔记分享 大家好,我是极智视界,本文介绍一下 再谈昇腾CANN量化. 在上一篇已经介绍了昇腾CANN量化的原理,对于原理或公式推导有兴趣的同学可以去看一看 ...

  6. 极智AI | Attention 中 torch.chunk 的 TensorRT 实现

      欢迎关注我的公众号 [极智视界],获取我的更多笔记分享   大家好,我是极智视界,本文介绍一下 Attention 中 torch.chunk 的 TensorRT 实现.   Attention ...

  7. 极智AI | 一文看懂昇腾达芬奇架构计算单元

        本文详细解释了昇腾达芬奇架构中计算单元的架构与计算原理. 文章目录 1.达芬奇架构概览 2.矩阵计算单元 2.1 矩阵相乘 2.2 矩阵计算单元的计算方式 2.3 向量计算单元的计算方式 2. ...

  8. 极智开发 | 谈谈 GPU 利用率

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   大家好,我是极智视界,本文主要谈谈 GPU 利用率,以 Nvidia GPU 为例.   GPU 的硬件架构不完全相同,有 ...

  9. 极智AI | AIGC时代中AI巨头之间的博弈

    欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文来谈谈 AIGC时代AI巨头之间的博弈. 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接: ...

最新文章

  1. 革命就是请客吃饭(案例分析吧)
  2. 137.三网?哪三网?139.网络协议三要素?141.网络安全有哪些方面?
  3. 决策树Decision Tree 及实现
  4. 艾特某人代码实现_为何敲代码,学好数学很重要?
  5. xml不利于调试_流利的接口不利于维护
  6. Jmeter系列之Jmeter+Grafana+InfluxDB实时监控
  7. 如何安装无签名认证的rpm包
  8. C#TcpClien网络通信之内存泄漏
  9. Chivas 芝华士12年-广告歌Sarah Khider《Mermaid Song》
  10. 维修电工技能实训考核装置
  11. C# 关于浏览器——CefSharp篇
  12. Oracle数据库之导入导出
  13. 不要把敏感信息写在k8s的env上
  14. 数据安全合规体系建设白皮书
  15. 037 《思考,快与慢》听后感
  16. Pytorch:optim.zero_grad()、pred=model(input)、loss=criterion(pred,tgt)、loss.backward()、optim.step()的作用
  17. Arduino控制舵机详解(含代码)
  18. Jenkins + 云效 前后端项目自动化部署
  19. 搭建全球地图数据服务中心
  20. 洗车店的预约系统小程序开发步骤_分享预约系统小程序有什么作用

热门文章

  1. 【漫画】程序员被KPI追赶的一生
  2. Thanks-Giving
  3. 基于STM32的软件IIC实现
  4. k-近邻算法(KNN)Python实现
  5. 那些坚持做科研的年轻人,现在怎么样了?
  6. 云上战“疫”背后:快杰云主机的技术担当
  7. 厦门水厂、三峡大坝被曝光
  8. CNAS实验室申请流程之二
  9. Delphi 如何在ActionManager要如何新增一个Category?
  10. 删除excel 中的文本框