rk3588 模型转换V2.0.0-beta0

本文使用的是2024.7.24最新的rknn-toolkit2仓库V2.0.0-beta0。
下面操作若无标明,默认都是在Linux主机上执行。

1.下载rknn-toolkit2 && rknn model zoo

#下载RKNN-Toolkit2仓库 git clone
https://github.com/airockchip/rknn-toolkit2.git–depth 1 #下载RKNN
Model Zoo仓库 git clone
https://github.com/airockchip/rknn_model_zoo.git–depth 1

2.安装依赖库

创建虚拟环境

conda create-n toolkit2 python=3.8

#进入rknn-toolkit2目录
cd Projects/rknn-toolkit2/rknn-toolkit2
pip install -r packages/requirements_cp38-2.0.0b0.txt
这一步可能会出现tf-estimator-nightly下不下来的情况,运行这个指令:

pip install -i https://pypi.doubanio.com/simple/
tf-estimator-nightly==2.8.0.dev2021122109

#安装RKNN-Toolkit2

pip install packages/rknn_toolkit2-2.0.0b0+9bab5682-cp38-cp38-linux_x86_64.whl

3.安装gcc,用于编译成板子上的可执行文件

板端为64位系统:https://releases.linaro.org/components/toolchain/binaries/6.3
2017.05/aarch64-linux-gnu/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz
下载后解压。

4.模型转换

#进入rknn_model_zoo/examples/yolov5/python目录
cd Projects/rknn_model_zoo/examples/yolov5/python
#运行convert.py脚本,将原始的ONNX模型转成RKNN模型
#用法: python convert.py model_path [rk3566|rk3588|rk3562] [i8/fp] [output_path]

 python convert.py ../model/yolov5s_relu.onnx rk3588 i8 ../model/yolov5s_relu.rknn 

5.编译可执行文件

#添加到rknn_model_zone/build-linux.sh脚本的开头位置即可,指向刚刚解压的gcc路径。
GCC_COMPILER=Projects/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu

#进入rknn_model_zoo目录
cd Projects/rknn_model_zoo
#编译
./build-linux.sh -t rk3588 -a aarch64 -d yolov5
编译成功会在rknn_model_zone目录下出现install目录。

6.推送文件到板端

cd Projects/rknn_model_zoo
adb push install/rk3588_linux_aarch64/rknn_yolov5_demo /data/

7.运行模型(在板端)

#进入板端
adb shell
#进入 rknn_yolov5_demo 目录
cd /data/rknn_yolov5_demo/
#设置依赖库环境
export LD_LIBRARY_PATH=./lib
#运行可执行文件
#用法: ./rknn_yolov5_demo <model_path> <input_path>
./rknn_yolov5_demo model/yolov5s_relu.rknn model/bus.jpg

8.查看结果(在linux主机上)

#拉取到本地当前目录
adb pull /data/rknn_yolov5_demo/out.png .

模型转换时出现的问题:

由于yolov5训练出来默认是一个出口,可是rknn模型需要3个出口。
解决方案:
在将模型(.pt)转换成onnx前将model/yolo.py的 Detect 类下的

    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)

修改为:

    def forward(self, x):
        z = []
        for i in range(self.nl):
            x[i] = self.m[i](x[i])
 
        return x

出现置信度大于0/乱框的现象,可以修改为下面的情况:

    def forward(self, x):
        z = []
        for i in range(self.nl):
            x[i] = torch.sigmoid(self.m[i](x[i]))
 
        return x

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值