一、文章简介
本文将介绍如何在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官方资料下载


此时,连接好电源、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并激活环境
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
三、本篇重点
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. 补充:文件下载:
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


&spm=1001.2101.3001.5002&articleId=147256725&d=1&t=3&u=d25013e8b03a4025b0bac50a752278f5)
154

被折叠的 条评论
为什么被折叠?



