rv1109/1126 rknn 模型部署过程

这篇具有很好参考价值的文章主要介绍了rv1109/1126 rknn 模型部署过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

rv1109/1126是瑞芯微出的嵌入式AI芯片,带有npu, 可以用于嵌入式人工智能应用。算法工程师训练出的算法要部署到芯片上,需要经过模型转换和量化,下面记录一下整个过程。

量化环境

模型量化需要安装rk的工具包:
rockchip-linux/rknn-toolkit (github.com)
版本要根据开发板的固件支持程度来,如果二者不匹配,可能转出来的模型无法运行或者结果不对。

模型量化

rknn支持caffe,tensorflow,tflite,onnx,mxnet,pytorch等模型量化,下面以onnx为例,其他格式基本类似。即可以使用量化包带的可视化界面,也可以自行写代码,更推荐自己写代码,复用性和灵活性更强,对可视化界面一笔带过。

可视化量化工具

执行

python -m rknn.bin.visualization

rv1109/1126 rknn 模型部署过程,开发工具,人工智能,深度学习,python,目标检测

选择对应格式,然后设置模型参数进行量化。
rv1109/1126 rknn 模型部署过程,开发工具,人工智能,深度学习,python,目标检测

写代码量化

rv1109/1126 rknn 模型部署过程,开发工具,人工智能,深度学习,python,目标检测

基础量化

最简单的量化方式如下,只需设置模型的均值、方差,载入原始模型,调用rknn.build接口,然后export_rknn即可。

from rknn.api import RKNN

if __name__ == '__main__':
	rknn=RKNN()
	# pre-process config
	print('--> config model')
	rknn.config(channel_mean_value='0 0 0 255',
				reorder_channel='0 1 2',
				target_platform=['rv1109'],
				#quantized_dtype="dynamic_fixed_point-i16"
				)
	print('done')

	# Load mxnet model
	onnx_model = 'yolov8n.onnx'
	print('--> Loading model')
	ret = rknn.load_onnx(onnx_model)
	if ret != 0:
		print('Load onnx_model model failed!')
		exit(ret)
	print('done')
	# Build model
	print('--> Building model')
	ret = rknn.build(do_quantization=True, dataset='../coco_resize.txt', pre_compile=False) # 若要在PC端仿真,pre_compile 为False
	if ret != 0:
		print('Build model failed!')
		exit(ret)
	print('done')

	print('--> Export RKNN model')
	ret = rknn.export_rknn('yolov8n_nohead.rknn')
	if ret != 0:
		print('Export RKNN model failed!')
		exit(ret)
	print('done')
	rknn.release()

模型量化需要提供量化图片的列表,格式为每行是一张图片的路径, 一般需要几百张,如:

images/0.jpg
images/1.jpg

模型推理验证

有两种方式验证模型的结果,一种是连接开发板,在开发板上运行,可以实际测试模型的推理速度,需要USB连接开发板,一种是在PC端仿真,速度较慢,适合在没有开发板的情况下,验证模型结果是否正确。两种方式使用的代码大部分一样,区别是在PC端仿真时,模型要以pre_compile=False模式进行量化,init_runtime参数为targe=None。

import os
import sys
from rknn.api import RKNN
import cv2
import numpy as np
 
if __name__=="__main__":
    # Create RKNN object
    rknn = RKNN()
    print('--> Loading RKNN model')
    ret = rknn.load_rknn('yolov8.rknn')
    if ret != 0:
        print('Load  failed!')
        exit(ret)
    print('load done')
    # Init Runtime
    rknn.init_runtime(target="rv1109")#第二个参数device_id为开发板的设备id,不用填, targe=None时,代表PC仿真
	 image = cv2.imread("1.jpg")
	 outputs = rknn.inference(inputs=[image]) 
    rknn.release()

量化精度评估(逐层)

有些时候,量化损失可能过大,这时我们希望能够逐层比对量化后模型与原始模型,这时需要使用accuracy_analysis接口,这个接口第一个参数是图片列表文件,里面是测试图片的路径,第二个参数是比对结果保存路径:

from rknn.api import RKNN

if __name__ == '__main__':
	rknn=RKNN()
	# pre-process config
	print('--> config model')
	rknn.config(channel_mean_value='0 0 0 255',
				reorder_channel='0 1 2',
				target_platform=['rv1109'],
				#quantized_dtype="dynamic_fixed_point-i16"
				)
	print('done')

	# Load mxnet model
	onnx_model = 'yolov8n.onnx'
	print('--> Loading model')
	ret = rknn.load_onnx(onnx_model)
	if ret != 0:
		print('Load onnx_model model failed!')
		exit(ret)
	print('done')
	# Build model
	print('--> Building model')
	ret = rknn.build(do_quantization=True, dataset='../coco_resize.txt', pre_compile=False) # 若要在PC端仿真,pre_compile 为False
	if ret != 0:
		print('Build model failed!')
		exit(ret)
	print('done')
	rknn.accuracy_analysis("test_list.txt", output_dir='./snapshot5')			               
	print('--> Export RKNN model')
	ret = rknn.export_rknn('yolov8n_nohead.rknn')
	if ret != 0:
		print('Export RKNN model failed!')
		exit(ret)
	print('done')
	rknn.release()

比对文件如下:

Conv__model.0_conv_Conv_214_out0_nhwc_1_320_320_16.tensor    	eculidean_norm=0.030792	cosine_norm=0.999525	eculidean=202.926056	cosine=0.999526
Sigmoid__model.0_act_Sigmoid_213_Mul__model.0_act_Mul_212_out0_nhwc_1_320_320_16.tensor 	eculidean_norm=0.049676	cosine_norm=0.998766	eculidean=178.751434	cosine=0.998767
Conv__model.1_conv_Conv_210_out0_nhwc_1_160_160_32.tensor    	eculidean_norm=0.103382	cosine_norm=0.994656	eculidean=521.709229	cosine=0.994656
Sigmoid__model.1_act_Sigmoid_211_Mul__model.1_act_Mul_209_out0_nhwc_1_160_160_32.tensor 	eculidean_norm=0.113702	cosine_norm=0.993536	eculidean=436.044495	cosine=0.993536
Conv__model.2_cv1_conv_Conv_208_out0_nhwc_1_160_160_32.tensor 	eculidean_norm=0.120058	cosine_norm=0.992793	eculidean=351.808380	cosine=0.992794
Sigmoid__model.2_cv1_act_Sigmoid_207_Mul__model.2_cv1_act_Mul_205_out0_nhwc_1_160_160_32.tensor 	eculidean_norm=0.169184	cosine_norm=0.985688	eculidean=262.819550	cosine=0.985688

混合量化

有些时候,使用默认量化方法模型精度损失较大,我们通过逐层分析,也知道了那些层的损失较大,这时就需要控制一些层不量化,或以更高精度模式量化,这种方式就是混合量化。
与基础量化相比,混合量化分为两步:
第一步是通过rknn.hybrid_quantization_step1(替换基础量化中的rknn.build)获得模型的量化配置文件:

rknn.hybrid_quantization_step1(dataset='../coco_resize.txt')

该接口会生成3个文件:

xx.data
xx.json
xx.quantization.cfg

其中,.cfg文件时量化配置文件,用于控制每一层的量化:

%YAML 1.2
---
# add layer name and corresponding quantized_dtype to customized_quantize_layers, e.g conv2_3: float32
customized_quantize_layers: {}
quantize_parameters:
    '@attach_Concat_/model.22/Concat_5/out0_0:out0':
        dtype: asymmetric_affine
        method: layer
        max_value:
        -   647.7965087890625
        min_value:
        -   0.0
        zero_point:
        -   0
        scale:
        -   2.5403785705566406
        qtype: u8
    '@Concat_/model.22/Concat_5_1:out0':
        dtype: asymmetric_affine
        method: layer
        max_value:
        -   647.7965087890625
        min_value:
        -   0.0
        zero_point:
        -   0
        scale:
        -   2.5403785705566406
        qtype: u8

对于不量化或者以其他精度模式量化的层,以字典形式写在customized_quantize_layers中,rv1109支持asymmetric_quantized-u8,dynamic_fixed_point-i8和dynamic_fixed_point-i16,默认情况下,以asymmetric_quantized-u8方式量化,在需要更高精度时,可用dynamic_fixed_point-i16,但速度会更慢。对于损失较大的层,我们可以尝试设置dynamic_fixed_point-i16量化(若float32则不量化):

customized_quantize_layers: {
    "Split_/model.22/Split_21": "dynamic_fixed_point-i16",
    "Reshape_/model.22/dfl/Reshape_20": "float32"
}

设置完成量化配置后,使用rknn.hybrid_quantization_step2进行量化:文章来源地址https://www.toymoban.com/news/detail-623838.html

from rknn.api import RKNN

if __name__ == '__main__':
	rknn=RKNN()
	# pre-process config
	print('--> config model')
	rknn.config(channel_mean_value='0 0 0 255',
				reorder_channel='0 1 2',
				target_platform=['rv1109'],
				#quantized_dtype="dynamic_fixed_point-i16"
				)
	print('done')

	# Load mxnet model
	onnx_model = 'yolov8n.onnx'
	print('--> Loading model')
	ret = rknn.load_onnx(onnx_model)
	if ret != 0:
		print('Load onnx_model model failed!')
		exit(ret)
	print('done')
	# Build model
	print('--> Building model')

	rknn.hybrid_quantization_step2(dataset='../coco_resize.txt',   model_input='torch_jit.json',
								   data_input="torch_jit.data",
								   model_quantization_cfg="torch_jit.quantization.cfg",
								   pre_compile=False)
	if ret != 0:
		print('Build model failed!')
		exit(ret)
	print('done')
	rknn.accuracy_analysis("test_list.txt", output_dir='./snapshot5')			               
	print('--> Export RKNN model')
	ret = rknn.export_rknn('yolov8n_nohead.rknn')
	if ret != 0:
		print('Export RKNN model failed!')
		exit(ret)
	print('done')
	rknn.release()

到了这里,关于rv1109/1126 rknn 模型部署过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • rv1126移植并部署自写手写数字识别模型

    --rknn_toolkit以及rknpu环境搭建-rv1126-CSDN博客 MNIST-https://github.com/warren-wzw/MNIST-pytorch.git 1:进入docker docker run -t -i --privileged -v /dev/bus/usb:/de/bus/usb   -v /home/wzw/rk_npu_sdk/rknn-toolkit-master-v1.7.3:/rknn_toolkit rknn-toolkit:1.7.3 /bin/bash 2:进入/rknn_toolkit/examples/onnx,复制一个resnet50v2并命名为MNI

    2024年02月14日
    浏览(38)
  • yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程

    目录 一、任务介绍 二、实验过程 2.1 使用正确版本的yolov5进行训练(平台:x86机器windows系统) 2.2 best.pt转换为best.onnx(平台:x86机器window系统) 2.3 best.onnx转换为best.rknn(平台:x86机器Linux系统) 2.3.1 环境准备和工具包安装 2.3.2 onnx转换为rknn 2.4 RK3588部署rknn实现NPU加速(平台:

    2024年02月03日
    浏览(48)
  • RV1109 人脸识别开发

    本文档主要介绍了在基于RV1109/RV1126 SOC芯上的人脸识别开发实现的架构设计,开发实现过程,主要用的方式方法!这里主要介绍RV1109上使用SDK里的RKMEDIA里的接口应用加以说明! 介绍如何使用RKMEDIA中的VI,RGA,如何通过DRM来显示视频内容! 视频接入 RV1109有支持4 LINE的MIPI CSI输入能力

    2024年02月03日
    浏览(36)
  • RV1126 音频开发(1)

    音频输入属性结构体 pcAudioNode//音频设备节点路径 enSampleFormat 采样格式 不以P为结尾的都是interleaved结构,以P为结尾的是planar结构 Planar模式是FFmpeg内部存储模式,我们实际使用的音频文件都是Packed模式的。 AAC解码输出的数据为浮点型的 RK_SAMPLE_FMT_FLTP格式 MP3解码输出的数据为

    2024年02月03日
    浏览(38)
  • Linphone3.5.2 ARM RV1109音视频对讲开发记录

    说明 这是一份事后记录,主要记录的几个核心关键点,有可能很多细节没有记上,主要是方便后面自己再找回来! 版本 3.5.2 一些原因选的是这样一个旧的版本! 新的开发最好选新一些的版本吧, 像 4.5, 4.2, 3.8 这一类的! 因为之前没有开发过Linphone的应用,所以对整个框架不了

    2024年02月07日
    浏览(33)
  • 【正点原子Linux连载】第三章 RV1126开发环境搭建 摘自【正点原子】ATK-DLRV1126系统开发手册

    1)实验平台:正点原子RV1126 Linux开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692176265749 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html 3.1 rv1126的环境配置 在上章节里面我们已经安装好Ubuntu,此时的Ubuntu还是不能做开发的,因为还有很多环

    2024年02月04日
    浏览(52)
  • 模型部署——rknn-toolkit-lite2部署RKNN模型到开发板上(python版)

    欢迎学习RKNN系列相关文章,从模型转换、精度分析,评估到部署,推荐好资源: 一、Ubuntu系统上安装rknn-toolkit 二、使用rknn-toolkit将Pytorch模型转为RKNN模型 三、RKNN模型的评估和推理测试 四、RKNN模型量化精度分析及混合量化提高精度 五、RKNN模型性能评估和内存评估 六、rkn

    2024年04月11日
    浏览(46)
  • CMake rv1109交叉编译环境搭建

    准备安装包VMware-workstation-full-15.5.1-15018445.exe 下载地址 安装 参考资料 准备安装包ubuntu-18.04.4-desktop-amd64.iso 下载地址 安装 参考资料 准备安装包rv1109_toolchain_release.tar.bz2 下载地址 解压安装包rv1109_toolchain_release.tar.bz2 运行安装包脚本安装 配置环境变量~/.bashrc 安装结果检查 如下

    2024年02月10日
    浏览(38)
  • 【RV1126】移植LVGL

    RV1126文件系统下面没有 /dev/fb0 设备节点: 进入kernel 进入配置: 修改位置一,如下: 修改位置二,如下: 之后重新编译生成固件烧写到开发板。 地址:https://github.com/lvgl/lv_port_linux_frame_buffer git克隆地址:https://github.com/lvgl/lv_port_linux_frame_buffer.git 官方文档:https://blog.lvgl.i

    2024年02月07日
    浏览(49)
  • LVGL - RV1109 LVGL UI刷新效率优化-02

    前面好早写过一个文章,说明如何把LVGL移到RV1109上的操作,使用DRM方式!但出现刷新效率不高的问题! 因为一直没有真正的应用在产品中,所以也就放下了! 最近开发上需要考虑低成本,低内存的方案,所以后续考虑使用LVGL上来做UI,所以这里捡回来再炒一次! 这里还是使

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包