瑞芯微(EASY EAI)RV1126B 模型转换API说明

描述

1. API详细说明

1.1 RKNN初始化及释放

在使用RKNN-Toolkit2的所有API接口时,都需要先调用RKNN()方法初始化RKNN对象,不再使用该对象时通过调用该对象的release()方法进行释放。

初始化RKNN对象时,可以设置verbose和verbose_file参数,以打印详细的日志信息。其中verbose参数指定是否要打印详细日志信息;如果设置了verbose_file参数,且verbose参数值为True,日志信息还将写到该参数指定的文件中。

举例如下:

# 打印详细的日志信息
rknn = RKNN(verbose=True)

…

rknn.release()

1.2 模型配置


在构建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')

1.3 模型加载


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')

1.3.2 TensorFlow模型加载接口

举例如下:

# 从当前目录加载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]])

1.3.3 TensorFlow Lite模型加载接口

瑞芯微

举例如下:

# 从当前目录加载mobilenet_v1模型
ret = rknn.load_tflite(model='./mobilenet_v1.tflite')

1.3.4 ONNX模型加载

瑞芯微

举例如下:

# 从当前目录加载arcface模型
ret = rknn.load_onnx(model='./arcface.onnx')

1.3.5 DarkNet模型加载接口

瑞芯微

举例如下:

# 从当前目录加载yolov3-tiny模型
ret = rknn.load_darknet(model='./yolov3-tiny.cfg',
               weight='./yolov3.weights')

1.3.6 PyTorch模型加载接口

瑞芯微

举例如下:

# 从当前目录加载resnet18模型
ret = rknn.load_pytorch(model='./resnet18.pt',
               input_size_list=[[1,3,224,224]])

1.4 构建RKNN模型

瑞芯微

举例如下:

# 构建RKNN模型,并且做量化
ret = rknn.build(do_quantization=True, dataset='./dataset.txt')

1.5 导出RKNN模型


通过本工具构建的RKNN模型通过该接口可以导出存储为RKNN模型文件,用于模型部署。

瑞芯微

举例如下:

# 将构建好的RKNN模型保存到当前路径的mobilenet_v1.rknn文件中
ret = rknn.export_rknn(export_path='./mobilenet_v1.rknn')

1.6 加载RKNN模型

瑞芯微

举例如下:

# 从当前路径加载mobilenet_v1.rknn模型
ret = rknn.load_rknn(path='./mobilenet_v1.rknn')

1.7 初始化运行时环境


在模型推理或性能评估之前,必须先初始化运行时环境,明确模型的运行平台(具体的目标硬件平台或软件模拟器)。

瑞芯微

举例如下:

# 初始化运行时环境
ret = rknn.init_runtime(target='rk3566')

1.8 模型推理


在进行模型推理前,必须先构建或加载一个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"

1.9 评估模型性能

瑞芯微

举例如下:

# 对模型性能进行评估
perf_detail = rknn.eval_perf()

1.10 获取内存使用情况

瑞芯微

举例如下:

# 对模型内存使用情况进行评估
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
======================================================

1.11 查询SDK版本

瑞芯微

举例如下:

# 获取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.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')

1.13 量化精度分析


该接口的功能是进行浮点、量化推理并产生每层的数据,并进行量化精度分析。

瑞芯微

举例如下:

# Accuracy analysis
ret = rknn.accuracy_analysis(inputs=['./dog_224x224.jpg'])

1.14 获取设备列表

瑞芯微

举例如下:

rknn.list_devices()

返回的设备列表信息如下:

*************************
all device(s) with adb mode:
VD46C3KM6N
*************************

注:使用多设备时,需要保证它们的连接模式都是一致的,否则会引起冲突,导致设备连接失败。

1.15 导出加密模型


该接口的功能是将普通的RKNN模型进行加密,得到加密后的模型。

瑞芯微

举例如下:

ret = rknn.export_encrypted_rknn_model('test.rknn')

1.16 注册自定义算子


该接口的功能是注册一个自定义算子。

瑞芯微

举例如下:

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)

1.17 生成C++部署示例

瑞芯微

举例如下:

ret = rknn.codegen(output_path='./rknn_app_demo',
            inputs=['./mobilenet_v2/dog_224x224.jpg'],
            overwrite=True)
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分