yolov5训练并生成rknn模型部署在RK3588开发板上,实现NPU加速推理

简介

RK3588是瑞芯微(Rockchip)公司推出的一款高性能、低功耗的集成电路芯片。它采用了先进的28纳米工艺技术,并配备了八核心的ARM Cortex-A76和Cortex-A55处理器,以及ARM Mali-G76 GPU。该芯片支持多种接口和功能,适用于广泛的应用领域。

本篇为yolov5部署在RK3588的教程。

一、yolov5训练数据

请选择v5.0版本:Releases · ultralytics/yolov5 (github.com)

训练方法请按照官方的READEME文件进行。

转换前将model/yolo.py的 Detect 类下的

python 复制代码
    def forward(self, x):
        z = []  # inference output
        for i in range(self.nl):
            if os.getenv('RKNN_model_hack', '0') != '0':
                z.append(torch.sigmoid(self.m[i](x[i])))
                continue
            x[i] = self.m[i](x[i])  # conv
            bs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
            x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()

            if not self.training:  # inference
                if self.onnx_dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]:
                    self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)

                y = x[i].sigmoid()
                if self.inplace:
                    y[..., 0:2] = (y[..., 0:2] * 2 + self.grid[i]) * self.stride[i]  # xy
                    y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
                else:  # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953
                    xy, wh, conf = y.split((2, 2, self.nc + 1), 4)  # y.tensor_split((2, 4, 5), 4)  # torch 1.8.0
                    xy = (xy * 2 + self.grid[i]) * self.stride[i]  # xy
                    wh = (wh * 2) ** 2 * self.anchor_grid[i]  # wh
                    y = torch.cat((xy, wh, conf), 4)
                z.append(y.view(bs, -1, self.no))
        if os.getenv('RKNN_model_hack', '0') != '0':
            return z
        return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x)

修改为:

python 复制代码
    def forward(self, x):
        z = []
        for i in range(self.nl):
            x[i] = self.m[i](x[i])

        return x

但在训练阶段请勿修改。

接着将训练好的best.pt放在工程文件夹下,使用yolov5工程中的export.py将其转换为onnx模型

python 复制代码
python export.py --weights best.pt

二、下载RKNN-Toolkit2

1、下面的请在 Ubuntu下进行,创建一个Python环境

python 复制代码
conda create -n rknn152 python=3.8

激活环境rknn152

python 复制代码
conda activate rknn152

拉取rockchip-linux/rknn-toolkit2 at v1.5.2 (github.com)仓库。我是直接下载的1.5.2版本的zip包。

python 复制代码
git clone git@github.com:rockchip-linux/rknn-toolkit2.git

2、安装依赖(requirements_cp38-1.5.2.txt,在rknn-toolkit2/doc目录下)

python 复制代码
pip install -r /home/yuzhou/rknn15/rknn-toolkit2-1.5.2/doc/requirements_cp38-1.5.2.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

安装rknn-toolkit2,位置在packages文件夹下面,请选择合适的版本。

python 复制代码
pip install /home/yuzhou/rknn15/rknn-toolkit2-1.5.2/packages/rknn_toolkit2-1.5.2+b642f30c-cp38-cp38-linux_x86_64.whl

3、开发环境与板子连接

python 复制代码
sudo apt-get install adb

使用USB-typeC线连接到板子的TypeC0接口,PC端识别到虚拟机中。

在开发环境中检查是否连接成功

python 复制代码
adb devices

如果连接成功会返回板子的设备ID,如下:

List of devices attached

* daemon not running; starting now at tcp:5037

* daemon started successfully

75370ea69f64098d device

三、onnx转rknn模型

在rknn-toolkit2工程文件夹中浏览至**./examples/onnx/yolov5** ,将我们在yolov5工程中转换得到的best.onnx复制到该文件夹下,需要修改该文件夹下的test.py中的内容。

  • ONNX_MODEL:模型名;
  • RKNN_MODEL:转换后的rknn模型名;
  • IMG_PATH:推理的图片路径;
  • DATASET:需要打开txt文件修改,改为IMG_PATH的图片名
  • CLASSES:修改为自己数据集的类别

添加target_platform='rk3588'。

进入此目录,运行:

python 复制代码
python test.py

如上图如此,说明没有问题,并且在该目录下会生成一个推理图片,以及转换好的rknn模型。

四、下载NPU工程

python 复制代码
git clone https://github.com/rockchip-linux/rknpu2

将rknn_server和rknn库发送到板子上

python 复制代码
adb push /home/yuzhou/rknn15/rknpu2-1.5.0/runtime/RK3588/Linux/rknn_server/aarch64/usr/bin/rknn_server /usr/bin/
python 复制代码
adb push /home/yuzhou/rknn15/rknpu2-1.5.0/runtime/RK3588/Linux/librknn_api/aarch64/librknnrt.so /usr/bin/
python 复制代码
adb push /home/yuzhou/rknn15/rknpu2-1.5.0/runtime/RK3588/Linux/librknn_api/aarch64/librknn_api.so /usr/bin/

在板子上运行rknn_server服务

python 复制代码
adb shell 
root@ok3588:/# chmod +x /usr/bin/rknn_server
root@ok3588:/# rknn_server &
[1] 6932
root@ok3588:/# start rknn server, version:1.5.0 (17e11b1 build: 2023-05-18 21:43:39)
I NPUTransfer: Starting NPU Transfer Server, Transfer version 2.1.0 (b5861e7@2020-11-23T11:50:51)

在开发环境中检测rknn_server是否运行成功

python 复制代码
(base) yuzhou@yuzhou-HP:~$ adb shell
root@ok3588:/# pgrep rknn_server
6932

有返回进程id说明运行成功。

python 复制代码
git clone https://github.com/rockchip-linux/rknpu2.git

五、部署在rk3588上

修改include文件中的头文件postprocess.h

python 复制代码
#define OBJ_CLASS_NUM     80  #这里的数字修改为数据集的类的个数

修改model目录下的coco_80_labels_list.txt文件,改为自己的类并保存

python 复制代码
car

将转换后的rknn文件放在model/RK3588目录下

在model目录下放入需要推理的图片

python 复制代码
cd /home/yuzhou/rknn15/rknpu2-1.5.0/examples/rknn_yolov5_demo

编译,运行shell

python 复制代码
bash ./build-linux_RK3588.sh

成功后生成install目录,将文件推到我们的板子上面

python 复制代码
adb push /home/yuzhou/rknn15/rknpu2-1.5.0/examples/rknn_yolov5_demo /mydatas/

与rk3588进行交互

python 复制代码
adb shell 

进入我们传入文件的目录下

python 复制代码
cd /mydatas/rknn_yolov5_demo_Linux

使用npu加速推理

python 复制代码
./rknn_yolov5_demo ./model/RK3588/best5s.rknn ./model/6.jpg

将生成的图片拉取到本地来

python 复制代码
adb pull /mydatas/rknn_yolov5_demo_Linux/6out.jpg /home/yuzhou/rknn-toolkit2/examples/onnx/yolov5_rk3588_demo/test

参考文章

瑞芯微RK3588开发板:虚拟机yolov5模型转化、开发板上python脚本调用npu并部署 全流程_yolov5模型在rk3588-CSDN博客

yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上------从训练到部署全过程_yolov5 rknn-CSDN博客

瑞芯微rk3588部署yolov5模型实战_在rk3588上部署yolov5-CSDN博客

yolov5训练并生成rknn模型以及3588平台部署_yolov5 在rk3588上的部署-CSDN博客

相关推荐
内核程序员kevin26 分钟前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
朝九晚五ฺ5 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream5 小时前
Linux的桌面
linux
xiaozhiwise5 小时前
Makefile 之 自动化变量
linux
意疏8 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
BLEACH-heiqiyihu8 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器
一只爱撸猫的程序猿8 小时前
一个简单的Linux 服务器性能优化案例
linux·mysql·nginx
我的K84099 小时前
Flink整合Hudi及使用
linux·服务器·flink
1900439 小时前
linux6:常见命令介绍
linux·运维·服务器