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博客

相关推荐
jz_ddk12 分钟前
[LVGL] 从0开始,学LVGL:进阶应用与项目实战(上)
linux·信息可视化·嵌入式·gui·lvgl·界面设计
望获linux36 分钟前
【实时Linux实战系列】Linux 内核的实时组调度(Real-Time Group Scheduling)
java·linux·服务器·前端·数据库·人工智能·深度学习
MC丶科1 小时前
【SpringBoot常见报错与解决方案】端口被占用?Spring Boot 修改端口号的 3 种方法,第 3 种 90% 的人不知道!
java·linux·spring boot
江公望1 小时前
ubuntu kylin(优麒麟)和标准ubuntu的区别浅谈
linux·服务器·ubuntu·kylin
Lynnxiaowen1 小时前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习
生态笔记1 小时前
PPT宏代码
linux·服务器·powerpoint
mucheni2 小时前
迅为RK3588开发板Ubuntu 系统开发ubuntu终端密码登录
linux·运维·ubuntu
skywoodsky2 小时前
Ubuntu 24.04环境下的挂起转休眠
linux
小云数据库服务专线2 小时前
GaussDB 应用侧报Read timed out解决方法
linux·服务器·gaussdb
资源补给站2 小时前
服务器高效操作指南:Python 环境退出与 Linux 终端快捷键全解析
linux·服务器·python