yolov8目标检测 部署瑞芯微rk3588记录

news/2024/5/3 1:27:04
1. 前置条件

本地电脑系统,ubuntu20.04

训练代码:

训练代码下载的ultralytics官方代码

SHA:6a2fddfb46aea45dd26cb060157d22cf14cd8c64

训练代码仅做数据修改,类别修改,代码结构未做任何修改

需要准备的代码:

pt转onnx :

git clone https://github.com/airockchip/ultralytics_yolov8.git
cd ultralytics_yolov8
git checkout 5b7ddd8f821c8f6edb389aa30cfbc88bd903867b

onnx转rknn:

#环境所需要的包
https://github.com/airockchip/rknn-toolkit2/releases/tag/v1.6.0#转换所需要的代码
https://github.com/airockchip/rknn_model_zoo/releases/tag/v2.0.0

rknn仿真和板卡上所需要的代码

#和onnx转rknn是一个代码
https://github.com/airockchip/rknn_model_zoo/releases/tag/v2.0.0
2. pt转onnx

这里参照这位大佬的方案,rk3588's yolov8 model conversion from pt to rknn | Memories,这里只取他pt转onnx的部分,如下图部分

步骤跟他的一模一样,使用他制作的镜像环境,我本地试过,不使用他的环境也行,可以使用训练代码的环境进行导出,我本地用conda创建的一个python=3.9的环境,安装的最新的pytorch和ultralytics。

使用他给的链接拉取的转换代码后,需要修改的地方只有一处,如图所示,改成自己模型的名字,mode:export

然后将自己的pt模型放到下载的ultralytics_yolov8根目录下,如图所示

按照他的教程执行,主要这一句export 一定要执行!!!,执行完后会在pt文件同级目录下会生成的onnx文件,如上图所示,我执行完之后,生成了drone.onnx

3. onnx转rknn
3.1. rknn环境安装
  • 我的本地电脑系统为ubuntu20.04,下载rknn_toolkit2的1.6.0版本(这里和板卡上使用的toolkit2-2.0.0 版本不一致,但是可以正常推理,一致的版本我还没试过),下载地址

Release v1.6.0 · airockchip/rknn-toolkit2 · GitHub

  • rknn环境安装
#下载toolkit2代码后解压,使用conda创建一个python=3.9的环境
conda create -n npu-test python=3.9#激活环境,安装必要的库
conda activate npu-test#进入到1.6版本的rknn-toolkit2文件夹下
cd rknn-toolkits-1.6.0/rknn-toolkits/packages#依赖库安装
pip install -r requirements_cp39-1.6.0.txt -i https://pypi.tuna.tsinghua.edu.cn/simple#这里使用清华源安装会比较快,但是一般情况会报一个错误,有一个库下载不下来,如下图

继续在这里输入以下内容进行安装,tf-es那一坨从终端里面进行复制,避免敲错了

pip install tf-estimator-nightly==2.8.0.dev2021122109 -i https://pypi.org/simple

执行完后,如图所示,tf-es就安装成功了

紧接着再继续安装requirements中的剩余的依赖库,重新执行

pip install -r requirements_cp39-1.6.0.txt -i https://pypi.tuna.tsinghua.edu.cn./simple

所有库都安装好以后,开始安装rknn包,进入到下载的1.6.0版本的rknn-toolkit2文件夹下

cd rknn-toolkits-1.6.0/rknn-toolkits/packagespip install rknn_(按Tab自动弹出来)-cp39(按Tab补充完整) .whl

安装完成后,如下图所示,则表示rknn环境已经安装好了

3.2. rknn模型转换
  • 下载rknn_model_zoo,我使用的是2.0.0的版本

Release v2.0.0: Support RK3576 and RKNPU1 · airockchip/rknn_model_zoo · GitHub

  • 下载完成后解压,进入目录rknn_model_zoo/examples/yolov8/model,修改coco_80_labels_list.txt内容,修改为自己模型对应的类别

因为我只有2类别,人和车,所以我把文件修改为以下内容 (一定要和训练的时候训练集名字对应)

  • 开始转换

激活rknn虚拟环境

conda activate npu-test

进入到下载的rknn_model_zoo中yolov8的示例中

cd rknn_model_zoo/examples/yolov8/python

如图所示

此时拷贝第2步中转换的onnx模型路径,我是把转换得到的onnx拷贝到该路径下的,

rknn_model_zoo/examples/yolov8/model

然后执行以下命令开始转换,

python convert.py ../model/drone.onnx rk3588

如下图开始转换

等待片刻,导出完成,如图所示

转换完成后会在onnx文件同目录下得到一个名为yolov8.rknn模型

4. 板卡环境配置
3.1 rk3588板卡环境

rk3588的系统为Linux系统,版本为 ubuntu20.04

3.2 npu2 驱动版本

连接上板卡输入 dmesg | grep -i rknpu,如图所示,npu驱动版本为 0.8.8

在rknn_toolkit2 doc的官方文档中01_Rockchip_RKNPU_Quick_Start_RKNN_SDK_V2.0.0beta0_CN.pdf

中建议驱动版本大于 0.9.2,但是由于没找到对应的驱动版本,手里的版本驱动只有 0.7.2和 0.8.8两个版本, 都测试过,均可完成正常推理。

3.3 npu环境

进入板卡系统,输入以下指令

查询 rknn server版本

strings /usr/bin/rknn_server | grep -i "rknn_server version"

查询 librknnrt.so库版本

string /usr/lib/librknnrt.so | grep -i "librknnrt version"

注意:二者的版本必须一致

若输出不一致,需要做以下处理,下载rknn_toolkit2,我使用的是rknn_toolkit2-v2.0.0版本

Release v2.0.0-beta0: Update RK3562/RK3566/RK3568/RK3576/RK3588/RV1103/RV1106 NPU SDK to V2… · airockchip/rknn-toolkit2 · GitHub

  • 将下载下来的文件拷贝到板卡上,将下面对应文件拷贝对板卡的对应位置
sudo cp rknn-toolkit2/rknpu/runtime/Linux/rknn_server/aarch64/usr/bin/* /usr/bin/
sudo cp rknn-toolkit2/rknpu/runtime/Linux/librnkk_api/aarch64//* /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关闭掉

若开始使用strings查询版本不一致,或者没有打印或者版本过低,此时再查询板卡npu版本,二者版本一致才行

5. adb仿真

adb仿真就是使用在电脑上配置上rk环境,然后使用typeC连接电脑和板卡,使用电脑环境仿真rk板卡的推理,目的是验证rknn模型是否正常,如果能正常推理,说明rknn的整个转换过程是正常的,否则就是找rknn转换问题了,如果上述步骤都是正常进行的,这adb仿真可以略过

心得:踩坑半个月,一直没找到无法正常推理的原因,也不知道是模型转换问题还是c++代码问题,所以找到rknn_model_zoo说明文档,尝试使用adb连接仿真,最后发现官方download下来的onnx转换rknn后可以推理,但是自己的模型转换rknn就不行,才发现是自己转换的onnx模型不对,这样才一步一步找原因,最后才找到正确的转换方法。

  • 本地电脑安装adb
sudo apt install adb
  • 查询板卡device id
adb devices

执行完后,如果连接正常,如下图会打印设备的device id,复制该id,下面会使用

adb仿真还是使用第3步骤中的rknn_model_zoo,进入目录rknn_model_zoo/examples/yolov8/python,修改yolov8.py代码,CLASSES修改为自己模型的类别, coco_id_list修改为自己模型对应的序号,我这里就是二分类,我的修改内容如图所示

搜索main函数,还需要修改以下内容

--model_path那一行 default修改为 自己导出的rknn模型的绝对路径

--target那一行 default修改为 rk588

--device_id那一行, default修改为上一步中复制下来的device id

--img_show那一行, default修改为 True, 仿真时候会显示仿真的推理结果

将待测试的图片放到py文件的上一级的model路径下,如图所示

然后在电脑端,conda进入第3步创建rknn虚拟环境中,执行python yolov8.py,如果顺利的话,执行完就会在电脑上显示推理结果,能正常推理的话,表示rknn模型无误,可以进行下一步的c++板卡部署。

注意:如果这里报错了,进入板卡终端,进入/usr/bin目录下,执行./restart_rknn.sh 不关闭,然后再在电脑端进入rknn虚拟环境,再执行python yolov8.py进行仿真推理

6. 板卡c++部署
  • 修改源码

现将第3步中用到的rknn_model_zoo推送到板卡中,修改rknn_model_zoo中关于yolov8的代码,修改代码的路径为: /rknn_model_zoo/examples/yolov8/cpp/postprocess.h

第12行代码,#define OBJ_CLASS_NUM 修改为自己需要检测的目标类别数量

我自己需要检测两类,所以这里我修改为 #define OBJ_CLASS_NUM 2,如图所示

  • 开始编译

进入rknn_model_zoo根目录下,执行以下命令开始编译

先给脚本权限

chmod 777 build-linux.sh

再编译

./build-linux.sh -t rk3588 -a aarch64 -d yolov8
  • 编译完成后会在跟目录下生成install文件夹

一直按Tab直到进入最里面文件夹,我本地的路径为:

rknn_model_zoo/install/rk3588_linux_aarch64/rknn_yolov8_demo

该路径下,有一个可执行文件rknn_yolov8_demo以及一个model和一个lib文件夹内,修改model下的coco文本文件,修改为自己需要检测目标类别

  • 开始推理
./rknn_yolov8_demo [rknn路径] [图片路径]

执行完成后,会在rknn_yolov8_demo下生成out.png文件,将该图片导出到电脑可以验证推理是否正确


http://www.mrgr.cn/p/33801274

相关文章

Oracle数据库 :查询表结构脚本

查询脚本 : SELECT CASE WHEN a.column_id1 THEN a.TABLE_NAME ELSE END AS 表名, a.column_id AS 序号, a.column_name as 列名, REPLACE(comments, CHR(10), ) as 列说明, a.data_type || ( || a.data_length || ) as 数据类型, a.DATA_LENGTH AS 长度, a.DATA_…

8thWall vs. AR.js

对于熟悉 JavaScript、WebGL 和 HTML5 等 Web 技术的数字创作者来说,8th Wall 提供了功能丰富且强大的 AR 开发平台,尽管价格较高。 然而,新手开发人员和专注于基于标记的 AR 的开发人员可能会发现 AR.js 更易于使用且更经济实惠。 1、8th Wa…

【单调栈】力扣85.最大矩形

好久没更新了 ~ 我又回来啦! 两个好消息: 我考上研了,收到拟录取通知啦!开放 留言功能 了,小伙伴对于内容有什么疑问可以在文章底部评论,看到之后会及时回复大家的! 前面更新过的算法&#x…

重构国内游戏账号登录系统的思考和实践

本期作者 背景 账号登录系统,作为游戏发行平台最重要的应用之一,在当前的发行平台的应用架构中,主要承载的是用户的账号注册、登录、实名、防沉迷、隐私合规、风控等职责。合规作为企业经营的生命线,同时,账号登录作为…

在线编辑器 CodeMirror

如何优雅的在网页显示代码 如果开发在线编辑器 引入资源&#xff1a; <link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.60.0/codemirror.min.css"><script src"https://cdnjs.cloudflare.com/ajax/libs/c…

AI极速批量换脸!Roop-unleashed下载介绍,可直播

要说AI换脸领域,最开始火的项目就是Roop了,Roop-unleashed作为Roop的嫡系分支,不仅继承了前者的强大基因,更是在功能上实现了重大突破与升级 核心特性 1、可以进行高精度的图片、视频换脸,还能实时直播换脸,换脸效果真实、自然 2、不仅支持N卡处理程序(cuda),还额外提…

AI大模型日报#0416:李飞飞《2024年人工智能指数报告》、Sora加入Adobe、李彦宏聊百度大模型之路

​导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 刚刚&#xff0c;李飞飞团队发布《2024年人工智能指数报告》&#xff1a;10大趋势&#xff0c;揭示AI大模型的“喜”与“忧” 摘…

uni-app如何生成骨架屏

为什么需要骨架屏&#xff1a;为了缓解用户打开程序时等待接口的焦虑情绪 1.打开微信开发者工具&#xff0c;找到模拟器中的页面信息&#xff0c;选择生成骨架屏 2.将生成的wxml代码复制到vscode&#xff0c;在index的components中新建一个vue文件&#xff0c;只需保留请求接口…

使用Lagent AgentLego 搭建智能体

对于这个作业,这里只给出截图,不给详细过程,因为确实没有什么好写的。具体的步骤可以查看官方教程。 作业要求 基础作业完成 Lagent Web Demo 使用,并在作业中上传截图。文档可见 Lagent Web Demo 完成 AgentLego 直接使用部分,并在作业中上传截图。文档可见 直接使用 Age…

CentOS7 boa服务器的搭建和配置

环境是CentOS7&#xff0c;但方法不局限于此版系统&#xff0c;应该是通用的。 具体步骤如下&#xff1a; 1. 下载boa源码 下载地址: Boa Webserver 下载后&#xff0c;进入压缩包所在目录&#xff0c;进行解压&#xff1a; tar xzf boa-0.94.13.tar.gz 2. 安装需要的工具b…

RILIR 复现 一些 idea

伪代码:在 if done 的时候,在环境中已经跑了一个 trajectory 了,利用当前的 trajectory 和专家的 demo 求一下 reward(文章中用的是 optimal transport 的几种方法) 否则,就继续在 observation 的基础上利用 actor 学到的策略 sample 出 action,并用 list 记录下当前的 …

PolarDB MySQL 版 Serverless评测|一文带你体验什么是极致弹性|后续

PolarDB MySQL 版 Serverless评测|一文带你体验什么是极致弹性|后续 弹性压测三后续自动缩容全局一致性测试测评体验 在上一篇PolarDB MySQL 版 Serverless测评博文中&#xff1a;https://developer.aliyun.com/article/1385834 关于弹性压测三通过增加只读节点压测来观测到Ser…

【C语言】多字节字符、宽字符(涉及字符集和编码)

字符集、编码&#xff1a; 字符集&#xff1a;一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称&#xff0c;包括各国家文字、标点符号、图形符号、数字等。例如&#xff1a;ASCII、Unicode、GB2312、GBK、GB18030、BIG5(繁体中文) ... 编码方式&#xff1a;符号…

【React】Ant Design自定义主题风格及主题切换

Ant Design 的自定义主题&#xff0c;对于刚入手的时候感觉真是一脸蒙圈&#xff0c;那今天给它梳理倒腾下&#xff1b; 1、自定义主题要点 整体样式变化&#xff0c;主要两个部分&#xff1a; 1.1、Design Token https://ant.design/docs/react/customize-theme-cn#theme 官…

MySQL基础-----约束详解

目录 一. 概述: 二.约束演示&#xff1a; 三.外键约束&#xff1a; 3.1介绍&#xff1a; 3.2外键约束语法&#xff1a; 3.3删除&#xff0c;更新行为&#xff1a; 一. 概述: &#x1f9d0;&#x1f9d0;概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制…

LCD显示器 --- 8080接口 和 RGB接口 的区别

主要介绍LCD显示的基本原理,涉及像素、分辨率、颜色模型、RGB888等格式、Framebuffer、8080接口、RGB接口。 1.LCD显示出图片的基本原理 LCD作为显示器,它的显示原理和图片是一样的。 图片可以看作由一个一个点(即像素pixel)组成。每行有xres个像素,有yres行,则这个图片的分…

Vue 3 项目构建与效率提升:vite-plugin-vue-setup-extend 插件应用指南

一、Vue3项目创建 前提是已安装Node.js&#xff08;点击跳转Node官网&#xff09; npm create vuelatest这一指令将会安装并执行 create-vue&#xff0c;它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示&#xff1a; ✔ Projec…

Ubuntu 22.04 解决和 Windows 共享蓝牙设备的问题

我有一个 Airpods,连接到 WIndows 可以正常工作,但连接到 ubuntu 后会无法连接,只能删除设备选择重联,但是这又会导致 Windows 不能连接到耳机,只能也删除重新连接,费神费力。 要解决此问题,仍有两办法,让 Windows 将就 Linux,或者 Linux 将就 Windows,由于折腾注册表…

【STM32+HAL库】---- 驱动MAX30102心率血氧传感器

硬件开发板:STM32F407VET6 软件平台:cubemax+keil+VScode1 MAX30102心率血氧传感器工作原理 MAX30102传感器是一种集成了红外光源、光电检测器和信号处理电路的高度集成传感器,主要用于心率和血氧饱和度的测量。以下是MAX30102传感器的主要特点和工作原理:红外光源:MAX301…

OO第一次博客作业

OO第一次博客作业 目录1.前言 2.设计与分析 3.采坑心得 4.改进建议 5.总结 1.前言 正则表达式是java语言中一种非常重要的语言,他的重要性主要体现在以下方面: 1.高效的文本处理:正则表达式提供了一种高效的方式来处理文本数据。它可以快速地进行字符串的搜索、匹配、替换和…