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/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.mzph.cn/news/820150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AppleScript初体验,让你的mac实现自动化UI操作

AppleScript 简介 AppleScript是苹果公司开发的一种脚本语言,用于操作MacOS及其应用程序,在实现MacOS自动化工作方面非常给力。 我们可以使用AppleScript用来完成一些重复琐碎的工作,AppleScript具有简单自然的语法,另外系统也提…

【DM8】ET SQL性能分析工具

通过统计SQL每个操作符的时间花费,从而定位到有性能问题的操作,指导用户去优化。 开启ET工具 INI参数: ENABLE_MONITOR1 MONITOR_SQL_EXEC1 查看参数 select * FROM v$dm_ini WHERE PARA_NAMEMONITOR_SQL_EXEC;SELECT * FROM v$dm_ini WH…

系统学c#:1、基础准备(软件下载与安装)

一、Vs软件下载与安装 访问Visual Studio官方网站: https://visualstudio.microsoft.com/zh-hans/downloads 下载Visual Studio 运行exe文件,点击“继续” 初始文件安装完成后选择我们需要安装的项,并勾选好必要的单个组件,设…

【Java框架】Spring框架(二)——Spring基本核心(AOP)

目录 面向切面编程AOPAOP的目标:让我们可以“专心做事”专心做事专心做事解决方案1.0专心做事解决方案2.0蓝图 AOP应用场景AOP原理AOP相关术语术语理解 AOP案例实现前置/后置/异常/最终增强的配置实现1.依赖2.业务类3.日志类4.配置切入点表达式匹配规则举例 环绕增强…

[linux]进程控制——进程终止

一、main函数的返回值 我们在编写C语言的程序时,通常会这样写: int main() {return 0; } 那么我们为什么要返回(return)0 呢? 其实,main函数也是一个函数,它也会被调用,所以谁调…

牛客周赛 Round 39(A,B,C,D,E,F,G)

比赛链接 官方题解(视频) B题是个贪心。CD用同余最短路,预处理的完全背包,多重背包都能做,比较典型。E是个诈骗,暴力就完事了。F是个线段树。G是个分类大讨论,出题人钦定的本年度最佳最粪 题目…

RT-Thread学习

RT-Thread三个版本——标准版本 RT-Thread,全称是Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务:一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务…

HCIP【ospf综合实验】

目录 实验要求: 实验拓扑图: 实验思路: 实验步骤: 一、划分网段 二、配置IP地址 三、搞通私网和公网 (1)先搞通私网(基于OSPF协议,在各个路由器上进行网段的宣告&#xff0c…

实现智能水控 | 基于ACM32 MCU的分体式水控方案

分体式水控概述 分体式水控是一种常见的水控系统,它的工作原理是通过水的流动来控制水的供应和排放,该系统一般由两部分组成:控制器和水阀。控制器负责监测水的流量和压力,根据设定的参数来控制水阀的开和关,从而实现水…

2024认证杯数学建模A题保暖纤维保暖能力原创论文讲解(含完整python代码)

大家好呀,从发布赛题一直到现在,总算完成了认证杯数学中国数学建模网络挑战赛第一阶段A题目保暖纤维的保暖能力完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品…

windows下vscode调试虚拟机linux c++工程的三种方法

vscode去远程调试方法有很多种,不同的插件对应了不同的调试方法,比如: 1.C/C插件进行GDB调试(编写launch.json文件) 2.C/C Runner插件 3.CMake Tools插件(只针对CMake工程,需要搭配C/C插件一起使用,但无…

Gin框架小结

Gin 简介 Gin是一个轻量级的Web框架,用于构建高性能的Go语言Web应用程序。提供了路由管理、中间件支持、参数绑定和验证、错误处理、静态文件服务等功能。 Gin框架解决了什么问题和痛点 1.golang http 标准库本身提供了比较简单的路由注册能力,只支持…

记录一次内存溢出

1、查看catalina相关日志,确定关键字相关行号 文件:catalina.out命令1:cat -n catalina.out |grep -a OutOfMemoryError与内存溢出相关的如上,每一个行号其实都对应到具体时间点。可以发现,这个范围相符合&#xff1…

清明三天,用Python赚了4万?

每年4月,是Python圈子里接私活的旺季,特别是在节假日这种数据暴增的时间段,爬虫采集、逆向破解类的私活订单会集中爆发,量大价高。几乎所有的圈内人都在趁着旺季接私活。 正好,我昨天就做了一单爬虫逆向私活&#xff…

引领软件供应链安全 比瓴科技位居安全牛全景图第一

近日,安全牛第十一版《中国网络安全行业全景图》正式发布,比瓴科技入选全景图软件供应链安全赛道中开发流程安全管理、DevSecOps和软件成分分析三个重要细分领域,并位居开发流程安全管控领域第一。 安全牛本次全景图研究工作于23年正式启动&a…

什么是云安全?云安全包含哪些方面?

云计算彻底改变了数据存储的世界,它使企业可以远程存储数据并随时随地从任何位置访问数据。存和取变得简单,也使得云上数据极易造成泄露或者被篡改,所以云安全就显得非常重要了。那么什么是云安全?云安全的工作原理是什么&#xf…

做一个好的程序员难吗?只需要这10个习惯

在这个世界上,有数以百万计的人对软件开发充满热情,他们有很多名字,如软件工程师、程序员、编码员、开发人员。一段时间后,这些人可能会成为一名优秀的编码员,并且他们将非常熟悉如何使用计算机语言完成工作。但是&…

EasyRecovery激活秘钥2024最好用的电脑数据恢复软件下载

EasyRecovery数据恢复软件是一款专业且功能强大的数据恢复工具,它旨在帮助用户从各种存储设备中恢复由于各种原因(如误删除、格式化、病毒攻击、系统崩溃等)导致丢失的数据。这款软件支持多种存储介质,包括但不限于硬盘驱动器、U盘…

0.5W 3KVDC 隔离 单输出 DC/DC 电源模块 ——TPR-W5 系列

TPR-W5系列是一款需要隔离和电压转换的产品,工业级环境温度,温度范围从–40℃到105℃,用于PCB安装的国际标准结构。此系列产品小巧,效率高,低输出纹波及提供3000V以上的直流电压隔离,用于需要隔离的场合&am…

【Spring系列】- Spring事务底层原理

实验准备 配置文件 首先在配置文件中配置jdbcTemplate和事务管理器,并且需要开启事务的注解EnableTransactionManagement以及Configuration注解 ComponentScan("com.lyd") EnableTransactionManagement Configuration public class ApplicationConfig …