目录
onnx模型转rknn模型需要用到rknn.api,主要包含以下几个主要的函数:
rknn = RKNN(): 创建rknn对象。
rknn.config(): rknn的参数配置,这个函数需要设置的参数细节很多。
rknn.load_onnx(): 加载onnx模型
rknn.build(): 构建rknn模型
rknn.export_rknn(): 模型转换并输出rknn模型
接下来,依次具体介绍上述这些函数,以及包含的所有参数和默认值。
github:https://github.com/rockchip-linux/rknn-toolkit
建议直接在官网github上找到最新的
整体流程图:
当前介绍的rknn-api版本是V1.7.3
1. RKNN()
在使用 RKNN Toolkit 的所有 API 接口时,都需要先调用 RKNN()方法初始化一个 RKNN 对象,并在用完后调用该对象的 release()方法将对象释放掉。
可以设置的参数:
参数名 | 类型 | 描述 |
---|---|---|
verbose | bool | verbose 参数指定是否要在屏幕上打印详细日志信息 |
verbose_file | string |
示例:
# 将详细的日志信息输出到屏幕,并写到 mobilenet_build.log 文件中
rknn = RKNN(verbose=True, verbose_file='./mobilenet_build.log')
# 只在屏幕打印详细的日志信息
rknn = RKNN(verbose=True)
…
rknn.release()
2. rknn.config()
作用:设置模型的预处理参数。例如先对模型进行通道均值,通道顺序、量化类型等的配置。
batch_size:
每一批数据的大小,默认值为 100。量化时将根据该参数决定每一批次参与运算的数据量,以校正量化结果。如果 dataset 中的数据量小于 batch_size,则该参数值将自动调整为 dataset 中的数据量。如果量化时出现内存不足的问题,建议将这个值设小一点,例如 8。
mean_values:
输入的均值。该参数与 channel_mean_value 参数不能同时设置。参数
格式是一个列表,列表中包含一个或多个均值子列表,多输入模型对应多个子列表,每个子列表的长度与该输入的通道数一致,例如[[128,128,128]],表示一个输入的三个通道的值减去 128。如果 reorder_channel 设置成’2 1 0‘,则优先做通道调整,再做减均值。
std_values:
输入的归一化值。该参数与 channel_mean_value 参数不能同时设置。参
数格式是一个列表,列表中包含一个或多个归一化值子列表,多输入模型对应多个子列表,每个子列表的长度与该输入的通道数一致,例如[[128,128,128]],表示设置一个输入的三个通道的值减去均值后再除以 128。如果 reorder_channel 设置成’2 1 0‘,则优先做通道调整,再减均值和除以归一化值。
channel_mean_value:
包括四个值(M0 M1 M2 S0),前三个值为均值参数,后面一个值
为 Scale 参数。对于输入数据是三通道的(Cin0, Cin1, Cin2)数据来讲,经过预处理后,输出的数据为(Cout0,Cout1, Cout2),计算过程如下:
Cout0 = (Cin0 - M0)/S0
Cout1 = (Cin1 - M1)/S0
Cout2 = (Cin2 - M2)/S0
例如,如果需要将输入数据归一化到[-1, 1]之间,则可以设置这个参数为(128 128 128 128);如果需要将输入数据归一化到[0, 1]之间,则可以设置这个参数为 (0 0 0 255)。
epochs:
量化时的迭代次数,每迭代一次,就选择 batch_size 指定数量的图片进行量化校正。默认值为-1,此时 RKNN-Toolkit 会根据 dataset 中的图片数量自动计算迭代次数以最大化利用数据集中的数据
reorder_channel:
表示是否需要对图像通道顺序进行调整,只对三通道输入有效。
’0 1 2’表示按照输入的通道顺序来推理,比如图片输入时是 RGB,那推理的时候就根据RGB顺序传给输入层;
’2 1 0’表示会对输入做通道转换,比如输入时通道顺序是RGB,推理时会将其转成 BGR,再传给输入层,同样的,输入时通道的顺序为 BGR 的话,会被转成 RGB 后再传给输入层。
如果有多个输入,每个输入的参数以“#”进行分隔,如 ’0 1 2#0 1 2’。该参数的默认值是 None,对于 Caffe 框架的三通道输入模型,表示需要做通道顺序的调整,其他框架的三通道输入模型,默认不做通道顺序调整。
建议用户输入数据统一使用 RGB 排布。在导出 RKNN 模型时,config 函数的 reorder_channel
参数,有以下两种可能:
1)如果原始模型使用 BGR 图片训练,reorder_channel=‘2 1 0’。
2)如果原始模型使用 RGB 图片训练,reorder_channel=‘0 1 2’。
force_builtin_perm
设置 force_builtin_perm=True,导出 NHWC 输入的 RKNN
模型。
need_horizontal_merge:
是否需要进行水平合并,默认值为 False。如果模型是inception v1/v3/v4,建议开启该选项,可以提高推理时的性能。
quantized_dtype:
量化类型,目前支持的量化类型有 asymmetric_quantized-u8、
dynamic_fixed_point-8、dynamic_fixed_point-16,默认值为 asymmetric_quantized-u8。
非对称量化:asymmetric_quantized
动态定点量化:dynamic_fixed_point
quantized_algorithm
量化参数优化算法。当前版本支持的算法有:normal,mmse 和kl_divergence,默认值为 normal。其中 normal 算法的特点是速度较快。而 mmse 算法,因为需要对量化参数进行多次调整,其速度会慢很多,但通常能得到比 normal 算法更高的精度;kl_divergence 所用时间会比 normal 多一些,但比 mmse 会少很多,在某些场景下可以得到较好的改善效果。
mmse_epoch:
mmse 量化算法的迭代次数,默认值为 3。通常情况下,迭代次数越多,
精度往往越高。
optimization_level:
模型优化等级。通过修改模型优化等级,可以关掉部分或全部模
型转换过程中使用到的优化规则。该参数的默认值为 3,打开所有优化选项。值为 2 或 1 时关闭一部分可能会对部分模型精度产生影响的优化选项,值为 0 时关闭所有优化选项。
target_platform:
指定 RKNN 模型是基于哪个目标芯片平台生成的。目前支持RK1806、RK1808、RK3399Pro、RV1109 和 RV1126。其中基于 RK1806、RK1808 或RK3399Pro 生成的 RKNN 模型可以在这三个平台上通用,基于 RV1109 或 RV1126 生成的 RKNN 模型可以在这两个平台通用。
如果模型要在 RK1806、RK1808 或 RK3399Pro 上运行,该参数的值可以是 [“rk1806”], [“rk1808”], [“rk3399pro”]或[“rk1806”, “rk1808”, “rk3399pro”]等;如果模型要在 RV1109 或 RV1126 上运行,该参数的值可以是[“rv1126”], [“rv1109”]或[“rv1109”, “rv1126”]等。
这个参数的值不可以是类似[“rk1808”, “rv1126”]这样的组合,因为这两款芯片互不兼容。如果不填该参数,则默认是[“rk1808”],生成的 RKNN 模型可以在 RK1806、RK1808 和 RK3399Pro 平台上运行。
该参数的值大小写不敏感。
quantize_input_node:
开启后无论模型是否量化,均强制对模型的输入节点进行量化。
输入节点被量化的模型,在部署时会有性能优势,rknn_input_set 接口的耗时更少。当 RKNN-Toolkit 量化没有按理想情况对输入节点进行量化(仅支持输入为图片的模型)、或用户选择加载深度学习框架已生成的量化模型时可以启用(这种情况下,第一层的 quantize_layer 会被合并到输入节点)。默认值为 False。
merge_dequant_layer_and_output_node:
merge_dequant_layer_and_output_node: 将模型输出节点与上一层的 dequantize_layer,合并成一个被量化的输出节点,允许模型在部署时返回 uint8 或 float 类型的推理结果。此配置仅对加载深度学习框架已生成的量化模型有效。默认为 False。
示例:
# model config
rknn.config(mean_values=[[103.94, 116.78, 123.68]],
std_values=[[58.82, 58.82, 58.82]],
reorder_channel=’0 1 2’,
need_horizontal_merge=True,
target_platform=[‘rk1808’, ‘rk3399pro’])