AI嵌入式开发 ---- pt模型文件 -> ONNX模型 -> rknn模型 -> 部署到RK3588开发板上(以yolov5为例)

目录

一、前言

1.1 任务

1.2 开发板下跑预训练模型流程

二、pt 文件转换为 onnx 或 TorchScript 文件(平台:x86机器Windows系统)

二、将 .onnx 模型文件转换为 .rknn 模型文件【平台:x86上的 Linux虚拟系统】

三、在 Linux虚拟系统上仿真运行示例

四、RK3588部署 .rknn 模型实现NPU加速(连板调试)【平台:x86 windows PC linux虚拟系统(版本为Ubuntu 20.04)、RK3588开发板上为安卓系统】

一、前言

1.1 任务

1.将pt模型使用yolov5工程中的 export.py 转换为 onnx 模型;

2.将 onnx 模型使用 rknn-toolkit2 中 onnx 文件夹的 test.py 转换为 rknn 模型;

3.在板子上部署 rknn 模型,实现 NPU 推理加速。


1.2 开发板下跑预训练模型流程


1. 需要修改yolo.py文件:
2. 将yolov5s.pt通过export.py文件导出为yolov5s.onnx文件或者yolov5s.torchscript文件
3. 通过 rknn-toolkit2 工具将 yolov5s.onnx 文件或者yolov5s.torchscript文件转化为.rknn文件
4. 部署到 RK3588 开发板上
 

二、pt 文件转换为 onnx 或 TorchScript 文件(平台:x86机器Windows系统)

可参考: TFLite, ONNX, CoreML, TensorRT Export · Issue #251 · ultralytics/yolov5 · GitHub

      将 pt 模型转换为onnx或者TorchScript 时,需要修改 models/yolo.py 文件,将class Detect(nn.Module) 类的子函数 forward 由:

修改为:

 注意:在训练时不要修改 yolo.py 的这段代码,训练完成后使用 export.py 进行模型导出转换时一定要进行修改,不然会导致后面的rknn模型转换失败! 
修改后将best.pt移动至export.py同一文件夹下,在命令行调用以下命令:

python export.py --weights best.pt --img 640 --batch 1 --include onnx

命令格式为:

python export.py[注意该文件的位置所在] --weights xxx.pt[要转换的.pt文件] --img 640[模型输入图片尺寸] --batch 1[一般设置为1] --include onnx[转换成的文件格式]

转换为TorchScript 格式,得到best.torchscript 文件,如下所示:

python export.py --weights best.pt --img 640 --batch 1 --include torchscript

 我们便可以得到成功转换的模型best.onnx 或者 best.torchscript

我们实际演示一下:
我们从 yolo 官网下载 yolov5-6.0工程,在下载的过程中,我们直接下载了一个训练好的模型文件,将这个模型文件放置在export.py文件所在位置中,如下图所示:

在 Terminal 中输入指令:

随后点击回车,得到:


到此,我们已经将 .pt 文件成功转换为 .onnx 文件。
同样的方式,我们也可将 .pt 文件转换为 .torchscript 文件。如下图所示:


注意,在执行指令前,请确保你的电脑中已经安装了 onnx,若没有安装,请根据指令 pip install onnx 进行安装。
我们可以使用netron【https://netron.app】软件来查看导出的模型。

二、将 .onnx 模型文件转换为 .rknn 模型文件【平台:x86上的 Linux虚拟系统】

模型转换流程如下图所示: 

有了以上的best.onnx模型作为基础,现在可以正式开始rknn模型的转换了。此处的转换工具 rknn-toolkit2 只能在Linux系统上运行,这里我使用的是Windows PC上的Ubuntu虚拟机
配置rknn-toolkit2环境步骤如下所示【以下步骤均在linux系统中完成】:
1、安装miniconda;
2、创建RKNN虚拟环境;
3、安装及配置pycharm。
详细请参考博主的另一篇博文:【后续更新!
转换代码如下所示:

from rknn.api import RKNN
import os

if __name__ == '__main__':

    platform = 'rk3588'
    exp = 'yolov5s'
    Width = 640
    Height = 640
    MODEL_PATH = './onnx_models/yolov5s_rm_transpose.onnx'
    NEED_BUILD_MODEL = True

    # Create RKNN object
    rknn = RKNN()

    OUT_DIR = "rknn_models"
    RKNN_MODEL_PATH = './{}/{}_rm_transpose.rknn'.format(OUT_DIR,exp+'-'+str(Width)+'-'+str(Height))
    if NEED_BUILD_MODEL:
        DATASET = './dataset.txt'
        rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform="rk3588")
        # Load model
        print('--> Loading model')
        ret = rknn.load_onnx(MODEL_PATH)
        if ret != 0:
            print('load model failed!')
            exit(ret)
        print('done')

        # Build model
        print('--> Building model')
        ret = rknn.build(do_quantization=True, dataset=DATASET)
        if ret != 0:
            print('build model failed.')
            exit(ret)
        print('done')

        # Export rknn model
        if not os.path.exists(OUT_DIR):
            os.mkdir(OUT_DIR)
        print('--> Export RKNN model: {}'.format(RKNN_MODEL_PATH))
        ret = rknn.export_rknn(RKNN_MODEL_PATH)
        if ret != 0:
            print('Export rknn model failed.')
            exit(ret)
        print('done')
    else:
        ret = rknn.load_rknn(RKNN_MODEL_PATH)

    rknn.release()

在运行转换代码之前,必须要将rknn-toolkit2配置好。 运行上述代码,得到:


至此,我们完成了从 .onnx 到 .rknn 的转换工作。

三、在 Linux虚拟系统上仿真运行示例

RKNN-Toolkit2 自带了一个模拟器,可以用来仿真模型在 npu 上运行时的行为。就相当于Android Studio自带模拟器一样。那么真机就相当于开发板。

这里我以 yolov5 为例。examples中的yolov5是一个 onnx 模型,用于目标检测,它是在模拟器上运行的。

可以看到程序中执行的主要操作有:创建 RKNN 对象;模型配置;加载 onnx 模型;构建 RKNN 模型;导出 RKNN 模型;加载图片并推理,得到推理结果;释放 RKNN 对象。运行test.py,得到:


运行结果:

四、RK3588部署 .rknn 模型实现NPU加速(连板调试)【平台:x86 windows PC linux虚拟系统(版本为Ubuntu 20.04)、RK3588开发板上为安卓系统】

 1 首先连接好开发板硬件,连接好烧写线,屏幕,调试串口和电源。开发板烧写 Android12 系 统。在本小节中,作者使用的开发环境是 Ubuntu20.04。
2 开发板系统启动之后,在Windows平台上的linux虚拟系统中提示如下,我们将开发板连接到 Ubuntu20.04 上。

点击确定后即连接成功,连接成功示意图如下图所示,我们会在 linux 虚拟系统任务栏中看到一个手机的标识。

 如果没有这个提示,这说明开发板上面的USB设置没有设置好,请根据以下步骤进行设置。如果有这个提示,块引用部分可忽略不看。
 rk3588开发板USB设置
第一步:在屏幕上打开 “设置” ,如下图所示:

第二步:滑到最底端,点击“关于平板电脑”,如下图所示:

第三步:滑到最底部,找到版本号,连续点击版本号7次,便进入了开发者模式。如下图所示:

第四步:返回,点击 “系统”,如下图所示:

第五步:点击“开发者选项”,如下图所示:

第六步:然后打开USB调试,如下图所示:

第七步:设置默认USB配置,点击“USB默认配置”,选择“文件传输模式”,如下图所示:

该部分内容参考自:Android12 系统开发记录-迅为RK3588使用ADB工具


3 在 ubuntu20.04 上使用 adb 命令来连接开发板。如果没有安装 adb 命令,可以使用命令“apt install adb”安装。

 
adb命令的安装

安装好之后,输入命令 adb devices 查看 iTOP-RK3588 开发板。

4 如上图所示,iTOP-rk3588 开发板设备 id 号为“d762f22e1d14ddc5”,说明设备已经成功通过 adb 工具连接到开发板。
5 打开一个终端命令窗口,进入 RKNPU2 工程目录,如下所示: cd rknpu

6 adb 获得开发板 root 权限,输入以下命令: adb root

7 重新挂载开发板,输入以下命令: adb remount

根据上图提示,重新启动设备【rk3588开发板】使得设置起作用。重启后再次输入 adb remount指令,得到 :

8 更新板子的 rknn_server 和 librknnrt.so,rknn_server 和 librknnrt.so 介绍如下所示:

librknnrt.so: 是一个板端的 runtime 库。
rknn_server: 是一个运行在板子上的后台代理服务,用于接收 PC 通过 USB 传输过来的协议, 然后执行板端 runtime 对应的接口,并返回结果给 PC。


9 推送拷贝 rknn_server 到开发板,输入以下命令: adb push runtime/RK3588/Android/rknn_server/arm64/rknn_server /vendor/bin/

10 推送拷贝 librknnrt.so 到开发板,输入以下命令:
adb push runtime/RK3588/Android/librknn_api/arm64-v8a/librknnrt.so /vendor/lib64

11 打开 adb shell 命令行,即可操作 iTOP-rk3588 开发板。

12 修改 rknn_server 权限,并同步修改的内容[sync指令],输入以下命令: chmod +x /vendor/bin/rknn_server

13 重启设备【rk3588开发板】,输入以下命令: reboot

14 Android 系统启动时会自动运行 rknn_server, "ps -ef|grep rknn_server"可以查看是否运行,如下 图所示:

15 我们进入 rknn-toolkit2-master 文件夹。以 demo(onnx/yolov5)为例,使用 rk3588 平台进行推 理。输入以下命令进入 examples/onnx/yolov5 文件夹。

16 修改 examples/onnx/yolov5/test.py 文件,我们修改对应的平台为 rk3588,修改如下所示,“-” 代表需要删除的内容,“+”代表需要新增的内容


修改完,保存文件并退出。
17 使用““ conda activate rknn”激活相应的 rknn 环境

18 在运行模型之前,首先检查开发板是否被识别到,输入 adb devices,如下图所示: adb devices

19 进入到 examples/onnx/yolov5 文件夹,输入命令 python test.py ,执行模型转换和推理模型的 test.py 脚本。


由上图结果可以看出,图上有四个人和一个巴士,所在坐标与原图相符,推理图片成功。推理图片如下所示:

原图如下图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值