基于YOLOv7的模型训练→转换RKNN→RK3588开发板部署(香橙派Orange Pi 5 Plus (8GB))

一、文章简介

本文将介绍如何在Rockchip RK3588平台上部署YOLOv7算法。RK3588作为一款强大的AI处理平台,具备高性能的处理能力,适合用于嵌入式设备的目标检测任务。我们将从环境搭建、YOLOv7模型转换到RK3588支持的格式、以及如何进行推理部署,逐步讲解整个流程。

1. RK3588平台概述

RK3588是由Rockchip推出的一款高性能嵌入式处理器,采用8核心设计,其中包括4个Cortex-A76核心和4个Cortex-A55核心,配备强大的Mali-G610 GPU和NPU(Neural Processing Unit)。RK3588在AI推理、图像处理等领域表现优秀,适合用于智能监控、自动驾驶、机器人等应用。

2. YOLOv7算法

YOLOv7作为一种流行的目标检测算法,其快速、准确的特点使其成为嵌入式AI平台的理想选择。为了在RK3588上运行YOLOv7,我们需要将模型转换为适合该平台的格式,并进行优化,以便充分利用其硬件资源。

3. 香橙派简介

香橙派官方网站
认识接口

二、准备工作

0. 本人配置:

1,一台笔记本(包含虚拟机Linux)
2,一个香橙派Orange Pi 5 Plus (8GB)
3,一块树莓派共用的显示屏,不兼容,后改为电脑显示屏
4,闪迪32g内存卡

1. 香橙派安装Ubuntu系统

香橙派5plus从ssd启动Ubuntu
官方下载的文件如下图所示,香橙派5plus官方资料下载
在这里插入图片描述
官方下载的文件

烧录镜像 的操作,以上文件和SD卡就可以了,如果啥也不明白,还可以参考以下资料
视频资料
博客资料

此时,连接好电源、HDMI线、鼠标、键盘~~

2. 主机与香橙派通过filezilla连接的设置

目的:可以通过 FileZilla 将文件从 Windows 主机传输到安装了 Ubuntu 的香橙派上,但需要确保香橙派已经配置了一个能够接收文件的 FTP 服务器。

步骤 1:在香橙派(Ubuntu)上安装 FTP 服务器:

首先,您需要在香橙派上安装一个 FTP 服务器。常用的 FTP 服务器有 vsftpd 和 proftpd。以 vsftpd 为例,您可以通过以下命令安装:

sudo apt update
sudo apt install vsftpd
步骤 2:配置 FTP 服务器:

安装完 vsftpd 后,您需要进行一些配置,以确保它能够正常工作。
编辑 vsftpd 配置文件:

sudo nano /etc/vsftpd.conf

确保以下选项已启用(去掉前面的 #):

local_enable=YES:允许本地用户登录。
write_enable=YES:允许上传文件。

找到并修改以下行,禁用 chroot 设置:

chroot_local_user=NO

查找(在 nano 编辑器中,按下 Ctrl + W(表示“Where is”)。)并取消注释(去掉前面的 #)以下行,确保它是 NO:

允许根目录可写,查找以下行:

allow_writeable_chroot=YES

如果没有这行,可以手动添加它。

步骤 3:重新启动 vsftpd 服务

修改完配置文件后,保存并退出编辑器(使用 Ctrl + O 保存,Ctrl + X 退出)。然后,重新启动 vsftpd 服务以使更改生效:

sudo systemctl restart vsftpd
步骤 4:尝试重新连接

现在,如果配置正确,应该能够使用 FileZilla 连接到香橙派的 FTP 服务器了。

3. 中文输入法

第一步:安装fcitx

Ubuntu 常用的是 fcitx 或 ibus 两种输入法框架,推荐使用 fcitx 和搜狗拼音或 fcitx-pinyin:

sudo apt update
sudo apt install fcitx fcitx-pinyin fcitx-config-gtk

如果您更喜欢 ibus,可以改为安装:

sudo apt install ibus ibus-pinyin

这里我选择的是fcitx。

安装完之后,建议重启一下系统,或者注销重新登录:

reboot
第二步:设置环境变量(非常重要)

如果你没有设置 fcitx 为默认输入法框架,可能就会导致无法正常使用拼音。

执行这个命令,设置环境变量:

im-config -n fcitx

然后再重启系统或注销一次。

第三步:添加拼音输入法

重启后,再打开 fcitx配置工具:

点击加号 +。

输入框中搜索 pinyin,现在应该能看到 拼音 了。

添加之后关闭设置。

第四步:怎么切换中英文?

修改或查看快捷键设置,你可以这样操作:

点击右下角输入法图标(通常是一个“键盘”或“EN”图标)。

选择 配置工具(或搜索打开 fcitx 配置工具)。

在列表中选中一个输入法(比如“拼音”)。

点击右边的【全局配置】或【快捷键】标签页。

找到 “切换到下一个输入法” 和 “切换到上一个输入法” 的快捷键,可以自定义,例如设置为:

Ctrl + Space
or
Alt + Shift

4. Ubuntu深度学习环境配置

这个板子不是英伟达,所以不装cuda,cudnn
意外:这里师弟忘了系统密码,所以用到密码重置ubuntu系统密码重置方法
其实也没有用到,在开机蓝屏时刻长按shift就可以无密码进入了。。。可能是个bug,但为了后续方便,还是重新烧录了系统

4.1 香橙派Ubuntu安装miniconda并激活环境

香橙派5端conda安装

4.2 搭建torch环境

确认下你当前设备的架构,请在香橙派终端中运行:

uname -m

如果输出是:x86_64 或 amd64 → 你运行的是标准 PC 版 Ubuntu(可能是在虚拟机、或 x86 香橙派极少型号)。

如果输出是:aarch64 或 armv7l → 你运行的是 ARM 架构。

香橙派的 CPU 是 ARM 架构(通常是 aarch64或 armv7l)。orange5plus是aarch64

所以在以下页面中搜索aarch64,找到合适的版本进行下载即可。
whl安装网站2

安装教程如下:
Linux本地安装torch

4.3 想让它每次开机自动生效?

编辑你的 .bashrc 文件(或者 .zshrc,看你用的是什么 shell):

nano ~/.bashrc

然后在文件末尾添加这一行,路径需要核实,默认是这样:

source ~/miniconda3/etc/profile.d/conda.sh

按下 Ctrl + O 保存,Ctrl + X 退出。

然后运行一次:

source ~/.bashrc

之后每次打开终端,conda 命令就能自动用了!

4.4 pip 项目包

a.环境迁移

conda跨平台迁移:Windows环境配置到Ubuntu系统(保姆级教程)

b.重新安装(最后我选择了重新装环境)

进入环境,pip即可:

conda activate yolo7
pip install -r requirements.txt

三、本篇重点

【YOLOv8seg部署RK3588】

1. 模型训练

暂略。(后续有真实数据时再训练补充内容)

思路:用github下载官方的预训练权重or自己训练好的.pt/.pth,后续要把训练得到的.pt/.pth模型,转成ONNX再转成RKNN模型***。

2. 模型转换——以车牌识别yolov7开源代码为例

以下转换过程均在windows上进行

a. PT转ONNX

项目:车牌检测识别onnx导出与推理
推理: 脚本1(yolov7_plate_onnx_infer_img.py)和脚本2(yolov7_plate_onnx_infer_video.py)均需要使用两个 ONNX 模型:

  • detect_model: 车牌 检测 模型(例如 YOLOv7 导出的 ONNX)
  • rec_model: 车牌 识别 模型(识别文字)
a1. 检测onnx导出

detect_model: 车牌 检测 模型(例如 YOLOv7 导出的 ONNX,命名为plate_detect.onnx或直接使用yolov7-lite-s.onnx)

导出方法
我的导出文件夹都放在了D:\chinese_plate_detect\yolov7_linux\weights。不重要哈,只是自己记录。

导出命令:

python D:/chinese_plate_detect/yolov7_linux/models/export.py --weights D:/chinese_plate_detect/yolov7_linux/weights/yolov7-lite-s.pt --grid
a2. 识别onnx导出

rec_model: 车牌 识别 模型(识别文字)
这里更换了torch38的环境,这是因为我的yolo7没装torch,所以换了以前的环境导出一下,需要安装一些包。

你可以检查一下该虚拟环境是否安装过torch:

import torch
print(torch.cuda.is_available())

准备工作(环境包安装)
pip install onnx==1.13.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
(这个版本比较稳妥,否则新版1.17.0总有兼容问题)
安装检测:python -c "import onnx; print(onnx.__version__)"

pip install onnxruntime 
pip install onnx-simplifier 

导出方法

导出文件夹在:crnn_plate_recognition-master

.pt/pth的导出命令:

python D:/chinese_plate_detect/crnn_plate_recognition-master/export.py --weights D:/chinese_plate_detect/yolov7_linux/weights/plate_rec.pth --save_path D:/chinese_plate_detect/yolov7_linux/weights/plate_rec.onnx --simplify
a3. 车牌检测+车牌识别 onnx推理

图像推理:

python D:/chinese_plate_detect/yolov7_linux/onnx/yolov7_plate_onnx_infer_img.py --detect_model D:/chinese_plate_detect/yolov7_linux/weights/yolov7-lite-s.onnx --rec_model D:/chinese_plate_detect/yolov7_linux/weights/plate_rec.onnx --image_path D:/chinese_plate_detect/yolov7_linux/imgs --output D:/chinese_plate_detect/yolov7_linux/result

视频推理:

D:/chinese_plate_detect/yolov7_linux/onnx/yolov7_plate_onnx_infer_video.py --detect_model D:/chinese_plate_detect/yolov7_linux/weights/yolov7-lite-s.onnx --rec_model D:/chinese_plate_detect/yolov7_linux/weights/plate_rec.onnx --video D:/chinese_plate_detect/video_data/2.mp4 --img_size 640 --output D:/chinese_plate_detect/yolov7_linux/result

换个模型:

D:/chinese_plate_detect/yolov7_linux/onnx/yolov7_plate_onnx_infer_video.py --detect_model D:/chinese_plate_detect/yolov7_linux/weights/onnx/plate_detect.onnx --rec_model D:/chinese_plate_detect/yolov7_linux/weights/plate_rec.onnx --video D:/chinese_plate_detect/video_data/2.mp4 --img_size 640 --output D:/chinese_plate_detect/yolov7_linux/result

问题1:同一个虚拟环境,命令行比pycharm执行慢得多得多,不知道为什么
问题2:为什么将这个模型yolov7-lite-s.onnx换成这个模型plate_detect.onnx时,视频py就正常执行,但是图像py就报错如下:
…/imgs\double_yellow.jpg Traceback (most recent call last):
File “D:/chinese_plate_detect/yolov7_linux/onnx/yolov7_plate_onnx_infer_img.py”, line 263, in
outputs = post_precessing(y_onnx,r,left,top) #检测后处理
File “D:/chinese_plate_detect/yolov7_linux/onnx/yolov7_plate_onnx_infer_img.py”, line 169, in post_precessing
landmarks=dets[:,[kpt_b,kpt_b+1,kpt_b+3,kpt_b+4,kpt_b+6,kpt_b+7,kpt_b+9,kpt_b+10]] #yolov7关键有三个数,x,y,score,这里我们只需要x,y
IndexError: index 16 is out of bounds for axis 1 with size 15
Process finished with exit code 1
> 原因2:
yolov7-lite-s.onnx 模型输出的格式可能包含 关键点(landmarks) 信息,而plate_detect.onnx 是一个简单的车牌检测模型,它可能不包括关键点。yolov7-lite-s.onnx 可能输出更多的信息,比如 bbox + conf + class + landmarks,而 plate_detect.onnx 输出可能只有 bbox + conf + class,这导致在 post_precessing 函数中,试图访问关键点时,索引超出了 dets 数组的范围。

a5. 将处理图片修改为处理视频。

暂略,最后修改为两个文件:
在这里插入图片描述

a6. 补充:文件下载:

初步权重模型网盘下载地址 提取码:k874
在这里插入图片描述

视频测试demo 2.MP4 提取码:41aq

b. ONNX → RKNN

b1. 下载 rknn-toolkit2 源码

rknn-toolkit2 是 瑞芯微官方提供的工具包,用于将 ONNX、TFLite、Darknet 等模型转换成 RKNN 格式,并在 RK 的硬件(如 RK3588)上进行推理。
它主要包含两个部分:

  • 模型转换工具(在PC上使用):把模型从 ONNX 转为 .rknn 格式。
  • 推理工具 + 示例(可选在板子上跑):辅助你部署模型到开发板并调用。
    在这里插入图片描述
    PC端建议:
    推荐使用 Ubuntu/Linux 系统 来运行 rknn-toolkit2,因为在 Windows 下使用模型转换部分经常遇到兼容性问题。

我选择的1.6.0的版本:
在这里插入图片描述
解压后进入rknn-toolkit2-1.6.0/rknn-toolkit2/packages/
在这里插入图片描述

conda activate yolo7
cd /home/dkzx/download/rknn-toolkit2-1.6.0/rknn-toolkit2/packages
ls
b2. 转换环境安装

安装依赖,最后手动安装的:

pip install -r requirements_cp38-1.6.0.txt -i https://mirror.baidu.com/pypi/simple

安装rknn_toolkit2:

pip install rknn_toolkit2-1.6.0+81f21f4d-cp38-cp38-linux_x86_64.whl

注:不要有中文路径啊会报错!~

安装完成后进入python,使用下面命令没有报错,则安装成功。

from rknn.api import RKNN

在这里插入图片描述
如图所示,如果没有报错,说明安装成功,使用键盘Ctrl+Z退出此模式。

b3.转换成rknn模型

新建一个onnx2rknn的文件夹来存放我们的文件

xxx.onnx是我们2.a导出的onnx模型,dataset下面放一张测试图片police.jpg和dataset.txt,txt中写的是测试图片的名字。

dataset-1下面放的是我们要测试的图片,测试的结果会保存在dataset-2下。这个步骤的目的是在将 ONNX 模型转换为 RKNN 模型之后,进行 验证和测试,以确保模型在转换后依然能够正确地进行推理,并且能够在目标硬件(如 RK3588)上正常运行。

接下来,把从官方/home/uu/download/rknn-toolkit2-1.6.0/rknn-toolkit2/examples/onnx/yolov5文件test.py 也放进新建文件夹中,修改 test.py里面的一些内容,具体位置如图所示。

.
├── best.onnx
├── dataset
│   ├── police.jpg
│   └── dataset.txt
├── dataset-1
│   └── police.jpg
├── dataset-2
└── test.py

本来以为会很顺利运行test.py 文件,会在onnx2rknn文件夹下生成xxx.rknn测试结果的图片保存在dataset-2文件夹下。

python test.py 

结果发现
如果是使用自己训练的模型,需要手动在脚本里面修改以下几个参数:

  • OBJ_THRESH: 置信度阈值,用于筛选出较高置信度的框。阈值越大,出来的框准确度较高,框的数量越少;阈值越小,框的数量越多,但误检的框也更多。
  • NMS_THRESH: 非极大值抑制,用于抑制重叠率高的框。阈值越高,允许更多重叠率高的框;阈值越小,抑制更多重叠率高的框,过低的阈值也可能会导致漏检。
  • IMG_SIZE: 图片输入模型推理时强制resize的尺寸,必须和训练时设置的一致,且与推理前加载的新图片尺寸无关。
  • CLASSES: 对象类别名称,一般与训练时的数据集中检测对象标注的类别名称一致。
  • coco_id_list: 和对象类别名称classes绑定的ID编号。

————————————————————————————————————————————————————————

所以就有点无语: RKNN 在推理时要求输入图像的大小必须与在 .rknn 模型转换时设置的输入大小一致,不能像某些其他框架那样动态调整图像大小。因此,在使用 RKNN 时,提前设置并保证输入图像的大小非常重要。如果你想支持不同尺寸的输入图像,你需要分别为每个尺寸导出不同的 .rknn 模型。

解决方案如下:

针对香橙派(Orange Pi)这样的嵌入式设备,解决你的问题有几个方法:
方法 1: 统一图像尺寸
一种常见的做法是在推理前统一调整图像大小,这也是大多数深度学习框架的标准做法。无论输入图像原始大小如何,你都需要将图像调整为模型期望的大小。在 RKNN 或 NCNN 等框架中,模型输入大小是固定的,通常在转换模型时就设定了。
方法 2: 调整模型支持动态输入尺寸
另一种解决方法是尝试通过修改模型架构,使得模型支持动态输入大小。不过,这通常需要重新训练模型,并且要求框架支持动态输入尺寸。大部分的移动端推理框架(如 RKNN)对动态输入尺寸的支持较为有限,尤其是在嵌入式设备上进行推理时,为了提高效率,它们通常会选择固定尺寸。
方法 3: 使用其他推理框架(如 TensorRT 或 OpenVINO)
如果你不依赖于 RKNN,也可以考虑使用其他推理框架,如 TensorRT 或 OpenVINO。这些框架也可以在嵌入式设备上进行推理,并且对于动态输入尺寸可能有更多的灵活性。

由于车牌识别图像尺寸不固定,所以我决定替换为TensorRT 进行下一步部署。
添加链接描述TensorRT

3. RK3588部署

四、模型部署

1.安装rknn-toolkit-lite2:

三.2.b1的rknn-toolkit-lite2,首先进入虚拟环境yolo7,然后进行安装:

pip install /home/dkzx/download/rknn-toolkit2-1.6.0/rknn_toolkit_lite2/packages/rknn_toolkit_lite2-1.6.0-cp38-cp38-linux_aarch64.whl

验证是否安装成功:

python
from rknnlite.api import RKNNLite

需要和虚拟机安装onnx2rknn的包区分开:
在这里插入图片描述

2. 香橙派运行python程序

查看香橙派IP,通过filezilla将代码传输至香橙派。

python kkkmonitest.py --detect_model yolov7-lite-s.rknn --rec_model plate_rec_color.rknn --source imgs --output result --img_size 640

五、参考资料

转换用的三个软件
开源代码
部署步骤
香橙派5B上手记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值