yolov8模型在rk3588的环境部署(详细版)

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)数据的数值类型,对模型的存储、精度和性能有重要影响。不同的数据类型主要有以下几种:

  1. i8(int8,8位整数):

    • 使用8位带符号整数表示数据。

    • 主要用于 量化,可以显著减少模型大小和内存占用,同时提升处理速度,尤其是在硬件支持的情况下。

    • 通常会造成 一定精度损失,因为从32位浮点数到8位整数的转换会丢失细微的数值信息。

    • 常用于边缘设备或嵌入式设备(如 RK3568、RK3588 等),这些设备通常要求模型小、速度快且内存占用低。

  2. u8(uint8,8位无符号整数):

    • i8 类似,但表示的是无符号整数。

    • 适用于不需要负值的模型,适合 RK1808 等支持无符号量化的设备。

    • 也会带来一定的精度损失,但可以极大地提高推理效率。

  3. fp(float32,32位浮点数):

    • 即单精度浮点数,精度较高,更适合对数值精度要求较高的任务。

    • 不做量化,模型精度保持较好,但模型的大小、计算和内存需求较大。

    • 主要用于性能没有特别限制的环境,或在进行模型调试和开发时确保更高的精度。

数据类型的影响

  • 性能:8位整数(i8u8)在内存占用和计算速度上优于32位浮点数。对于大模型或对实时性能要求高的应用,量化至 i8u8 通常可以提高推理速度。

  • 精度fp 类型保留了原始模型的精度,但 i8u8 量化则可能导致模型精度略微下降,尤其在细微数值差异有影响的任务中(例如图像分类、语音识别等)。

  • 存储和内存占用i8u8 量化能显著减少模型的大小和内存占用,更适合资源有限的设备。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值