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
如有侵权,或需要完整代码,请及时联系博主。
相关文章:
RK3568笔记六:基于Yolov8的训练及部署
若该文为原创文章,转载请注明原文出处。 基于Yolov8的训练及部署,参考鲁班猫的手册训练自己的数据集部署到RK3568,用的是正点的板子。 1、 使用 conda 创建虚拟环境 conda create -n yolov8 python3.8 conda activate yolov8 2、 安装 pytorch 等…...
【活动回顾】sCrypt在柏林B2029开发者周
B2029 是柏林的一个区块链爱好者、艺术家和建设者聚会,学习、讨论和共同构建比特币区块链地方。 在2023年6月9日至11日,举行了第7次Hello Metanet研讨会。本次研讨会旨在为参与者提供一个学习、讨论和共同构建比特币区块链的平台。 在这个充满激情和创意…...
【SpringBoot3+Vue3】六【完】【番外篇】- (0-1临摹)
目录 一、后端 1、服务器管理 1.1 ProjectController 1.2 ProjectService 1.3 ProjectServiceImpl 1.4 ProjectMapper 1.5 实体类 2、项目管理 2.1 ServerManageController 2.2 ServerManageService 2.3 ServerManageServiceImpl 2.4 ServerManageMapper 2.5 Serv…...
生成式AI与大语言模型,东软已经准备就绪
伴随着ChatGPT的火爆全球,数以百计的大语言模型也争先恐后地加入了这一战局,掀起了一场轰轰烈烈的“百模大战”。毋庸置疑的是,继方兴未艾的人工智能普及大潮之后,生成式AI与大语言模型正在全球开启新一轮生产力革新的科技浪潮。 …...
Python爬虫遇到重定向URL问题时如何解决?
什么是重定向 重定向是指当用户请求一个URL时,服务器返回一个中断请求的URL的响应。这种情况通常发生在网站对URL进行了修改或者重定向到其他页面的情况下。其中,如果处理不当开发,可能会导致爬虫无法获取所需的数据,从而影响爬虫…...
【点云surface】无序点云快速三角化
1 介绍 GreedyProjectionTriangulation 是一种基于局部二维投影的三维点贪婪三角剖分算法的实现。它假定局部表面光滑,不同点密度区域之间的过渡相对平滑。 GreedyProjectionTriangulation算法的基本思想是通过逐步投影点云数据到一个三角化网格上来进行重建。它首…...
el-select多选下拉框实现全选功能
<el-selectv-model"query.web_ids"multiplecollapse-tagscollapse-tags-tooltip:max-collapse-tags"2"filterableplaceholder"网站"><li class"checkAllBox" style"padding: 0 32px 0 20px; border-bottom: 1px solid #…...
Elasticsearch 聚合查询(Aggregation)详解
Elasticsearch中的聚合查询,类似SQL的SUM/AVG/COUNT/GROUP BY分组查询,主要用于统计分析场景。 实例: import org.apache.http.HttpHost; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.…...
数据库其它调优策略
文章目录 1. 优化MySQL服务器2. 优化数据库结构2.1 差分表:冷热数据分离 3. 大表优化3.1 读/写分离3.2 垂直拆分3.3 水平拆分 1. 优化MySQL服务器 电商平台,双十一,CPU使用率达到99%,系统的计算资源已经耗尽,再也无法…...
【AI认证笔记】NO.2人工智能的发展
目录 一、人工智能的发展里程碑 二、当前人工智能的发展特点 1.人工智能进入高速发展阶段 2.人工智能元年 三、人工智能高速发展的三大引擎 1.算法突破 2.算力飞跃 3.数据井喷 四、AI的机遇 五、AI人才的缺口 六、行业AI 人工智能算法,万物互联ÿ…...
Python与设计模式--观察者模式
23种计模式之 前言 (5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、(11)策略模式、责任链模式、命令模式、中介者模…...
Elasticsearch底层原理分析——新建、索引文档
es版本 8.1.0 重要概念回顾 Elasticsearch Node的角色 与下文流程相关的角色介绍: Node Roles配置主要功能说明masternode.roles: [ master ]有资格参与选举成为master节点,从而进行集群范围的管理工作,如创建或删除索引、跟踪哪些节点是…...
ts实现合并数组对象中key相同的数据
背景 在平常的业务中,后端同学会返回以下类似的结构数据 // 后端返回的数据结构 [{ id: 1, product_id: 1, pid_name: "Asia", name: "HKG01" },{ id: 2, product_id: 1, pid_name: "Asia", name: "SH01" },{ id: 3, pro…...
C语言--根据成绩判断等级
一.题目描述 如果学生的成绩小于60分,那么输出不及格 如果学生的成绩大于60分小于85分,那么输出良好 如果学生的成绩大于85分,那么输出优秀 二.代码实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> //根据成绩打印等级 //scor…...
Rust多线程任务,发现有些线程一直获取不到锁【已解决】
问题描述 项目中用到rust,其中在多线程中用到了同一个对象的锁,然而发现其中一个线程一直拿不到这个锁。 解决过程 我先是在线程A中加入了sleep方法,这样做的效果就是,比最初好一些,但是拿到锁还是要较长时间…...
【区块链】产品经理的NFT初探
常见的FT如比特币(BTC),以太币(ETH)等,两个代币之间是完全可替换的。而NFT具有唯一性,不可以互相替换。本文作者对NET的发展现状、相关协议、应用场景等方面进行了分析,一起来看一下…...
香港服务器减少延迟的几种方法
我们在租用香港服务器时,总觉得网站程序反应太慢。选择了香港服务器的开发商和企业对香港服务器目前的访问速度不满意 怎么办?第一点是换服务器。更换配置更大、带宽更高的服务器,可以更好的解决网站访问速度。如何减少香港服务器的延时 速度…...
PowerShell命令小记
1. 使用命令删除指定文件或文件夹 在 PowerShell 中,你可以使用 Remove-Item 命令递归删除文件夹下的指定文件。以下是一条命令的示例,该命令删除指定文件夹及其子文件夹中的所有 .txt 文件: Remove-Item -Path "D:\test" -Recur…...
C语言小练
目录 打印斐波那契数列指定位置的值 给定两个数,求这两个数的最大公约数 三个数从大到小输出 模拟用户登陆情况,且只能输如三次 采用二分法查找数组中的指定元素 打印输出九九乘法表 数一下1-100中所有整数出现多少个数字9 打印1-200之间的素数&…...
Webhook端口中的自签名身份验证
概述 有时,可能需要通过 Webhook 端口从交易伙伴处接收数据,但该交易伙伴可能需要更多的安全性,而不仅仅是用于验证入站 Webhook 请求的基本身份验证用户名/密码 – 或者您可能只想在入站 Webhook 消息上添加额外的安全层。 使用 Webhook 端…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
