在使用RKNN-Toolkit2的所有API接口时,都需要先调用RKNN()方法初始化RKNN对象,不再使用该对象时通过调用该对象的release()方法进行释放。
初始化RKNN对象时,可以设置verbose和verbose_file参数,以打印详细的日志信息。其中verbose参数指定是否要打印详细日志信息;如果设置了verbose_file参数,且verbose参数值为True,日志信息还将写到该参数指定的文件中。
举例如下:
# 打印详细的日志信息
rknn = RKNN(verbose=True)
…
rknn.release()
在构建RKNN模型之前,需要先对模型进行通道均值、量化图片RGB2BGR转换、量化类型等的配置,这些操作可以通过config接口进行配置。

举例如下:
# model config
rknn.config(mean_values=[[103.94, 116.78, 123.68]],
std_values=[[58.82, 58.82, 58.82]],
quant_img_RGB2BGR=True,
target_platform='rk3566')
RKNN-Toolkit2目前支持Caffe、TensorFlow、TensorFlow Lite、ONNX、DarkNet、PyTorch等模型的加载转换,这些模型在加载时需调用对应的接口,以下为这些接口的详细说明。
1.3.1 Caffe模型加载接口

举例如下:
# 从当前路径加载mobilenet_v2模型
ret = rknn.load_caffe(model='./mobilenet_v2.prototxt',
blobs='./mobilenet_v2.caffemodel')举例如下:
# 从当前目录加载ssd_mobilenet_v1_coco_2017_11_17模型
ret = rknn.load_tensorflow(tf_pb='./ssd_mobilenet_v1_coco_2017_11_17.pb',
inputs=['Preprocessor/sub'],
outputs=['concat', 'concat_1'],
input_size_list=[[300, 300, 3]])
举例如下:
# 从当前目录加载mobilenet_v1模型
ret = rknn.load_tflite(model='./mobilenet_v1.tflite')
举例如下:
# 从当前目录加载arcface模型
ret = rknn.load_onnx(model='./arcface.onnx')
举例如下:
# 从当前目录加载yolov3-tiny模型
ret = rknn.load_darknet(model='./yolov3-tiny.cfg',
weight='./yolov3.weights')
举例如下:
# 从当前目录加载resnet18模型
ret = rknn.load_pytorch(model='./resnet18.pt',
input_size_list=[[1,3,224,224]])
举例如下:
# 构建RKNN模型,并且做量化
ret = rknn.build(do_quantization=True, dataset='./dataset.txt')
通过本工具构建的RKNN模型通过该接口可以导出存储为RKNN模型文件,用于模型部署。

举例如下:
# 将构建好的RKNN模型保存到当前路径的mobilenet_v1.rknn文件中
ret = rknn.export_rknn(export_path='./mobilenet_v1.rknn')
举例如下:
# 从当前路径加载mobilenet_v1.rknn模型
ret = rknn.load_rknn(path='./mobilenet_v1.rknn')
在模型推理或性能评估之前,必须先初始化运行时环境,明确模型的运行平台(具体的目标硬件平台或软件模拟器)。

举例如下:
# 初始化运行时环境
ret = rknn.init_runtime(target='rk3566')
在进行模型推理前,必须先构建或加载一个RKNN模型。

举例如下:
对于分类模型,如mobilenet_v1,代码如下(完整代码参考example/tflite/mobilent_v1):
# 使用模型对图片进行推理,得到TOP5结果
outputs = rknn.inference(inputs=[img])
show_outputs(outputs)输出的TOP5结果如下:
-----TOP 5-----
[ 156] score:0.928223 class:"Shih-Tzu"
[ 155] score:0.063171 class:"Pekinese, Pekingese, Peke"
[ 205] score:0.004299 class:"Lhasa, Lhasa apso"
[ 284] score:0.003096 class:"Persian cat"
[ 285] score:0.000171 class:"Siamese cat, Siamese"
举例如下:
# 对模型性能进行评估
perf_detail = rknn.eval_perf()
举例如下:
# 对模型内存使用情况进行评估
memory_detail = rknn.eval_memory()如examples/caffe/mobilenet_v2,它在RK3588上运行时内存占用情况如下:
======================================================
Memory Profile Info Dump
======================================================
NPU model memory detail(bytes):
Weight Memory: 3.53 MiB
Internal Tensor Memory: 1.67 MiB
Other Memory: 473.00 KiB
Total Memory: 5.66 MiB
INFO: When evaluating memory usage, we need consider
the size of model, current model size is: 4.09 MiB
======================================================
举例如下:
# 获取SDK版本信息
sdk_version = rknn.get_sdk_version()
print(sdk_version)返回的SDK信息类似如下:
==============================================
RKNN VERSION:
API: 1.5.2 (8babfea build@2023-08-25T02:31:12)
DRV: rknn_server: 1.5.2 (8babfea build@2023-08-25T10:30:12)
DRV: rknnrt: 1.5.3b13 (42cbca6f5@2023-10-27T10:13:21)
==============================================
1.12.1 hybrid_quantization_step1
使用混合量化功能时,第一阶段调用的主要接口是hybrid_quantization_step1,用于生成临时模型文件(.model)、数据文件(.data)和量化配置文件
(.quantization.cfg)。接口详情如下:

举例如下:
# 调用hybrid_quantization_step1 产生量化配置文件
ret = rknn.hybrid_quantization_step1(dataset='./dataset.txt')1.12.2 hybrid_quantization_step2
用于使用混合量化功能时生成RKNN模型,接口详情如下:

举例如下:
# Call hybrid_quantization_step2 to generate hybrid quantized RKNN model
ret = rknn.hybrid_quantization_step2(
model_input='./ssd_mobilenet_v2.model',
data_input='./ssd_mobilenet_v2.data',
model_quantization_cfg='./ssd_mobilenet_v2.quantization.cfg')
该接口的功能是进行浮点、量化推理并产生每层的数据,并进行量化精度分析。

举例如下:
# Accuracy analysis
ret = rknn.accuracy_analysis(inputs=['./dog_224x224.jpg'])
举例如下:
rknn.list_devices()返回的设备列表信息如下:
*************************
all device(s) with adb mode:
VD46C3KM6N
*************************注:使用多设备时,需要保证它们的连接模式都是一致的,否则会引起冲突,导致设备连接失败。
该接口的功能是将普通的RKNN模型进行加密,得到加密后的模型。

举例如下:
ret = rknn.export_encrypted_rknn_model('test.rknn')
该接口的功能是注册一个自定义算子。

举例如下:
import numpy as np
from rknn.api.custom_op import get_node_attr
class cstSoftmax:
op_type = 'cstSoftmax'
def shape_infer(self, node, in_shapes, in_dtypes):
out_shapes = in_shapes.copy()
out_dtypes = in_dtypes.copy()
return out_shapes, out_dtypes
def compute(self, node, inputs):
x = inputs[0]
axis = get_node_attr(node, 'axis')
x_max = np.max(x, axis=axis, keepdims=True)
tmp = np.exp(x - x_max)
s = np.sum(tmp, axis=axis, keepdims=True)
outputs = [tmp / s]
return outputs
ret = rknn.reg_custom_op(cstSoftmax)
举例如下:
ret = rknn.codegen(output_path='./rknn_app_demo',
inputs=['./mobilenet_v2/dog_224x224.jpg'],
overwrite=True)
全部0条评论
快来发表一下你的评论吧 !