rknn手册
最主要参考文档官方文档:9. YOLOv8 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档
文件介绍
rknn-toolkit2:一般用于在pc端布置环境进行模型转换
rknn_toolkit_lite2:一般为版端推理环境
rknpu2:一般用于驱动更新
rknn_model_zoo: 一般用于ultralytics_yolov8导出的模型转rknn
ultralytics_yolov8: yolov8 :用于导出pt模型为script模型,有对rknn的适配,这里使用rk_opt_v1 分支
rk3588环境部署
1 驱动更新:
驱动讲解:
rknn driver:npu驱动 更新涉及内核
rknpu2:
librknnrt.so :Rockchip NPU 的运行时库,主要用于直接加载并执行经过 RKNN Toolkit 转换的模型。它提供了 NPU 推理所需的底层实现,可以在 NPU 硬件上高效地进行推理。
librknn_api.so:librknn_api.so
是 Rockchip 提供的高级接口库,通过这个库可以更方便地调用 librknnrt.so
的功能(没用到)
rknn_server
是 Rockchip 提供的一种推理服务,用于在支持 NPU 的设备(如 RK3399Pro、RK1808、RK3568、RK3588 等)上运行深度学习模型推理任务。它的主要用途是将 NPU 推理能力封装成网络服务,以便在设备上通过网络接口远程调用 NPU 推理功能。(没用到)
rknn driver驱动升级参考:(非必要不升级) https://blog.csdn.net/weixin_74253011/article/details/141058714 #下载最新的 rknpu2 #失败复制文件进去(rknn-toolkit2-master里面也有) git clone https://github.com/rockchip-linux/rknpu2 #环境:用于rknn识别 sudo cp rknpu2/runtime/Linux/librknn_api/aarch64/librknnrt.so /usr/lib/librknnrt.so
2,rknn python环境配置
配置python运行环境 创建一个python=3.10的环境。
conda create -n rknn python=3.10
在rknn-toolkit-lite2/packages文件下安装rknn_toolkit_lite2-2.2.0包。
pip install rknn_toolkit_lite2-2.2.0-cp310-cp310-linux_aarch64.whl(在yolo推理文件夹内)
创建其他python版本的环境也可,但需要安装对应版本的rknn_toolkit_lite2-2.2.0包。 接着安装opencv。(配置清华源)
pip install opencv_contrib_python
3.模型路径 及class配置
func.py 中 更改为对应的CLASSES
main.py 更改模型路径
模型转换(在ubuntu pc上 进行环境部署与模型转换)
1 环境部署
部署python3.8的虚拟环境:参考 【保姆级教程】从Yolov8训练模型到转化Onnx再转换为Rknn以及板端部署全记录_yolov8 rknn转换-CSDN博客
conda create -n rknn python=3.8
git clone GitHub - airockchip/rknn-toolkit2 (rknn-toolkit2)
将准备好的rknn-toolkit2-master文件,放在目录下。并进入到rknn-toolkit2-master/rknn-toolkit2/packages文件夹下。首先先安装所用到的依赖包,在终端输入
pip install -r requirements_cp38-2.2.0.txt
接着安装rknn-toolkit2
pip install rknn_toolkit2-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
2导出script模型
用的是rk_opt_v1分支, 该分支将导出torchscript模型,如果使用main分支默认导出onnx模型,模型转换成rknn时注意修改下加载模型函数。
# 拉取airockchip/ultralytics_yolov8,rk_opt_v1分支 git clone -b rk_opt_v1 https://github.com/airockchip/ultralytics_yolov8.git cd ultralytics_yolov8 # 复制训练的模型 yolov8n.pt 到 ultralytics_yolov8 目录下 # 然后修改./ultralytics/cfg/default.yaml文件,主要是设置下model,为自己训练的模型路径:(model 更改为自己的模型路径) model: ./yolov8n.pt # (str, optional) path to model file, i.e. yolov8n.pt, yolov8n.yaml data: # (str, optional) path to data file, i.e. coco128.yaml epochs: 100 # (int) number of epochs to train for # 导出模型 (yolov8) llh@anhao:~/ultralytics_yolov8$ export PYTHONPATH=./ (yolov8) llh@anhao:~/ultralytics_yolov8$ python ./ultralytics/engine/exporter.py
导出的模型,保存在当前目录下的yolov8n_rknnopt.torchscript。
3 转换rknn
dtype 的意义见末尾
pt2rknn.py代码:
import sys from rknn.api import RKNN DATASET_PATH = '/home/ubuntu/3588_pt2rknn_yolov8/onnx2rknn/rknn_model_zoo-2.2.0/datasets/COCO/coco_subset_20.txt' #不用管 验证改false就行 DEFAULT_RKNN_PATH = './model/now1.rknn' #模型输出的路径 DEFAULT_QUANT = False #应该是用来验证的开关 def parse_arg(): if len(sys.argv) < 3: print("Usage: python3 {} onnx_model_path [platform] [dtype(optional)] [output_rknn_path(optional)]".format(sys.argv[0])); print(" platform choose from [rk3562,rk3566,rk3568,rk3576,rk3588,rk1808,rv1109,rv1126]") print(" dtype choose from [i8, fp] for [rk3562,rk3566,rk3568,rk3576,rk3588]") print(" dtype choose from [u8, fp] for [rk1808,rv1109,rv1126]") exit(1) model_path = sys.argv[1] platform = sys.argv[2] do_quant = DEFAULT_QUANT if len(sys.argv) > 3: model_type = sys.argv[3] if model_type not in ['i8', 'u8', 'fp']: print("ERROR: Invalid model type: {}".format(model_type)) exit(1) elif model_type in ['i8', 'u8']: do_quant = True else: do_quant = False if len(sys.argv) > 4: output_path = sys.argv[4] else: output_path = DEFAULT_RKNN_PATH return model_path, platform, do_quant, output_path if __name__ == '__main__': model_path, platform, do_quant, output_path = parse_arg() # Create RKNN object rknn = RKNN(verbose=False) # Pre-process config print('--> Config model') rknn.config(mean_values=[[0, 0, 0]], std_values=[ [255, 255, 255]], target_platform=platform) print('done') # 加载Pytorch模型,如果是使用airockchip/ultralytics_yolov8的main分支,将导入onnx模型 print('--> Loading model') #ret = rknn.load_onnx(model=model_path) ret = rknn.load_pytorch(model=model_path, input_size_list=[[1, 3, 640, 640]]) if ret != 0: print('Load model failed!') exit(ret) print('done') # Build model print('--> Building model') ret = rknn.build(do_quantization=do_quant, dataset=DATASET_PATH) if ret != 0: print('Build model failed!') exit(ret) print('done') # Export rknn model print('--> Export rknn model') ret = rknn.export_rknn(output_path) if ret != 0: print('Export rknn model failed!') exit(ret) print('done') # 精度分析,,输出目录./snapshot #print('--> Accuracy analysis') #ret = rknn.accuracy_analysis(inputs=['./subset/000000052891.jpg']) #if ret != 0: # print('Accuracy analysis failed!') # exit(ret) #print('done') # Release rknn.release()
将之前导出的模型 .torchscript 重命名为 .pt
运行该程序 输入命令
ubuntu@zaj:~/pt2rknn_2$ python pt2rknn.py rgb_best_rknnopt.pt rk3588 fp #或者 总之根据参数需要 python pt2rknn.py rgb_best_rknnopt.pt rk3588
注意:
dtype 是什么 不同有什么影响:
dtype
(数据类型)在模型转换过程中用于指定模型中张量(tensor)数据的数值类型,对模型的存储、精度和性能有重要影响。不同的数据类型主要有以下几种:
-
i8
(int8,8位整数):-
使用8位带符号整数表示数据。
-
主要用于 量化,可以显著减少模型大小和内存占用,同时提升处理速度,尤其是在硬件支持的情况下。
-
通常会造成 一定精度损失,因为从32位浮点数到8位整数的转换会丢失细微的数值信息。
-
常用于边缘设备或嵌入式设备(如 RK3568、RK3588 等),这些设备通常要求模型小、速度快且内存占用低。
-
-
u8
(uint8,8位无符号整数):-
与
i8
类似,但表示的是无符号整数。 -
适用于不需要负值的模型,适合 RK1808 等支持无符号量化的设备。
-
也会带来一定的精度损失,但可以极大地提高推理效率。
-
-
fp
(float32,32位浮点数):-
即单精度浮点数,精度较高,更适合对数值精度要求较高的任务。
-
不做量化,模型精度保持较好,但模型的大小、计算和内存需求较大。
-
主要用于性能没有特别限制的环境,或在进行模型调试和开发时确保更高的精度。
-
数据类型的影响
-
性能:8位整数(
i8
和u8
)在内存占用和计算速度上优于32位浮点数。对于大模型或对实时性能要求高的应用,量化至i8
或u8
通常可以提高推理速度。 -
精度:
fp
类型保留了原始模型的精度,但i8
或u8
量化则可能导致模型精度略微下降,尤其在细微数值差异有影响的任务中(例如图像分类、语音识别等)。 -
存储和内存占用:
i8
和u8
量化能显著减少模型的大小和内存占用,更适合资源有限的设备。