RK3588从数据集到训练到部署YoloV8

环境配置

首先需要安装Conda、CUDA、Cudnn等工具,在此不过多赘述,主要讲解Python环境配置的相关参数

复制代码
Python版本:3.10

Torch版本:1.13.1

安装完成后还需要pip一下yolo的库:

pip install ultralytics

数据库准备

数据库请自行准备,这里可以使用roboflow来进行数据库格式转换
roboflow

这里进入网站之后注册登录一下,然后新建工程

然后上传自己的数据集

![![[Pasted image 20250818143753.png]](https://i-blog.csdnimg.cn/direct/2d8649c86239412296c366514fd20f7f.png)

等待上传完毕

上传完毕后,点击Versions,然后后面的选项都默认即可

完成后点击创建

创建完毕后,点击Download,选择YoloV8格式,

这样,就拿到可以使用的数据集了。

模型训练

首先下载Yolov8:

复制代码
git clone https://github.com/Pertical/YOLOv8.git

然后在该项目中新建datasets文件夹,将上一步的数据集解压放入其中:

随后,修改data.yaml

Python 复制代码
train: /home/chuiyu/yolov8/ultralytics-main/datasets/data/train/images  #改为对应的绝对路径

val: /home/chuiyu/yolov8/ultralytics-main/datasets/data/valid/images    #改为对应的绝对路径

test: /home/chuiyu/yolov8/ultralytics-main/datasets/data/test/images    #改为对应的绝对路径

  

nc: 1 #数据集种类数量

names: ['0']  #数据集种类名称

  

# roboflow:

#   workspace: chuiyu

#   project: yolo-38xf2

#   version: 1

#   license: CC BY 4.0

#   url: https://universe.roboflow.com/chuiyu/yolo-38xf2/dataset/1

最重要的一点 :要改激活函数为ReLU,我们如果默认不改,则训练得到的PT模型的激活函数为SiLU,如下所示:

SiLU函数在PT模型中无任何问题,与ReLU函数的训练结果对比非常接近

改激活函数流程如下:

把ultralytics/nn/modules/conv.py中的Conv类进行修改,

将default_act = nn.SiLU() # default activation改为

default_act = nn.ReLU() # default activation

在项目根目录新建一个train.py

Python 复制代码
from ultralytics import YOLO

  

# 加载模型

model = YOLO("yolov8n.yaml")  # 从头开始构建新模型

model = YOLO("yolov8n.pt")  # 加载预训练模型(推荐用于训练)

  

# Use the model

results = model.train(data="datasets/data/data.yaml", epochs=300,batch=4)  # 训练模型

# results = model.val()  # 在验证集上评估模型性能

# results = model("https://ultralytics.com/images/bus.jpg")  # 预测图像

# success = model.export(format="onnx")  # 将模型导出为 ONNX 格式

将yolov8n同样放入项目根目录(可去github上进行下载)

随后即可运行train.py进行训练

bash 复制代码
python3 train.py

测试验证

训练完成后,同样在根目录创建一个test.py用于测试验证

Python 复制代码
from ultralytics import YOLO

  

# 加载模型

model = YOLO("/home/chuiyu/yolov8/ultralytics-main/runs/detect/train11/weights/best.pt")  # 将路径改为自己训练后的路径

  
  

results = model("datasets/data/test/images")

for result in results:

    result.save()

运行test.py,即可将测试集中的识别结果保存到根目录,可打开查看

pt转onnx

在训练得到PT模型后,我们可以用netron软件打开模型,看一下结构

现在我们的激活函数已经为ReLU了。

pt转onnx我们需要使用另一个yolov8的工程,

bash 复制代码
git clone https://github.com/airockchip/ultralytics_yolov8.git

将之前训练的.pt文件放入该项目的根目录

同时在根目录新建一个requirements.txt

Python 复制代码
# Ultralytics requirements
# Usage: pip install -r requirements.txt

# Base ----------------------------------------
matplotlib>=3.2.2
numpy>=1.22.2 # pinned by Snyk to avoid a vulnerability
opencv-python>=4.6.0
pillow>=7.1.2
pyyaml>=5.3.1
requests>=2.23.0
scipy>=1.4.1
# torch>=1.7.0
# torchvision>=0.8.1
tqdm>=4.64.0

# Logging -------------------------------------
# tensorboard>=2.13.0
# dvclive>=2.12.0
# clearml
# comet

# Plotting ------------------------------------
pandas>=1.1.4
seaborn>=0.11.0

# Export --------------------------------------
# coremltools>=7.0.b1  # CoreML export
# onnx>=1.12.0  # ONNX export
# onnxsim>=0.4.1  # ONNX simplifier
# nvidia-pyindex  # TensorRT export
# nvidia-tensorrt  # TensorRT export
# scikit-learn==0.19.2  # CoreML quantization
# tensorflow>=2.4.1  # TF exports (-cpu, -aarch64, -macos)
# tflite-support
# tensorflowjs>=3.9.0  # TF.js export
# openvino-dev>=2023.0  # OpenVINO export

# Extras --------------------------------------
psutil  # system utilization
py-cpuinfo  # display CPU info
# thop>=0.1.1  # FLOPs computation
# ipython  # interactive notebook
# albumentations>=1.0.3  # training augmentations
# pycocotools>=2.0.6  # COCO mAP
# roboflow

然后下载依赖(同样使用之前的训练Yolov8的Python环境)

bash 复制代码
pip install -r requirements.txt

完成后,修改ultralytics_yolov8 项目中的ultralytics/cfg/default.yaml,将其中的model参数路径改成你训练得到的的best.pt模型路径(记得使用绝对路径)

回到刚才1中的ultralytics文件夹所在的路径下,依次执行如下两个命令:

bash 复制代码
export PYTHONPATH=./
python ./ultralytics/engine/exporter.py

结果如下所示,此时的.onnx就生成在了项目的根目录了。

再用netron打开我们的onnx模型,如下所示:

注意!上图的三个红色方框非常重要,YOLOv8在RKNN转换过程中,是要有三个分支的,分别80×80检测头,40×40检测头,20×20检测头。每个检测头下,都有三个输出,分别是box边框输出,即图上的1×64×80×80;还有各类别输出,即1×4×80×80(这里的4就是指我在PT模型训练时的garbage.yaml文件中定义了4个类别),最后是综合置信度输出,即1×1×80×80。(其余检测头同理)

onnx转rknn

这里我们另外创建Python环境

bash 复制代码
conda create -n rknn210 python=3.8
conda activate rknn210

现在需要用到rknn-toolkit2-2.1.0文件。

进入rknn-toolkit2-2.1.0\rknn-toolkit2-2.1.0\rknn-toolkit2\packages文件夹下,安装依赖环境

bash 复制代码
pip install -r requirements_cp38-2.1.0.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install rknn_toolkit2-2.1.0+708089d1-cp38-cp38-linux_x86_64.whl

然后,我们的转rknn环境就配置完成了。

现在要进行模型转换,先进入rknn_model_zoo-2.1.0\examples\yolov8\python文件夹,先打开yolov8.py,进行适配参数修改:

然后修改convert.py,如下所示:

修改完成后,将我们之前得到的onnx模型复制到python文件夹下

运行转换命令

bash 复制代码
python convert.py 模型文件名.onnx rk3588

可以看到,我们的模型转换并量化成功。

转换后的rknn模型已保存在model文件夹下。现在用netron打开我们的rknn模型,看一下结构:

这三个红框是和上面图中的三个红框对应的,所以若onnx没有所示的那三个框,则无法转换出适配官方部署文件的rknn模型。

模型部署

如果前面流程都已实现,模型的结构也没问题的话,则可以进行最后一步:模型端侧部署。

我已经帮大家做好了所有的环境适配工作,科学上网后访问博主GitHub仓库:YOLOv8_RK3588_object_detect 进行简单的路径修改就即可编译运行。

bash 复制代码
git clone https://github.com/A7bert777/YOLOv8_RK3588_object_detect.git

git clone后把项目复制到开发板上,按如下流程操作:

①:cd build,删除所有build文件夹下的内容

②:cd src 修改main.cc,修改main函数中的如下三个内容:

将这三个参数改成自己的绝对路径

③:cd src 修改postprocess.cc下的txt标签的绝对路径:

解释一下,这个标签路径中的内容如下所示:

其实就是你在训练yolov8时在yaml配置文件中的那几个类别名

④修改include/postprocess.h 中的宏 OBJ_CLASS_NUM

⑤:把你之前训练好并已转成RKNN格式的模型放到YOLOv8_RK3588_object_detect/model文件夹下,然后把你要检测的所有图片都放到YOLOv8_RK3588_object_detect/inputimage下。

在运行程序后,生成的结果图片在YOLOv8_RK3588_object_detect/outputimage下

⑥:进入build文件夹进行编译

bash 复制代码
cd build
cmake ..
make

然后就可以运行测试程序了:

bash 复制代码
./rknn_yolov8_demo

如果遇到了无法读取图片的报错:

把main.cc中的ret = read_image_opencv(fullPath.c_str(), &src_image); 改为ret = read_image(fullPath.c_str(), &src_image);即可

参考资料

1.YoloV8模型训练:【【yolov8】2024,半小时速通yolov8,2024最新,windows,ubuntu,wsl】 https://www.bilibili.com/video/BV13H4y1G7DP/?share_source=copy_web\&vd_source=800b0cce2dee97823e91fad6181bdec5

2.YoloV8模型转RKNN、部署:https://blog.csdn.net/A_l_b_ert/article/details/141610417?fromshare=blogdetail\&sharetype=blogdetail\&sharerId=141610417\&sharerefer=PC\&sharesource=chui_yu666\&sharefrom=from_link

相关推荐
iconball8 小时前
个人用云计算学习笔记 --19 (MariaDB服务器)
linux·运维·笔记·学习·云计算
Lynnxiaowen8 小时前
今天我们开始学习python3编程之python基础
linux·运维·python·学习
Chandler248 小时前
一图掌握 操作系统 核心要点
linux·windows·后端·系统
ajassi20008 小时前
开源 C# 快速开发(十七)进程--消息队列MSMQ
windows·开源·c#
dragoooon349 小时前
[Linux系统编程——Lesson6.进程切换与调度]
linux·运维·服务器
waves浪游9 小时前
Linux基本指令(下)
linux·运维·服务器
K_i1349 小时前
探索Linux:开源世界的钥匙
linux
ApacheSeaTunnel9 小时前
从小时级到分钟级:多点DMALL如何用Apache SeaTunnel把数据集成成本砍到1/3?
大数据·开源·数据集成·seatunnel·技术分享
The Future is mine10 小时前
.Net Core 在Linux系统下创建服务
linux·运维·.netcore