赞
踩
RKNN-Toolkit2 是为用户提供在PC、Rockchip NPU 平台上进行模型转换、推理和性能评估的开发套件,用户通过该工具提供的Python 接口可以便捷地完成以下功能:
1)模型转换:支持Caffe、TensorFlow、TensorFlow Lite、ONNX、DarkNet、PyTorch 等模型
转为RKNN 模型,并支持RKNN 模型导入导出,RKNN 模型能够在Rockchip NPU 平台上加载使用。
2) 量化功能:支持将浮点模型量化为定点模型,目前支持的量化方法为非对称量化( asymmetric_quantized-8 及asymmetric_quantized-16 ) , 并支持混合量化功能。
asymmetric_quantized-16 目前版本暂不支持。
3) 模型推理:能够在PC 上模拟Rockchip NPU 运行RKNN 模型并获取推理结果;或将RKNN
模型分发到指定的NPU 设备上进行推理并获取推理结果。
4) 性能和内存评估:将RKNN 模型分发到指定NPU 设备上运行,以评估模型在实际设备上
运行时的性能和内存占用情况。
5) 量化精度分析:该功能将给出模型量化前后每一层推理结果与浮点模型推理结果的余弦距
离,以便于分析量化误差是如何出现的,为提高量化模型的精度提供思路。
初始化函数:rknn = RKNN(verbose,verbose_file)
参数:初始化RKNN 对象时,可以设置verbose 和verbose_file 参数,以打印详细的日志信息。其中verbose 参数指定是否要在屏幕上打印详细日志信息;如果设置了verbose_file 参数,且verbose 参数值为True,日志信息还将写到该参数指定的文件中。一般将verbose设置为True,verbose_file不设置,将日志显示到终端上。
目前。RKNN支持Tensorflow、Pytorch、Caffe、Tensorflow Lite、ONNX、DarkNet,这些模型都需要转化为rknn模型才能部署在RK3588上,因此,这部分相关的API在模型转化的时候用到,转化的模型文件名为“xxx.rknn”,后缀为".rknn"。转化之后的rknn模型可以直接使用API进行加载、推理。转化只需要一次即可。我这里只用到了Tensorflow,介绍其API的用法,其他的模型转化类似。
转化模型之前需要先配置RKNN-Toolkit2。使用到的API是config,使用示例如下:
ret = rknn.config(mean_values=[127.5, 127.5, 127.5], std_values=[127.5, 127.5, 127.5], target_platform='rk3588')
mean_values:输入的均值,参数是一个列表。表示输入图像的三个通道值分别减去[127.5, 127.5, 127.5]。
std_values:输入的归一化值,参数是一个列表。表示输入图像的三个通道值分别减去[127.5, 127.5, 127.5]再分别除以[127.5, 127.5, 127.5]。
target_platform:运行平台,我这里用到的是rk3588。
将Tensorflow模型加载到内存中进行处理,API是load_tensorflow,示例:
ret = rknn.load_tensorflow(tf_pb=SSD_MODEL_PATH,inputs=['Preprocessor/sub'],outputs=['concat', 'concat_1'],input_size_list=[[1, 300, 300, 3]])
tf_pb:是SSD算法(Tensorflow开发)模型的路径。
inputs:模型的输入节点(操作数名),按照官方例子写['Preprocessor/sub']
outputs:模型的输出节点(操作数名),按照官方例子写['concat', 'concat_1']
input_size_list:每个输入节点对应的图片的尺寸和通道数。SSD算法输入的图像尺寸为 300×300。
将Tensorflow模型转化为rknn模型,需要使用的API是build,示例:
ret = rknn.build(do_quantization=True, dataset='./dataset.txt')
这个就是将Tensorflow模型转化成rknn。
do_quantization:是否对模型进行量化,值为True 或False。
dataset:量化校正数据的数据集。可以理解为用来进行测试的图像路径名的集合。每一个图像路径放一行。我这里就用一个图像进行测试。所以dataset.txt内如为
road.bmp
模型的导出需要使用export_rknn函数,参数为导出模型所在的路径,后缀名为‘.rknn’。
ret = rknn.export_rknn('./rknn_modek.rknn')
ret = rknn.init_runtime(target='rk3588', device_id=DEVICE_ID, perf_debug=True,eval_mem=True)
target:是目标平台,我这里用的是rk3588。 device_id:是设备的ID号,可以通过adb devices这个指令查看,具体的查看方法参考上一篇文章。 perf_debug,eval_mem:这两个是在对模型进行评估是用到,默认是False,perf_debug是评估模型使用时间,eval_mem评估模型使用内存。这两个配置为True了,后面才可以使用模型评估相关API。
代码如下
outputs = rknn.inference(inputs=[img])
img是使用cv2读取、处理好的图像。
使用fim查看运行出来的图像
八个结果对应八个标识框框。
- ret = rknn.eval_perf(inputs=[img], is_print=True)
- memory_detail = rknn.eval_memory()
使用时间。输出的结果太多了,只取前面的一部分
每一层模型的输出时间都有。
最终的时间为40.073ms(昨天测试的一般时间在17ms左右,具体时间跟主频频率这些都有关系,想要测试准确,还是需要将主频这些固定)。
内存使用情况,可以看到一共20.58MiB内存。模型应该可以对其进行优化减少内存使用。
RKNN-Toolkit2的python API使用起来比较简单,常用的功能都已经封装好了, RKNN-Toolkit2还提供了C的API,后面研究下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。