RK3568部署yolo8记录
本教程记录自己一下在RK3568上部署yolo8的步骤
板端驱动
在板端,首先查看rknpu驱动是否安装、存在。若键入下面的命令有返回则,证明驱动已安装。
dmesg | grep -i rknpu

瑞芯微官方说,驱动版本最好大于0.9.2。但是我看有的博主说,低于这个版本的也可行正常推理
其他博主的驱动版本升级教程

按照瑞芯微的官方文档,接下来需要检查RKNPU2 环境是否安装

使用下面的命令 查询rknn_server版本
strings /usr/bin/rknn_server | grep -i "rknn_server version"
其实,如果你是用linux x86电脑通过数据线连接板端,在linux x86安装rknn-toolkit2,进行模型转化,并编写代码传输至板端仿真代码结果。这种情况,需要在板端安装rknn_server。我这里是直接在板端安装rknn-toolkit2、进行模型转化......,总之我这里一切操作都是在板端,像我这种情况是不需要再板端安装rknn_server的
使用下面的命令 查询librknnrt.so库版本
strings /usr/lib/librknnrt.so | grep -i "librknnrt version"
官方文档要求,两者输入的版本必须一致。

我的板子执行上面的 命令查询rknn_server版本,结果没有返回任何信息,查询librknnrt.so返回的信息显示是1.5.0。

于是果断选择更新 rknn_server与librknnrt.so
首先github上下载rknpu
将下载下来的文件拷贝到板卡上,将下面对应文件拷贝对板卡的对应位置
sudo cp rknn-toolkit2/rknpu/runtime/Linux/rknn_server/aarch64/usr/bin/* /usr/bin/
sudo cp rknn-toolkit2/rknpu/runtime/Linux/librnkk_api/aarch64/librknnrt.so /usr/lib/
给rknn_server赋予可执行权限
sudo chmod +x /usr/bin/rknn_server
sudo chmod +x /usr/bin/start_rknn.sh
sudo chmod +x /usr/bin/restart_rknn.sh
紧接着重启服务
cd /usr/bin
./restart_rknn.sh
接下来控制台会有信息输出,打印出版本后,就可以用ctrl+c关闭掉
重新查看rknn_server与librknnrt.so版本,发现两者一致,并升级到2.3.0

注意,若使用strings命令发现 -bash: strings:未找到命令
则需要安装strings命令
sudo apt-get update
sudo apt-get install binutils
在板端配置rknn-toolkit2
其实配置rknn-toolkit2环境,官方推荐在linux x86电脑上配置,在上面进行模型pt-onnx-rknn转化,最后将rknn模型及其推代码部署到板端。我这里直接在板端配置rknn-toolkit2
将事先下载好的rknn-toolkit2文件夹上传到板端,在rknn-toolkit2/rknn-toolkit2/packages/arm64中安装对应的rknn-toolkit。先安装requirement.txt,我这里选择的是arm64_requirements_cp310.txt,然后安装对应的whl,我这里选择的是rknn_toolkit2-2.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl


我这是在板端用miniconda虚拟环境安装的。若执行以下命令没有报错,则安装rknn-toolkit2成功。
$ python3
>>> from rknn.api import RKNN
pt模型转onnx模型
这里需要下载瑞芯微官方github上推出的yolo8,项目名称叫做ultralytics_yolov8,这个项目其实就瑞芯微为了yolo8能更好的适配自家芯片,在ultralytics官方项目微改得来的,其使用方式跟Ultralytics基本无差别,可以用它训练自己的模型,也可以用官方ultraltics训练模型,但如果想要将自己训练好的yolo8 pt模型转化为onnx,以便于后续将onnx转换为rknn模型,这里一定要使用瑞芯微的ultralytics_yolov8将pt模型转化为onnx。这里简单解释一下瑞芯微的ultralytics_yolov8相比官方ultralytics的改动及其原因:
在基于不影响输出结果, 不需要重新训练模型的条件下, 有以下改动:
修改输出结构, 移除后处理结构(yolo8后处理结果对于rknn量化不友好)
dfl 结构在 瑞芯微NPU 处理上性能不佳,移至模型外部的后处理阶段,此操作大部分情况下可提升推理性能。
模型输出分支新增置信度的总和,用于后处理阶段加速阈值筛选。
以上移除的操作, 均需要在外部使用CPU进行相应的处理. (对应的后处理代码可以在 RKNN_Model_Zoo 中找到)
将下载好的ultralytics_yolov8上传到板端,并配置ultralytics_yolov8所需的依赖,建议pip install ultralytics,自动安装完依赖之后,在卸载掉ultralytics,因为我们要使用瑞芯微的ultralytics_yolo8(跟官方ultralytics所需依赖一模一样), 只借助pip install ultralytics自动安装依赖。
从瑞芯微官方github网站下载ultralytics_yolo8项目,把自己训练好的pt模型放到项目目录下,

在ultralytics_yolov8\ultralytics\cfg\default.yaml中修改模型地址为自己的模型地址
接下来使用下面的命令用瑞芯微提供的ultralytics_yolo8将pt转换为onnx。
export PYTHONPATH=./
python ./ultralytics/engine/exporter.py
此时在ultralytics目录下产生onnx文件,用netron打开onnx文件可以看到模型的输出是下面这个样子的

onnx转rknn
onnx转rknn及其推理代码可以在rknn_model_zoo中找到,下载rknn_model_zoo上传到板端,
将导出的onnx复制到 rknn_model_zoo/examples/yolov8/python
修改convert.py中 DEFAULT_RKNN_PATH变量,这个变量是定义转化后rknn的保存路径,我把它设置为当前目录
运行下面的脚本将onnx转换为rknn
python convert.py <onnx_model> <TARGET_PLATFORM> <dtype(optional)> <output_rknn_path(optional)># such as:
python convert.py fall_down.onnx rk3568
# output model will be saved as ../model/yolov8.rknn
```*Description:*- `<onnx_model>`: Specify ONNX model path.
- `<TARGET_PLATFORM>`: Specify NPU platform name. Such as 'rk3588'.
- `<dtype>(optional)`: Specify as `i8`, `u8` or `fp`. `i8`/`u8` for doing quantization, `fp` for no quantization. Default is `i8`.
- `<output_rknn_path>(optional)`: Specify save path for the RKNN model, default save in the same directory as ONNX model with name `yolov8.rknn`

此时,在该目录下生成rknn模型,后续可以用于推理。
rknn模型推理
推理代码包含c++和python版本的都可以在rknn_model_zoo/examples中找到。
比如yolo8 rknn的python推理就在rknn_model_zoo/examples/yolov8/python/yolov8.py中,在这个py文件中,只需要更改一下模型地址、模型标签、推理尺寸......即可实现推理自己的rknn模型,这里比较简单,可以自己去查看源码,这里不做演示。
总结,瑞芯微教程基本上都可以在ultralytics_yolo8、rknn_toolkit2、rknn_model_zoo这三个项目的doc目录下找到,模型量化、转化、推理、部署等教程都在这里面。不仅是yolo8部署教程、包括其他yolo版本都可以找到教程。总之,关于rknn的一切教程都在ultralytics_yolo8、rknn_toolkit2、rknn_model_zoo这三个项目中。
附:RKNN 查看NPU相关的命
# 查看驱动版本
cat /sys/kernel/debug/rknpu/version结果:RKNPU driver: v0.8.2# 查看电源状态
cat /sys/kernel/debug/rknpu/power
结果 off# 查看NPU使用率,需要root权限
cat /sys/kernel/debug/rknpu/load
结果 NPU load: Core0: 0%, Core1: 0%, Core2: 0%,# 查看NPU可用的频率,然后设置频率
cat /sys/class/devfreq/fdab0000.npu/available_frequencies结果300000000 400000000 500000000 600000000 700000000 800000000 900000000 1000000000echo userspace > /sys/class/devfreq/fdab0000.npu/governor
结果:无echo 1000000000 > /sys/class/devfreq/fdab0000.npu/userspace/set_freq
结果:无# 查看NPU当前工作频率
cat /sys/kernel/debug/rknpu/freq
结果:1000000000NPU其他相关
# 查看librknnrt库版本
strings /usr/lib/librknnrt.so | grep "librknnrt version"结果:librknnrt version: 1.4.0 (a10f100eb@2022-09-09T09:07:14)
# 查看rknn_server版本
strings /usr/bin/rknn_server | grep build
结果:1.3.0 (121b661 build: 2022-04-29 11:12:02)
.note.gnu.build-id
# 查看NPU驱动版本
dmesg | grep -i rknpu
结果
[187804.047298] RKNPU fdab0000.npu: RKNPU: set rknpu freq: 1000000000, volt: 787500
[187806.290136] RKNPU fdab0000.npu: RKNPU: set rknpu freq: 1000000000, volt: 787500
# 或者
sudo cat /sys/kernel/debug/rknpu/version
相关文章:
RK3568部署yolo8记录
本教程记录自己一下在RK3568上部署yolo8的步骤 板端驱动 在板端,首先查看rknpu驱动是否安装、存在。若键入下面的命令有返回则,证明驱动已安装。 dmesg | grep -i rknpu 瑞芯微官方说,驱动版本最好大于0.9.2。但是我看有的博主说ÿ…...
数据可视化复习2-绘制折线图+条形图(叠加条形图,并列条形图,水平条形图)+ 饼状图 + 直方图
目录 目录 一、绘制折线图 1.使用pyplot 2.使用numpy 编辑 3.使用DataFrame 编辑 二、绘制条形图(柱状图) 1.简单条形图 2.绘制叠加条形图 3.绘制并列条形图 4.水平条形图 编辑 三、绘制饼状图 四、绘制散点图和直方图 1.散点图 2…...
JavaScript原生深拷贝方法 structuredClone使用
structuredClone 简介 structuredClone 是现代浏览器提供的原生 JavaScript 方法,用于深拷贝对象。它可以处理各种复杂数据结构,包括嵌套对象、数组、Date、Map、Set 等,且支持循环引用。 语法 const clone structuredClone(value);value:…...
SpringBoot无法使用jkd8问题
1. 解决SpringBoot无法使用jdk8问题 创建一个高 jkd 版本,如 jkd21 在创建项目后,将 pom.xml中的 jdk 版本改为8,找到下图所在位置修改即可。 此外将 SpringBoot 的版本修改为 2 开头的 如2.7.4 ,然后 刷新 Maven 项目即可。 在 …...
使用 Jina Embeddings v2 在 Elasticsearch 中进行后期分块
作者:来自 Elastic Gustavo Llermaly 在 Elasticsearch 中使用 Jina Embeddings v2 模型并探索长上下文嵌入模型的优缺点。 在本文中,我们将配置和使用 jina-embeddings-v2,这是第一个开源 8K 上下文长度嵌入模型,首先使用 semant…...
QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现
案例需求: 完成数据库插入,删除,修改,查看操作。 分为 插入,删除,修改,查看,查询 几个模块。 代码: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget…...
python json.dump()和json.dumps()的区别
用人话总结一下 json.dump()是针对文件的json和python的转换 json.dumps()主要是针对内容数据 json.dumps(obj, skipkeysFalse, ensure_asciiTrue, check_circularTrue, allow_nanTrue, clsNone, indentNone, separatorsNone, encoding“utf-8”, defaultNone, sort_keysFalse…...
网络流学习笔记
注:笔者是蒟蒻,所以本文几乎是干货,枯燥无味甚至可能会引人不适,请读者谨慎阅读。 为了笔者快爆掉的肝点个赞好吗??? Part.1 网络流基础定义 一个有向带权图 G ( V , E ) G(V,E) G(V,E) 是…...
Mybatis PLUS查询对List使用OR模糊查询
Mybatis PLUS查询对List使用OR模糊查询 1、版本2、代码3、效果 1、版本 Mybatis PLUS版本:3.5.7 注意:版本3.1.2及以下是需要return的 因当前为高版本,代码中已将 return 注释。 2、代码 QueryWrapper<Object> queryWrapper new Que…...
Debezium日常分享系列之:Debezium Engine
Debezium日常分享系列之:Debezium Engine 依赖打包项目在代码中输出消息格式消息转换消息转换谓词高级记录使用引擎属性异步引擎属性数据库模式历史属性处理故障 Debezium连接器通常通过部署到Kafka Connect服务来运行,并配置一个或多个连接器来监视上游…...
I.MX6U 裸机开发20. DDR3 内存知识
I.MX6U 裸机开发20. DDR3 内存知识 一、DDR3内存简介1. DDR发展历程SRAMSDRAMDDR1DDR2DDR3DDR4DDR5 2. 开发板资源3. DDR3的时间参数1. 传输速率2. tRCD3. CL 参数作用取值范围工作原理4. tRC参数原理单位与取值5. tRAS重要性及作用 二、I.MX6U MMDC 控制器1. MMDC简介…...
【R安装】VSCODE安装及R语言环境配置
目录 VSCODE下载及安装VSCODE上配置R语言环境参考 Visual Studio Code(简称“VSCode” )是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代Web和云应用的跨平台源代码编辑器&…...
ES更新问题 Failed to close the XContentBuilder异常
问题描述 使用RestHighLevelClient对文档进行局部更新的时候报错如下: Suppressed: java.lang.IllegalStateException: Failed to close the XContentBuilderat org.elasticsearch.common.xcontent.XContentBuilder.close(XContentBuilder.java:1011)at org.elast…...
svn-git下载
windows: svn 客户端:-------------- TortoiseSVN 安装 下载地址:https://tortoisesvn.net/downloads.html, 页面里有语言包补丁的下载链接。 目前最新版为 1.11.0 下载地址: https://osdn.net/projects/tortoisesvn/storage/1.…...
10个Word自动化办公脚本
在日常工作和学习中,我们常常需要处理Word文档(.docx)。 Python提供了强大的库,如python-docx,使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本,帮助新…...
Paddle Inference部署推理(十八)
十八:Paddle Inference推理 (C)API详解 3. 使用 CPU 进行预测 注意: 在 CPU 型号允许的情况下,进行预测库下载或编译试尽量使用带 AVX 和 MKL 的版本 可以尝试使用 Intel 的 MKLDNN 进行 CPU 预测加速,默…...
Redis开发02:redis.windows-service.conf 默认配置文件解析与注解
文件位置:redis安装目录下的 redis.windows-service.conf ,存放了redis服务的相关配置,下面列举出默认配置的含义: 配置项含义bind 127.0.0.1限制 Redis 只监听本地回环地址,意味着只能从本地连接 Redis。protected-m…...
redis大key和热key
redis中大key、热key 什么是大key大key可能产生的原因大key可能会造成什么影响如何检测大key如何优化删除大key时可能的问题删除大key的策略 热key热key可能导致的问题解决热key的方法 什么是大key 大key通常是指占用内存空间过大或包含大量元素的键值对。 数据量大ÿ…...
Dubbo 最基础的 RPC 应用(使用 ZooKeeper)
看国内的一些项目时 Dubbo 这个词经常闪现,一直也不以为然,未作搜索,当然也不知道它是做什么用的。直到最近阅读关于大型网站架构相关的书中反复提到 Dubbo 后,觉得不能再对它视而不见。Google 了一下,它是在阿里巴巴创…...
科技赋能:企业如何通过新技术提升竞争力的策略与实践
引言 在当今瞬息万变的商业环境中,科技的迅猛发展正在重新定义行业的游戏规则。无论是小型企业还是跨国巨头,都感受到数字化转型的迫切需求。过去,企业竞争力更多依赖于成本控制、资源调配或市场覆盖,而如今,新技术的引…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
