RKNN 工具使用-python

本文介绍了使用Python编程语言通过RKNN库进行模型转换和推理的详细步骤,包括配置模型参数、加载Caffe、TensorFlow、TensorFlowLite等不同来源的模型,构建RKNN模型,导出模型,并提供了模型精度分析、推理时间和内存评估的方法。
摘要由CSDN通过智能技术生成

python 语法

模型转换流程:

1.初始化:

rknn = RKNN(verbose=True, verbose_file='./mobilenet_build.log')

verbose 决定是否在屏幕上显示详细日志信息。

如果设置了 verbose_file 参数并且 verbose 为 True,日志信息还将写入到指定的文
件中

2.模型 Config 配置:

rknn.config(
        mean_values=[[103.94, 116.78, 123.68]],
        std_values=[[58.82, 58.82, 58.82]],
        quant_img_RGB2BGR=False,
        target_platform='rk3566')


mean_values 和 std_values 用于设置输入的均值和归一化值。这些值在量化过程中使用,
且 C API 推理阶段图片不需再做均值和归一化值减小布署耗时。

quant_img_RGB2BGR 用于控制量化时加载量化校正图像时是否需要先进行 RGB 到
BGR 的转换,默认值为 False。该配置只在量化数据集时生效,实际部署模型时,模
型推理阶段不会生效,需要用户在输入前处理里预先处理好。注:
quant_img_RGB2BGR = True 时 模 型 的 推 理 顺 序 为 先 做 RGB2BGR 转 换 再 做
mean_values 和 std_values 操作,详细注意事项请见 10.3 章节。

target_platform 用于指定 RKNN 模型的目标平台,支持 RK3568、RK3566、RK3562、
RK3588、RV1106 和 RV1103。

quantized_algorithm 用于指定计算每一层的量化参数时采用的量化算法,可以选择
normal、mmse 或 kl_divergence,默认算法为 normal,详细说明见 3.1.7、6.1 和 6.2 章
节。

quantized_method 支 持 layer 或 channel , 用 于 每 层 的 权 重 是 否 共 享 参 数 , 默 认 为
channel,详细说明见 3.1.7、6.1 和 6.2 章节。

optimization_level 通过修改模型优化等级,可以关掉部分或全部模型转换过程中使用
到的优化规则。该参数的默认值为 3,打开所有优化选项,值为 2 或 1 时关闭一部分
可能会对部分模型精度产生影响的优化选项,值为 0 时关闭所有优化选项。

quantized_dtype 用 于 指 定 量 化 类 型 , 目 前 支 持 线 性 非 对 称 量 化 的 INT8 , 默 认 为
'asymmetric_quantized-8'。

custom_string 添加自定义字符串信息到 RKNN 模型,可以在 runtime 时通过 query 查
询 RKNN_QUERY_CUSTOM_STRING 得到该信息,方便部署时根据不同的 RKNN 模
型做特殊的处理。默认值为 None。

dynamic_input 支持动态输入,根据用户指定的多组输入 shape,来模拟动态输入的功
能,默认值为 None,详细说明见 5.4 章节。

更具体的 rknn.config()接口配置请参考 API 手册,上述仅列出部分常用参数。

3.加载模型

1)Caffe 模型加载接口:

ret = rknn.load_caffe(model='./mobilenet_v2.prototxt',
blobs='./mobilenet_v2.caffemodel')

2)TensorFlow 模型加载接口:

ret = rknn.load_tensorflow(
tf_pb='./ssd_mobilenet_v1_coco_2017_11_17.pb',
inputs=['Preprocessor/sub'],
outputs=['concat', 'concat_1'],
input_size_list=[[1, 300, 300, 3]])

需要提供 TensorFlow 模型文件(.pb 后缀)路径、输入节点名、输入节点的形状
以及输出节点名。

3)TensorFlow Lite 模型加载接口:

ret = rknn.load_tflite(model='./mobilenet_v1.tflite')

4)ONNX 模型加载接口:

ret = rknn.load_onnx(model='./arcface.onnx')

5)DarkNet 模型加载接口:

ret = rknn.load_darknet(model='./yolov3-tiny.cfg',
weight='./yolov3.weights')

6)PyTorch 模型加载接口

ret = rknn.load_pytorch(model='./resnet18.pt',
input_size_list=[[1, 3, 224, 224]])

4.构建 RKNN 模型

ret = rknn.build(do_quantization=True, dataset='./dataset.txt')

5.导出 RKNN 模型

ret = rknn.export_rknn(export_path='./mobilenet_v1.rknn')

export_path 导出模型文件的路径。
cpp_gen_cfg 可以选择是否生成 C++ 部署示例。

6.模型释放

rknn.release()

模型推理

1.初始化 

ret = rknn.init_runtime(target=platform,
device_id='515e9b401c060c0b')
target:目标硬件平台。默认值为 None,推理在模拟器上进行。需要获取板端实际推
理结果时需要填入相应的平台(RK3562 / RK3566 / RK3568 / RK3588 / RV1103 / RV1106)。
device_id:设备编号。默认值为 None。若有设置 target 则选择唯一一台设备进行推理。
如果电脑连接多台设备连板推理时,需要指定填入相应的设备 ID。
perf_debug : 进 行 性 能 评 估 时 是 否 开 启 debug 模 式 。 默 认 值 为 False , 调 用
rknn.val_perf()接口可以获取模型运行的总时间。设为 True 时,可以额外获取到每一层的运
行时间,RV1103 和 RV1106 平台不支持。
eval_mem:是否进入内存评估模式。默认值为 False。设为 True 进入内存评估模式后,
可以调用 rknn.eval_memory()接口获取模型运行时的内存使用情况。


2.模型推理 

outputs = rknn.inference(inputs=[img])
inputs:待推理的输入列表,格式为 ndarray。
data_format : 输 入 数 据 的 layout 列 表 , 只 对 4 维 的 输 入 有 效 , 格 式 为 “NCHW” 或
“NHWC”。默认值为 None,表示所有输入的 layout 都为 NHWC。

3.模型评估

模型精度分析

ret = rknn.accuracy_analysis(inputs=[img_path], target=platform,
        device_id='515e9b401c060c0b')

模型推理时间分析

ret = rknn.init_runtime(target=platform, perf_debug=True)
perf_detail = rknn.eval_perf() 

perf_debug 为 true,会打印每一层的耗时结果和总的耗时结果。

模型内存评估分析

ret = rknn.init_runtime(target=platform, eval_mem=True)
memory_detail = rknn.eval_memory()

你可以使用Python和RKNN(Rockchip Neural Network)来进行车牌识别。RKNN是一个用于在Rockchip AI芯片上部署和运行深度学习模型的工具。下面是一个简单的示例代码,演示了如何使用Python和RKNN进行车牌识别: 首先,你需要安装RKNN Toolkit,可以通过以下命令安装: ``` pip install rknn-toolkit ``` 接下来,你需要准备车牌识别模型的相关文件,包括模型文件和标签文件。 然后,你可以使用以下代码加载和运行RKNN模型: ```python import cv2 import numpy as np from rknn.api import RKNN # 初始化RKNN对象 rknn = RKNN() # 加载模型 rknn.load_rknn('model.rknn') # 初始化摄像头 cap = cv2.VideoCapture(0) while True: # 读取视频帧 ret, frame = cap.read() # 调整图像大小为模型输入大小 resized_frame = cv2.resize(frame, (160, 80)) # 将图像转化为RGB格式 rgb_frame = cv2.cvtColor(resized_frame, cv2.COLOR_BGR2RGB) # 对图像进行预处理 input_data = np.expand_dims(rgb_frame, axis=0).astype(np.float32) # 设置输入张量 rknn.set_inputs([input_data]) # 运行推理 rknn.inference() # 获取输出张量 output = rknn.get_outputs()[0] # 解码输出 decoded_output = decode(output) # 在图像上绘制识别结果 cv2.putText(frame, decoded_output, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA) # 显示图像 cv2.imshow('Car Plate Recognition', frame) # 按下q键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头和窗口 cap.release() cv2.destroyAllWindows() ``` 上述代码中,你需要替换`model.rknn`为你的模型文件路径。代码中还涉及到预处理、解码和绘制识别结果的函数,你需要根据你的具体模型进行相应的实现。 希望这个例子能帮到你开始进行车牌识别任务。如果你有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值