目录
一、前言
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 脚本。
由上图结果可以看出,图上有四个人和一个巴士,所在坐标与原图相符,推理图片成功。推理图片如下所示:
原图如下图所示: