RK3568笔记六:基于Yolov8的训练及部署

若该文为原创文章,转载请注明原文出处。

基于Yolov8的训练及部署,参考鲁班猫的手册训练自己的数据集部署到RK3568,用的是正点的板子。

1、 使用 conda 创建虚拟环境
复制代码
conda create -n yolov8 python=3.8
​
conda activate yolov8
2、 安装 pytorch 等等

根据pytorch自行安装

3、 安装 ,直接使用命令安装

方法有两种,个人使用的是第二种方法:

方法一:

通过pip安装

复制代码
pip install ultralytics -i https://mirror.baidu.com/pypi/simple

方法二:

通过拉取仓库然后安装

复制代码
git clone https://github.com/ultralytics/ultralytics
​
cd ultralytics
​
pip install -e .

# 安装成功后,使用命令 yolo 简单看下版本

复制代码
(yolov8) llh@anhao:/$ yolo version
​
8.0.206
4、简单测试

下载权重文件

复制代码
wget https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt

*获取测试图片,可以下面位置获取,可能会失败,也可以从配套例程获取

复制代码
wget https://ultralytics.com/images/bus.jpg

使用 yolo 命令进行测试

复制代码
yolo detect predict model=./yolov8n.pt source=./bus.jpg
复制代码
​# 预测图片结果保存在当前 runs 目录下,具体路径是./runs/detect/predict/bus.jpg
复制代码
参数说明:
# 第一个参数是指任务 [detect, segment, classify], 这里测试目标检测是 detect,该参数
是可选的;
# 第二个参数 model,设置模型,该参数必须指定;
# 其他参数,source 指定要预测的图片路径,imgsz 指定图像尺寸等等,更多参数具体参考下:
https://docs.ultralytics.com/usage/cfg/
5、模型训练

以COCO128为例,训练测试

复制代码
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=300 imgsz=640

测试

复制代码
yolo detect predict model=./runs/detect/train/weights/best.pt source=./bus.jpg

6、模型导出

使用 airockchip/ultralytics_yolov8 可以直接导出适配 rknpu 的模型,在 npu 上获得更高的推理效率。

该仓库对模型进行了优化:

• dfl 结构在 NPU 处理上性能不佳,移至模型外部。

• 假设有 6000 个候选框,原模型将 dfl 结构放置于''框置信度过滤"前,则 6000 个候选框

都需要计算经过 dfl 计算;而将 dfl 结构放置于''框置信度过滤"后,假设过滤后剩 100 个

候选框,则 dfl 部分计算量减少至 100 个,大幅减少了计算资源、带宽资源的占用。

假设有 6000 个候选框,检测类别是 80 类,则阈值检索操作需要重复 6000* 80 ~= 4.8*10^5 次,占据

了较多耗时。故导出模型时,在模型中额外新增了对 80 类检测目标进行求和操作,用于快速过滤

置信度。

(该结构在部分情况下有效,与模型的训练结果有关) 可以在./ultralytics/nn/modules/head.py

52 行 ~54 行的位置,注释掉这部分优化,对应的代码是:

复制代码
cls_sum = torch.clamp(y[-1].sum(1, keepdim=True), 0, 1)
y.append(cls_sum)

具体参考下 RKOPT_README.md 。

导出torchscript模型

复制代码
# 拉取 airockchip/ultralytics_yolov8
git clone https://github.com/airockchip/ultralytics_yolov8.git
cd ultralytics_yolov8
​
# 复制训练的模型 yolov8n.pt 到 ultralytics_yolov8 目录下
# 然后修改./ultralytics/cfg/default.yaml 文件,主要是设置下 model,为自己训练的模型
路径:
model: ./yolov8n.pt # (str, optional) path to model file, i.e. yolov8n.pt, yolov8n.yaml
data: # (str, optional) path to data file, i.e. coco128.yaml
epochs: 100 # (int) number of epochs to train for
​
# 导出模型:
python ./ultralytics/engine/exporter.py
#导出的模型,保存在当前目录下的 yolov8n_rknnopt.torchscript

导出ONNX模型

复制代码
yolo export model=path/to/best.pt format=onnx  # export custom trained model
7、RKNN模型转换

模型转换是通过tooolkit2转成rknn模型的,需要先安装toolkit2,具体安装参考正点原子的。

这是使用的是 rknn_model_zoo 仓库 的程序,直接转换模型,

复制代码
# 拉取 rknn_model_zoo,(注意教程测试时 rknn_model_zoo 的 SHA 是
22462182b91c7d856b59a8ec3e4a25bba8813d17)
git clone https://github.com/airockchip/rknn_model_zoo.git
# 然后切换到 models/CV/object_detection/yolo/RKNN_model_convert 目录下
cd rknn_model_zoo/models/CV/object_detection/yolo/RKNN_model_convert

在录前目录下创建yolov8_rk3568.yml文件,内容如下:

复制代码
# model_framework: onnx
model_framework: pytorch
model_file_path: /mnt/f/wsl_file/wsl_ai/yolov8/ultralytics_yolov8/yolov8n_rknnopt.torchscript
RK_device_platform: rk3568
# RK_device_id: simulator
dataset: ../../../../../datasets/COCO/coco_subset_10.txt
quantize: True
# pre_compile: online
graph:
in_0:
shape: 1,3,640,640
mean_values: 0
std_values: 255
img_type: RGB
configs:
quantized_dtype: asymmetric_quantized-8
quantized_algorithm: normal
optimization_level: 3
# force_builtin_perm: True

注意三个地方:

复制代码
1、model_framework可以使用onnx也可以是pytorch
2、model_file_path:模型路径
3、RK_device_platform: 平台

使用命令或者创建脚本执行模型转换等操作

复制代码
# 使用 rknn_convert.py,转换模型
python ../../../../../common/rknn_converter/rknn_convert.py --yml_path ./yolov8_rk3568.yml

转换的模型保存在当前目录 model_cvt/RK3568/下,模型文件是 yolov8n_rknnopt_RK3568_i8.rknn。

8、部署

使用 rknn_model_zoo 仓库 提供的 RKNN_C_demo,在板端部署

复制代码
# 拉取 rknn_model_zoo 仓库源码,注意教程测试的 rknn_model_zoo 仓库版本是
22462182b91c7d856b59a8ec3e4a25bba8813d17
​
git clone https://github.com/airockchip/rknn_model_zoo.git
# 切换到~/rknn_model_zoo/libs/rklibs 目录,然后拉取相关库,包括 rknpu2 和 librga
cd ~/rknn_model_zoo/libs/rklibs
git clone https://github.com/rockchip-linux/rknpu2
git clone https://github.com/airockchip/librga
# 然后切换到~/rknn_model_zoo/models/CV/object_detection/yolo/RKNN_C_demo/RKNN_toolkit_2/rknn_yolo_demo 目录
cd rknn_model_zoo/models/CV/object_detection/yolo/RKNN_C_→demo/RKNN_toolkit_2/rknn_yolo_demo
# 运行 build-linux_RK3568.sh 脚本,编译工程(使用系统默认的编译器),最后生成的文件安装
在 build/目录下
./build-linux_RK3568.sh

执行命令进行模型推理:

复制代码
# 切换到 install/rk3568/Linux/rknn_yolo_demo 目录下,复制前面转换出的 yolov8n_→rknnopt_RK3568_i8.rknn 模型文件到目录下,
# 然后把文件拷贝到开发板上执行下面命令:
复制代码
./rknn_yolo_demo␣yolov8 q8 ./yolov8n_rknnopt_RK3588_i8.rknn ./model/bus640.jpg
复制代码
#运行后会在目录下生成out.jpg

参考链接

Quickstart - Ultralytics YOLOv8 Docs

GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite

GitHub - airockchip/ultralytics_yolov8: NEW - YOLOv8 🚀 in PyTorch > ONNX > CoreML > TFLite

GitHub - airockchip/rknn_model_zoo

如有侵权,或需要完整代码,请及时联系博主。

相关推荐
汇能感知5 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun6 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao6 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾6 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT7 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
ST.J7 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记
Suckerbin7 小时前
LAMPSecurity: CTF5靶场渗透
笔记·安全·web安全·网络安全
小憩-8 小时前
【机器学习】吴恩达机器学习笔记
人工智能·笔记·机器学习
UQI-LIUWJ8 小时前
unsloth笔记:运行&微调 gemma
人工智能·笔记·深度学习
googleccsdn8 小时前
ESNP LAB 笔记:配置MPLS(Part4)
网络·笔记·网络协议