Skip to content

YoloV5的Onnx模型转RKNN模型

前言

下面是前期准备:

1.环境

Ubuntu20.04 LTS

存储:建议100G以上(我感觉50G左右可能够)

2.文件

rknn-toolkit2-1.4.0.zip(下载链接见4.其它)

onnx模型(算子集版本小于等于 12,具体原因详见4.其它中的3.1报错提示)

验证图片

模型的类别

3.方式

本博客使用VMware虚拟机以及VMware共享文件夹实现虚拟机和主机之间的互传文件。

这里放一下配置方法链接:

主机与VMware虚拟机共享文件夹:解决虚拟机找不到共享文件夹问题 - 知乎

1.安装docker

sudo apt-get update
sudo apt-get upgrade
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get install ca-certificates curl gnupg lsb-release
# 添加密钥
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 添加软件源
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker chs(换成你自己的用户名)
sudo reboot
sudo systemctl start docker
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
service docker restart
sudo docker run hello-world
sudo docker version
sudo docker images

注意: 运行docker的helloworld时

sudo docker run hello-world

如果显示helloworld则代表docker的环境正常,但如果提示:

image-20260203174825485

属于正常现象,docker会有问题连接不上,国内全面禁止了docker本源及镜像源,用科学

不过不运行helloworld不影响rknn的转换,略过即可,只要后面的版本等信息输出正常就行:

image-20260203172825285

和我的截图差不多就行,不要有报错一般就代表安装成功了。

2.进入docker镜像

首先回到主目录

cd ~/

创建一个rknn文件夹

mkdir rknn

rknn-toolkit2-1.4.0.zip复制到rknn文件夹下

因为我这里是使用共享文件夹所以就当把rknn-toolkit2-1.4.0.zip复制到windows的对应目录后直接cp了:

bash
cp /mnt/hgfs/Ubuntu20.04/rknn-toolkit2-1.4.0.zip rknn-toolkit2-1.4.0.zip

然后解压这个文件夹

unzip rknn-toolkit2-1.4.0.zip

再将onnx模型放入rknn-toolkit2-1.4.0/examples文件夹

cd rknn
cp /mnt/hgfs/Ubuntu20.04/best.onnx best.onnx
cp best.onnx rknn-toolkit2-1.4.0/examples/best.onnx

然后将docker的镜像放到~/

 cp rknn-toolkit2-1.4.0/docker/rknn-toolkit2-1.4.0-cp38-docker.tar.gz ~/rknn-toolkit2-1.4.0-cp38-docker.tar.gz

开启docker服务

sudo systemctl start docker

加载docker镜像,需要等一小会

docker load --input rknn-toolkit2-1.4.0-cp38-docker.tar.gz

image-20260203174848206

运行docker镜像

docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb -v ~/rknn/rknn-toolkit2-1.4.0/examples:/examples rknn-toolkit2:1.4.0-cp38 /bin/bash

如若运行成功,你就会成功进入docker镜像中,此时你将会变为root用户

ls

image-20260203174858776

进入examples文件夹查看一下我们的onnx模型在不在

cd examples/
ls

image-20260203174907693

正常,进入onnx的yolov5文件夹

cd onnx/yolov5/

将其放入onnx的yolov5文件夹

 cp /examples/best.onnx best.onnx
 ls

image-20260203174915688

3.生成RKNN模型

首先将验证图片放入该文件夹,这里我们需要新建一个终端(不要关闭之前的终端)

然后将我们的一张验证图片放进来

docker cp /mnt/hgfs/Ubuntu20.04/test.jpg infallible_sanderson:/examples/onnx/yolov5/test.jpg

这里解释一下:/mnt/hgfs/Ubuntu20.04/test.jpg 外部的图片

infallible_sanderson docker镜像名字,可用docker ps -a 指令查询

/examples/onnx/yolov5/test.jpg 要复制到的路径

回到最开始的那个终端

查看图片是否被复制进来

ls

image-20260203174925542

然后我们复制一份dataset.txt

cp dataset.txt mydataset.txt

再编辑

vim mydataset.txt

image-20260203174934566

点击i

然后将名称修改为我们刚复制进来的图片文件名

然后按esc

输入英文冒号:

输入wq,按回车保存

image-20260203174942114

再复制一份test.py后编辑

cp test.py mytest.py
vim mytest.py

ps:我这里中途换了一个onnx模型和图片,以jzl.onnx和jzl.jpg为例

image-20260203174950495

然后翻到最后

image-20260203174958996

最后esc

英文冒号:

wq

回车

此时就可以开始运行代码开始转换了:

python mytest.py

image-20260203175007944

等待几秒就好

image-20260203175018499

然后查看一下是否导出成功

ls

image-20260203175025192

看起来像是成功了,我们将rknn模型和out.jpg拿出来

切换回到终端2,复制图片和模型文件

docker cp infallible_sanderson:/examples/onnx/yolov5/out.jpg /mnt/hgfs/Ubuntu20.04/out.jpg
Successfully copied 108kB to /mnt/hgfs/Ubuntu20.04/out.jpg


docker cp infallible_sanderson:/examples/onnx/yolov5/jzl.rknn  /mnt/hgfs/Ubuntu20.04/jzl.rknn
Successfully copied 8.45MB to /mnt/hgfs/Ubuntu20.04/jzl.rknn

image-20260203175033366

回到windows对应的共享文件夹打开

image-20260203175044171

打开out.jpg看看

image-20260203175051578

效果不错,成功了

4.其它

1.参考链接

【04 rk3568 yolov5 生成rknn文件】 https://www.bilibili.com/video/BV1Cz421k75D/?share_source=copy_web&vd_source=800b0cce2dee97823e91fad6181bdec5

2.下载链接

1.rknn-toolkit2-1.4.0.zip

链接: https://pan.baidu.com/s/1NM27wWLNjZkPaOzzoXfgKA?pwd=c6ad 提取码: c6ad 复制这段内容后打开百度网盘手机App,操作更方便哦

2.Ubuntu20.04系统镜像

https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/20.04/

3.可能报错情况:

3.1:onnx版本太高

image-20260203175059895

需注意在使用yolo导出onnx模型的时候,在export.py中的opset属性要写12,写13会导致这里导出rknn报错

image-20260203175108018

3.2模型运行的输入纬度3维与实际要求4维,纬度不符的错误

在这里插入图片描述

此问题尚未解决,原因未知,但最后生成了RKNN文件,是否能用尚未测试。最后的错误是因为在转换为onnx模型的时候直接展平了参数,需要在yolo.py中修改即可