rknn_convert
是RKNN-Toolkit2提供的一套常用模型轉換工具,通過封裝上述API接口,用戶只需編輯模型對應的yml
配置文件,就可以通過指令轉換模型。以下是如何使用rknn_convert
工具的示例命令以及支持的指令參數:
python -m rknn.api.rknn_convert -t rk3588 -i ./model_config.yml/onnx -o ./output_path
通過使用上述命令和參數,用戶可以將模型轉換為RKNN格式,并將轉換后的模型保存到指定的輸出路徑。
注意:我寫這個功能主要是為了方便臨時測試,不要寫代碼就可以進行簡單的連板調試
部分指令參數說明如下:
- -i: 模型配置文件(.yml/onnx)路徑,如果只是評估rknn模型在板子上的精度、速度和內存使用情況可以直接使用onnx模型,也可以配置yml(挺繁瑣的但是也有小部分人用)。
- -o: 轉換后模型輸出路徑。
- -t: target_platform,目標平臺可以選擇rv1103,rv1103b, rv1106,rv1106b,rv1126b, rk2118,rk3562,rk3566,rk3568,rk3576或rk3588(只要不是rknpu1都可以)。
- -e: (選填) 評估連板運行時model的耗時和內存占用,若開啟請輸入-e。注:一定要連接相應開發板并正確設置
target_platform
,否則會報錯,當有多設備時可通過-d
參數指定設備ID。 - -a: (選填)評估生成的rknn模型精度,開啟模擬器精度評估請輸入-a "xx1.jpg”,如果模型是兩輸入則-a “xx1.jpg xx2.jpg”,若要開啟連板精度評估請配合-d參數使用。
- -v: (選填)指定是否要在屏幕上打印詳細日志信息,若開啟打印模式請輸入-v。
- -d: (選填)單個adb設備使用-d,多adb設備使用-d device_id,device_id通過adb devices查詢。
- -do_Quant:若要量化成int8就設置這個參數,后接量化集xxx.txt,如果這個參數不設置默認使用fp16,即不量化
- -onnx_inputs:有時候onnx的輸入可能是[?,3,384,384]這種沒有指定的,則可以使用該參數固定shape,比如-onnx_inputs “{‘img’:[1,3,384,384]}”
- -onnx_outputs:可以用來截斷模型,比如-onnx_outputs “[‘output_0’,‘output_1’]”
- -custom_hybrid:用來fi16和i8混合量化的功能(1106則是int16和int8混合量化),實現的效果可以參考rknn model zoo的yolov8 pose混合量化
- -h: 查詢具體參數
具體參數如下
Usage: python script.py [OPTIONS]
Options:-i, --input : yml config file path (required)-o, --output : output dir-t, --target_platform : target_platform, support rk3568/rk3566/rk3562/rk3588/rv1126b (required)-e, --eval_perf_memory : eval model perf and memory, board debugging is required, multi adb device use -d, default=false (default: False)-a, --accuracy_analysis : Usage: -a "xx1.jpg xx2.jpg". Simulator accuracy_analysis, if want to turn on board accuracy_analysis, please use -d-v, --verbose : whether to print detailed log information on the screen, default=false (default: False)-d, --device_id : Single adb device usage: -d. Multi adb device usage:-d device_id-mean, --mean : Usage: -mean "[0,0,0]" or "[[127],[127],[127]]", default is 0-std, --std : Usage: -std "[1,1,1]" or "[[127],[127],[127]]", default is 1-do_Quant, --do_Quant : Attach dataset txt file, such as -do_Quant xxx.txt. If there is no txt file, do_quantization=False by default.-onnx_inputs, --onnx_inputs : Usage: -onnx_inputs "{'Cast_0':[1,3,384,384],'Cast_1':[1,3,640,640]}"-onnx_outputs, --onnx_outputs : Usage: -onnx_outputs "['output_0','output_1']"-dynamic_input, --dynamic_input : Usage: -dynamic_input "[[[1,3,256,256]],[[1,3,160,160]]]"-RGB2BGR, --quant_img_RGB2BGR : quant_img_RGB2BGR, default=false (default: False)-Quant_algorithm, --quantized_algorithm : Usage: -Quant_algorithm normal/mmse/kl_divergence, default='normal' (default: normal)-compress_weight, --compress_weight : compress_weight, default=false (default: False)-single_core_mode, --single_core_mode : single_core_mode, default=false (default: False)-Quant_dtype, --quantized_dtype : quantized_dtype support: w8a8, w8a16, w16a16i, w16a16i_dfp, w4a16. default is w8a8 (default: w8a8)-custom_hybrid, --custom_hybrid : Usage: -custom_hybrid "[['start_node_name','end_node_name']]"
下面是一個使用onnx輸入的例子(注意外層使用” “,內層使用’ ',要不然會有bug,比如-onnx_outputs “[‘output_0’]”):
python -m rknn.api.convert -i xxx.onnx/yml -o ./ -t rk3588 -do_Quant xxx.txt -mean "[0,0,0]" -std "[255,255,255]" -onnx_inputs "{'Cast_0':[1,3,384,384]}"-onnx_outputs "['output_0']" -Quant_algorithm kl_divergence -a "xx1.jpg" -e -d 123456 -custom_hybrid "[['/model.22/cv4.0/cv4.0.0/act/Mul_output_0','/model.22/Concat_6_output_0']]"
下面是一個參考的yml配置文件(object_detection.yml
):
models:# model output namename: object_detection # Original model frameworkplatform: onnx # Model input file pathmodel_file_path: ./object_detection.onnx # Describe information such as input and output shapessubgraphs: # model input tensor shapeinput_size_list: - 1,3,512,512# input tensor nameinputs: - data# output tensor nameoutputs: - conv6-1- conv6-2- conv6-3# quantification flagquantize: true # Quantify dataset file path (relative yml path)dataset: ./dataset.txt configs:quantized_dtype: asymmetric_quantized-8 # rknn.config mean_values mean_values: [127.5,127.5,127.5] # rknn.config std_values std_values: [128.0,128.0,128.0] # rknn.config quant_img_RGB2BGR quant_img_RGB2BGR: false # rknn.config quantized_algorithm quantized_algorithm: normal
這個配置文件包括了模型的名稱、原始模型使用的框架、模型文件路徑、輸入輸出信息、是否進行量化等詳細信息。用戶可以根據模型的特定需求編輯相應的配置文件。
模型轉換配置詳見下表:
參數名 | 填寫內容 |
---|---|
-name | 模型輸出名稱 |
-platform | 原始模型使用的框架,支持tensorflow、tflite、caffe、onnx、pytorch、darknet |
-model_file_path | 原始模型文件路徑,適用于單模型文件輸入,例:tensorflow、tflite、onnx、pytorch |
-quantize | 是否開啟量化 |
-dataset | 量化dataset文件路徑(相對yml配置文件路徑),若要開啟accuracy_analysis此項必填 |
-prototxt_file_path | platform為caffe時,模型的prototxt文件 |
-caffemodel_file_path | platform為caffe時,模型的caffemodel文件 |
-darknet_cfg_path | platform為darknet時,模型的cfg文件 |
-darknet_weights_path | platform為darknet時,模型的weight文件 |
-subgraphs | 描述輸入輸出shape等信息。除特定框架外,一般情況下該參數及附帶的子參數可不寫,使用模型默認值 |
----input_size_list(子參數) | 輸入tensor的shape |
----inputs(子參數) | 輸入tensor的名稱 |
----outputs(子參數) | 輸出tensor的名稱 |
-configs | 對應rknn.config()配置 |
----quantized_dtype(子參數) | 量化類型,RKNN_toolkit2: 可填寫 [asymmetric_quantized-8],不輸入用默認值 |
----mean_values(子參數) | 輸入的均值歸一數,模型為單輸入RGB如[123.675,116.28,103.53],若為多輸入如[[123,116,103],[255,255,255]] |
----std_values(子參數) | 輸入的方差歸一數,模型為單輸入RGB如[58.395,58.295,58.391],若為多輸入如[[127,127,127],[255,255,255]] |
----quant_img_RGB2BGR(子參數) | 用于控制量化時加載量化校正圖像時是否需要先進行RGB到 BGR 的轉換,默認值是False |
----quantized_algorithm(子參數) | 量化算法,可選[‘normal’, ‘kl_divergence’, ‘mmse’],默認為 normal |
----quantized_method(子參數) | 量化方式,RKNN_toolkit2可選[‘layer’, ‘channel’],默認為channel |
----optimization_level(子參數) | 設置優化級別。默認為3,表示使用所有默認優化選項 |
----model_pruning(子參數) | 修剪模型以減小模型大小,默認為false,開啟為true |
----quantize_weight(子參數) | 當quantize參數為false時,通過量化一些權重來減小rknn模型的大小。默認為false,開啟為true |
----single_core_mode(子參數) | 是否僅生成單核模型,可以減小RKNN模型的大小和內存消耗。默認值為False。目前對RK3588/RK3576生效。默認值為 False |
----compress_weight(子參數) | 壓縮權重使rknn模型更小,默認為false,開啟為true |
----inputs_yuv_fmt(子參數) | 輸入配置為YUV格式,默認為false |