[嵌入式AI從0開始到入土]嵌入式AI系列教程
注:等我摸完魚再把鏈接補(bǔ)上
可以關(guān)注我的B站號(hào)工具人呵呵的個(gè)人空間,后期會(huì)考慮出視頻教程,務(wù)必催更,以防我變身鴿王。
第一章 昇騰Altas 200 DK上手
第二章 下載昇騰案例并運(yùn)行
第三章 官方模型適配工具使用
第四章 煉丹爐的搭建(基于Ubuntu23.04 Desktop)
第五章 Ubuntu遠(yuǎn)程桌面配置
第六章 下載yolo源碼及樣例運(yùn)行驗(yàn)證
第七章 轉(zhuǎn)化為昇騰支持的om離線模型
第八章 jupyter lab的使用
第九章 yolov5在昇騰上推理
第十章 yolov5在昇騰上應(yīng)用
未完待續(xù)…
前言
注:本文基于Ubuntu23.04編寫,老版本入口可能存在差異
我們?cè)谇拔闹?,已?jīng)獲得了onnx版本為12的onnx模型文件,現(xiàn)在我們對(duì)其進(jìn)行ATC轉(zhuǎn)換,編程能夠在我們昇騰平臺(tái)上推理的om離線模型。至于為什么單獨(dú)寫一期ii,那是因?yàn)檫@玩意真的折磨人心態(tài)。
一、ATC是什么
1、簡(jiǎn)介
昇騰張量編譯器(Ascend Tensor Compiler,簡(jiǎn)稱ATC)是異構(gòu)計(jì)算架構(gòu)CANN體系下的模型轉(zhuǎn)換工具, 它可以將開源框架的網(wǎng)絡(luò)模型以及Ascend IR定義的單算子描述文件(json格式)轉(zhuǎn)換為昇騰AI處理器支持的.om格式離線模型。
模型轉(zhuǎn)換過程中,ATC會(huì)進(jìn)行算子調(diào)度優(yōu)化、權(quán)重?cái)?shù)據(jù)重排、內(nèi)存使用優(yōu)化等具體操作,對(duì)原始的深度學(xué)習(xí)模型進(jìn)行進(jìn)一步的調(diào)優(yōu),從而滿足部署場(chǎng)景下的高性能需求,使其能夠高效執(zhí)行在昇騰AI處理器上。
2、功能框架圖
二、執(zhí)行轉(zhuǎn)換
這里使用sample倉案例平均運(yùn)行時(shí)間在5-10分鐘,沒有進(jìn)度顯示,可以通過cpu使用率判斷。建議有條件的使用pc機(jī)來進(jìn)行轉(zhuǎn)換,會(huì)快很多。
1、MindStudio
隨便新建一個(gè)空項(xiàng)目
進(jìn)入模型轉(zhuǎn)換工具
我們只需要填這倆個(gè),剩下的會(huì)自動(dòng)識(shí)別。Targe Soc Version
我的200 DK使用這個(gè)沒有問題。如果有錯(cuò)誤,請(qǐng)手動(dòng)修改。
點(diǎn)擊output nodes->select
查看模型結(jié)構(gòu)是否正確,沒問題的話下一步。
如果你需要進(jìn)行數(shù)據(jù)的預(yù)處理,需要在上一步中的type
中改為uint8
。我們可以加載我們的aipp文件,當(dāng)然沒有也可以。
直接點(diǎn)完成,接下來就是漫長(zhǎng)的等待,基本上半分鐘內(nèi)不報(bào)錯(cuò)的話就沒問題,慢慢等就行。
2、ATC指令
我們需要準(zhǔn)備好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
參數(shù)說明
- framework:這個(gè)和你的模型有關(guān),0:Caffe 1:MindSpore 3:TensorFlow 5:ONNX,具體請(qǐng)參考官方文檔
- soc_version:我的Atlas 200 DK使用310轉(zhuǎn)換成功并可以正常推理,新的200i我不確定使用什么,手里沒有板子,你們?cè)囅?10能不能行。
三、問題
1、AIPP配置
這里給出一個(gè)模板,根據(jù)需要修改就可以。都是從文檔里摘出來的,以文檔為準(zhǔn)。文章來源:http://www.zghlxwxcb.cn/news/detail-770839.html
# AIPP的配置以aipp_op開始,標(biāo)識(shí)這是一個(gè)AIPP算子的配置,aipp_op支持配置多個(gè)
aipp_op {
#========================= 全局設(shè)置(start) ===========================================================================================================================================================
# aipp_mode指定了AIPP的模式,必須配置
# 類型:enum
# 取值范圍:dynamic/static,dynamic 表示動(dòng)態(tài)AIPP,static 表示靜態(tài)AIPP
aipp_mode:
# related_input_rank參數(shù)為可選,標(biāo)識(shí)對(duì)模型的第幾個(gè)輸入做AIPP處理,從0開始,默認(rèn)為0。例如模型有兩個(gè)輸入,需要對(duì)第2個(gè)輸入做AIPP,則配置related_input_rank為1。
# 類型: 整型
# 配置范圍 >= 0
related_input_rank: 0
# related_input_name參數(shù)為可選,標(biāo)識(shí)對(duì)模型的第幾個(gè)輸入做AIPP處理,此處需要填寫為模型輸入的name(input對(duì)應(yīng)的值)或者模型首層節(jié)點(diǎn)的輸出(top參數(shù)對(duì)應(yīng)的取值)。該參數(shù)只適用于Caffe網(wǎng)絡(luò)模型,且不能與related_input_rank參數(shù)同時(shí)使用。
# 例如模型有兩個(gè)輸入,且輸入name分別為data、im_info,需要對(duì)第二個(gè)輸入做AIPP,則配置related_input_name為im_info。
# 類型:string
# 配置范圍:無
related_input_name: ""
#========================= 全局設(shè)置(end) =============================================================================================================================================================
#========================= 動(dòng)態(tài)AIPP需設(shè)置,靜態(tài)AIPP無需設(shè)置(start) ===================================================================================================================================
# 輸入圖像最大的size,動(dòng)態(tài)AIPP必須配置(如果為動(dòng)態(tài)batch場(chǎng)景,N為最大檔位數(shù)的取值)
# 類型: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。
# 是否支持旋轉(zhuǎn),保留字段,暫不支持該功能
# 類型:bool
# 取值范圍:true/false,true表示支持旋轉(zhuǎn),false表示不支持旋轉(zhuǎn)
support_rotation: false
#========================= 動(dòng)態(tài)AIPP需設(shè)置,靜態(tài)AIPP無需設(shè)置(end) =======================================================================================================================================
#========================= 靜態(tài)AIPP需設(shè)置,動(dòng)態(tài)AIPP無需設(shè)置 (start)======================================================================================================================================
# 輸入圖像格式,必選
# 類型: enum
# 取值范圍:YUV420SP_U8、XRGB8888_U8、RGB888_U8、YUV400_U8
input_format:
# 說明:模型轉(zhuǎn)換完畢后,在對(duì)應(yīng)的*.om模型文件中,上述參數(shù)分別以1、2、3、4枚舉值呈現(xiàn)。
# 原始圖像的寬度、高度
# 類型:int32
# 取值范圍 & 約束:寬度取值范圍為[2,4096]或0;高度取值范圍為[1,4096]或0,對(duì)于YUV420SP_U8類型的圖像,要求原始圖像的寬和高取值是偶數(shù)
src_image_size_w: 0
src_image_size_h: 0
# 說明:請(qǐng)根據(jù)實(shí)際圖片的寬、高配置src_image_size_w和src_image_size_h;只有crop,padding功能都沒有開啟的場(chǎng)景,src_image_size_w和src_image_size_h才能取值為0或不配置,該場(chǎng)景下會(huì)取網(wǎng)絡(luò)模型輸入定義的w和h,并且網(wǎng)絡(luò)模型輸入定義的w取值范圍為[2,4096],h取值范圍為[1,4096]。
# C方向的填充值,保留字段,暫不支持該功能
# 類型: float16
# 取值范圍:[-65504, 65504]
cpadding_value: 0.0
#========= crop參數(shù)設(shè)置(配置樣例請(qǐng)參見AIPP配置 > Crop/Padding配置說明) =========
# AIPP處理圖片時(shí)是否支持摳圖
# 類型:bool
# 取值范圍:true/false,true表示支持,false表示不支持
crop: false
# 摳圖起始位置水平、垂直方向坐標(biāo),摳圖大小為網(wǎng)絡(luò)輸入定義的w和h
# 類型:int32
# 取值范圍 & 約束: [0,4095]、對(duì)于YUV420SP_U8類型的圖像,要求取值是偶數(shù)
# 說明: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,該場(chǎng)景下crop_size_w和crop_size_h才能取值為0或不配置,此時(shí)摳圖大?。╟rop_size[W|H])的寬和高取值來自模型文件--input_shape中的寬和高,并且--input_shape中的寬和高取值范圍為[1,4096]。
# 摳圖約束如下:
# 若input_format取值為YUV420SP_U8,則load_start_pos_w、load_start_pos_h必須為偶數(shù)。
# 若input_format取值為其他值,對(duì)load_start_pos_w、load_start_pos_h無約束。
# 若開啟摳圖功能,則src_image_size[W|H] >= crop_size[W|H]+load_start_pos[W|H]。
#================================== resize參數(shù)設(shè)置 ================================
# AIPP處理圖片時(shí)是否支持縮放,保留字段,暫不支持該功能
# 類型: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,該場(chǎng)景下resize_output_w和resize_output_h才能取值為0或不配置,此時(shí)縮放后圖像的寬和高取值來自模型文件--input_shape中的寬和高,并且--input_shape中的高取值范圍為[16,4096],寬取值范圍為[16,1920]。
#======== padding參數(shù)設(shè)置(配置樣例請(qǐng)參見AIPP配置 > Crop/Padding配置說明) =========
# AIPP處理圖片時(shí)padding使能開關(guān)
# 類型:bool
# 取值范圍:true/false,true表示支持,false表示不支持
padding: false
# H和W的填充值,靜態(tài)AIPP配置
# 類型: int32
# 取值范圍:[0,32]
left_padding_size: 0
right_padding_size: 0
top_padding_size: 0
bottom_padding_size: 0
# 說明:AIPP經(jīng)過padding后,輸出的H和W要與模型需要的H和W保持一致
# 針對(duì)Atlas 200/300/500 推理產(chǎn)品、Atlas 推理系列產(chǎn)品(Ascend 310P處理器)、Atlas 訓(xùn)練系列產(chǎn)品,W取值要<=1080。
# 針對(duì)Atlas 200/500 A2推理產(chǎn)品、Atlas A2訓(xùn)練系列產(chǎn)品/Atlas 300I A2推理產(chǎn)品,W取值要<=4096。
# 上下左右方向上padding的像素取值,靜態(tài)AIPP配置
# 類型:uint8/int8/float16
# 取值范圍分別為:[0,255]、[-128, 127]、[-65504, 65504]
padding_value: 0
# 說明:該參數(shù)取值需要與最終AIPP輸出圖片的數(shù)據(jù)類型保持一致。
#================================ rotation參數(shù)設(shè)置 ==================================
# AIPP處理圖片時(shí)的旋轉(zhuǎn)角度,保留字段,暫不支持該功能
# 類型:uint8
# 范圍:{0, 1, 2, 3} 0不旋轉(zhuǎn),1順時(shí)針90°,2順時(shí)針180°,3順時(shí)針270°
rotation_angle: 0
#========= 色域轉(zhuǎn)換參數(shù)設(shè)置(配置樣例請(qǐng)參見AIPP配置 > 色域轉(zhuǎn)換配置說明) =============
# 色域轉(zhuǎn)換開關(guān),靜態(tài)AIPP配置
# 類型:bool
# 取值范圍:true/false,true表示開啟色域轉(zhuǎn)換,false表示關(guān)閉
csc_switch: false
# R通道與B通道交換開關(guān)/U通道與V通道交換開關(guān)
# 類型:bool
# 取值范圍:true/false,true表示開啟通道交換,false表示關(guān)閉
rbuv_swap_switch :false
# RGBA->ARGB, YUVA->AYUV交換開關(guān)
# 類型:bool
# 取值范圍:true/false,true表示開啟,false表示關(guān)閉
ax_swap_switch: false
# 單行處理模式(只處理摳圖后的第一行)開關(guān),保留字段,暫不支持該功能
# 類型:bool
# 取值范圍:true/false,true表示開啟單行處理模式,false表示關(guān)閉
single_line_mode: false
# 若色域轉(zhuǎn)換開關(guān)為false,則本功能不起作用。
# 若輸入圖片通道數(shù)為4,則忽略A通道或X通道。
# YUV轉(zhuǎn)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轉(zhuǎn)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轉(zhuǎn)YUV時(shí)的輸出偏移
# 類型:uint8
# 取值范圍:[0, 255]
output_bias_0: 16
output_bias_1: 128
output_bias_2: 128
# YUV轉(zhuǎn)RGB時(shí)的輸入偏移
# 類型:uint8
# 取值范圍:[0, 255]
input_bias_0: 16
input_bias_1: 128
input_bias_2: 128
#============================== 減均值、乘系數(shù)設(shè)置 =================================
# 計(jì)算規(guī)則如下:
# 當(dāng)uint8->uint8時(shí),本功能不起作用
# 當(dāng)uint8->fp16時(shí),pixel_out_chx(i) = [pixel_in_chx(i) – mean_chn_i – min_chn_i] * var_reci_chn
# 每個(gè)通道的均值
# 類型:uint8
# 取值范圍:[0, 255]
mean_chn_0: 0
mean_chn_1: 0
mean_chn_2: 0
mean_chn_3: 0
# 每個(gè)通道的最小值
# 類型:float16
# 取值范圍:[0, 255]
min_chn_0: 0.0
min_chn_1: 0.0
min_chn_2: 0.0
min_chn_3: 0.0
# 每個(gè)通道方差的倒數(shù)
# 類型: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
#========================= 靜態(tài)AIPP需設(shè)置,動(dòng)態(tài)AIPP無需設(shè)置 (end)=====================================================================================================================================
}
總結(jié)
遇到?jīng)]寫到的報(bào)錯(cuò),去官方文檔里找,雖然有些確實(shí)離譜,比如E10026
這個(gè)錯(cuò)誤,我直接呆住。文檔中引起問題的原因和解決方法都是N/A
,這就。。。文章來源地址http://www.zghlxwxcb.cn/news/detail-770839.html
到了這里,關(guān)于[嵌入式AI從0開始到入土]7_轉(zhuǎn)化為昇騰支持的om離線模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!