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

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/packages

pip 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.mfbz.cn/a/548544.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue+Mysql的论坛管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

图深度学习(一):介绍与概念

目录 一、介绍 二、图的数据结构 三、图深度学习的基本模型 四、图深度学习的基本操作和概念 五、训练过程 六、主要应用场景 七、总结 一、介绍 图深度学习是将深度学习应用于图形数据结构的领域,它结合了图论的概念和深度学习的技术,用以处理和…

刷新认知,Python中循环结构可以这么简单?

应用场景 我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景。例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令。 在这个场景中,让机器人向…

大数据建模理论

文章目录 一、数仓概述1、数据仓库概念1.1 概述1.2 数据仓库与数据库的区别1.3 技术选型和架构 2、数仓常见名词2.1 实体2.2 维度2.3 度量2.4 粒度2.5 口径2.6 指标2.7 标签2.8 自然键/持久键/代理键2.9 退化维度2.10 下钻/上卷2.11 数据集市 3、数仓名词之间关系3.1 实体表&am…

这个项目我投了,给 OceanBase 数据库诊断提提速!

1. 前言 昨天晚上公司内部直播分享了一下OceanBase敏捷版诊断工具obdiag,主要的目的是拉齐一下前线和后端开发人员的诊断OceanBase问题的信息,众人拾柴火焰高,大家一起把obdiag做起来。晚上回去想了想,obdiag既然是开源项目&…

SiLM5350系列带米勒钳位的单通道隔离驱动器 助力汽车与工业应用实现稳定与高效的解决方案

带米勒钳位的隔离驱动SiLM5350系列 单通道 30V,10A 带米勒钳位的隔离驱动 具有驱动电流更大、传输延时更低、抗干扰能力更强、封装体积更小等优势, 为提高电源转换效率、安全性和可靠性提供理想之选。 SiLM5350系列产品描述: SiLM5350系列是单通道隔离驱…

[入门]测试原则-ApiHug准备-测试篇-002

🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 写在前面…

GT资源-CPLL QPLL

一、前言 QPLL与CPLL是两种为GT Channel提供时钟的锁相环,其中CPLL与GT Channel绑定,每一个通道都有一个CPLL,而QPLL是与Quad绑定,每一个Quad有一个QPLL,4个通道共享一个QPLL 二、CPLL 每个GTX/GTH收发器通道包含一…

luigi,一个超级厉害的 Python 库!

什么是 Python Luigi? Python Luigi 是一个用于构建复杂数据处理管道(工作流)的Python模块。Luigi由Spotify开发并维护,旨在简化和管理大规模数据处理任务的执行。 关键特点包括: 1.任务定义: Luigi允许…

TypeError: Cannot read properties of undefined (reading ‘tapAsync‘)

项目启动,一直报tabAsync未定义,整个项目中没有找到引用的地方; 最终重新安装webpack4版本 解决问题; npm install webpack4

【重回王座】ChatGPT发布最新模型gpt-4-turbo-2024-04-09

今天,新版GPT-4 Turbo再次在大型模型排行榜上荣登榜首,成功超越了此前领先的Claude 3 Opus。另外,新模型在处理长达64k的上下文时,性能竟能够与旧版在处理26k上下文时的表现相当。 目前GPT-4 Turbo仅限于ChatGPT Plus的用户&…

苍穹外卖项目总结1-12

苍穹外卖 文章标题地址苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/article/details/135484126苍穹外卖Day03——总结3https://lushimeng.blog.csdn.net/article/details/1363788…

PyTorch与深度学习:探索现代神经网络的魅力

在科技飞速发展的今天,深度学习作为人工智能领域的重要分支,已经在图像识别、自然语言处理、语音识别等多个领域取得了突破性的进展。而PyTorch,作为一款开源的深度学习框架,以其简洁易用、动态计算图等特性,赢得了广大…

修改百度百科的条件

百度百科,作为全球最大的中文百科全书,每天吸引着无数用户前来浏览和编辑。然而,要修改百度百科的内容,并非易事。本文将详细介绍修改百度百科的条件,帮助有志于参与编辑的用户更好地了解并做好准备。 1. 注册百度账号…

2024 计算机毕业设计之SpringBoot+Vue项目合集(源码+L文+PPT)

各位朋友大家好,有幸与屏幕前你们相识,博主现已经搬砖9年,趁着头发还充裕,希望给大家提供一些编程领域的帮助,深知计算机毕业生这个阶段的崩溃与闹心,让我们共同交流进步。 博主给大家列举了项目合集&#…

Springboot+Vue项目-基于Java+MySQL的房产销售系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

【从浅学到熟知Linux】进程控制上篇=>进程创建、进程终止与进程等待(含_exit与exit的区别、fork函数详解、wait与waitpid详解)

🏠关于专栏:Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 🎯每天努力一点点,技术变化看得见 文章目录 进程创建fork函数写时拷贝 进程退出进程退出操作系统做了什么?进程退出场景进程退出的常见方法…

Vue3 + Element-Plus 使用 Table 预览图片发生元素遮挡

Vue3 Element-Plus 使用 Table 预览图片发生元素遮挡 问题代码问题重现解决方法最终效果 问题代码 <el-table-column label"视频" align"center"><template #default"scope" style"display: flex;"><div style"…

【RV1106的ISP使用记录之基础知识】硬件连接关系与设备树的构建

RV1106具备2个mipi csi2 dphy硬件&#xff0c;1个VICAP硬件和1个ISP硬件。其中&#xff1a; 1、mipi csi2 dphy 用于对数据流的解析&#xff0c;支持MIPC,LVDS,DVP三种接口&#xff1b; 2、VICAP用于数据流的捕获&#xff1b; 3、ISP用于对图像数据进行处理&#xff1b; 这三个…

架构设计-灰度发布系统架构设计

灰度发布的定义 互联网产品需要快速迭代开发上线&#xff0c;又要保证质量&#xff0c;保证刚上线的系统&#xff0c;一旦出现问题可以很快控制影响面&#xff0c;就需要设计一套灰度发布系统。 灰度发布系统的作用&#xff0c;可以根据配置&#xff0c;将用户的流量导到新上…
最新文章