[嵌入式AI从0开始到入土]嵌入式AI系列教程
注:等我摸完鱼再把链接补上
可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。
第一章 昇腾Altas 200 DK上手
第二章 下载昇腾案例并运行
第三章 官方模型适配工具使用
第四章 炼丹炉的搭建(基于Ubuntu23.04 Desktop)
第五章 Ubuntu远程桌面配置
第六章 下载yolo源码及样例运行验证
第七章 转化为昇腾支持的om离线模型
第八章 jupyter lab的使用
第九章 yolov5在昇腾上推理
第十章 yolov5在昇腾上应用
未完待续…
前言
注:本文基于Ubuntu23.04编写,老版本入口可能存在差异
我们在前文中,已经获得了onnx版本为12的onnx模型文件,现在我们对其进行ATC转换,编程能够在我们昇腾平台上推理的om离线模型。至于为什么单独写一期ii,那是因为这玩意真的折磨人心态。
一、ATC是什么
1、简介
昇腾张量编译器(Ascend Tensor Compiler,简称ATC)是异构计算架构CANN体系下的模型转换工具, 它可以将开源框架的网络模型以及Ascend IR定义的单算子描述文件(json格式)转换为昇腾AI处理器支持的.om格式离线模型。
模型转换过程中,ATC会进行算子调度优化、权重数据重排、内存使用优化等具体操作,对原始的深度学习模型进行进一步的调优,从而满足部署场景下的高性能需求,使其能够高效执行在昇腾AI处理器上。
2、功能框架图
二、执行转换
这里使用sample仓案例平均运行时间在5-10分钟,没有进度显示,可以通过cpu使用率判断。建议有条件的使用pc机来进行转换,会快很多。
1、MindStudio
随便新建一个空项目
进入模型转换工具
我们只需要填这俩个,剩下的会自动识别。Targe Soc Version
我的200 DK使用这个没有问题。如果有错误,请手动修改。
点击output nodes->select
查看模型结构是否正确,没问题的话下一步。
如果你需要进行数据的预处理,需要在上一步中的type
中改为uint8
。我们可以加载我们的aipp文件,当然没有也可以。
直接点完成,接下来就是漫长的等待,基本上半分钟内不报错的话就没问题,慢慢等就行。
2、ATC指令
我们需要准备好onnx模型和aipp.cfg配置文件
atc --model=yolov5s.onnx --framework=5 --output=yolov5s --input_shape="images:1,3,640,640" --soc_version=Ascend310 --insert_op_conf=aipp.cfg
参数说明
- framework:这个和你的模型有关,0:Caffe 1:MindSpore 3:TensorFlow 5:ONNX,具体请参考官方文档
- soc_version:我的Atlas 200 DK使用310转换成功并可以正常推理,新的200i我不确定使用什么,手里没有板子,你们试下310能不能行。
三、问题
1、AIPP配置
这里给出一个模板,根据需要修改就可以。都是从文档里摘出来的,以文档为准。文章来源:https://www.toymoban.com/news/detail-770839.html
# 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保持一致
# 针对Atlas 200/300/500 推理产品、Atlas 推理系列产品(Ascend 310P处理器)、Atlas 训练系列产品,W取值要<=1080。
# 针对Atlas 200/500 A2推理产品、Atlas A2训练系列产品/Atlas 300I A2推理产品,W取值要<=4096。
# 上下左右方向上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)=====================================================================================================================================
}
总结
遇到没写到的报错,去官方文档里找,虽然有些确实离谱,比如E10026
这个错误,我直接呆住。文档中引起问题的原因和解决方法都是N/A
,这就。。。文章来源地址https://www.toymoban.com/news/detail-770839.html
到了这里,关于[嵌入式AI从0开始到入土]7_转化为昇腾支持的om离线模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!