瑞芯微RK3588 C++部署Yolov8检测和分割模型

news2024/9/25 9:39:27

最近这一个月在研究国产瑞芯微板子上部署yolov8的检测和分割模型,踩了很多坑,记录一下部署的过程和遇到的一些问题:

1 环境搭建

需要的环境和代码主要包括:
(1)rknn-toolkit2-1.5.2:工具链,开发环境
(2)rockchip-yolov8:pt模型转onnx模型
(3)yolov8_onnx2rknn:在(2)的基础上转检测rknn模型
(4)yolov8seg_onnx2rknn:在(2)的基础上转分割rknn模型
在这里插入图片描述
最好使用对应的环境,环境不匹配的话会出现很多问题。

2 ubuntu docker环境

Docker容器主要用来进行模型转换,也就是pt转onnx的过程,因此docker中需要用的的包主要是rockchip-yolov8,需要修改该代码,进行模型的转换,在linux服务器上安装docker环境,创建一个ubuntu系统的docker环境
这一部分的修改代码参考山水无移大哥的部署过程,贼清洗,膜拜一下,少走了很多弯路,直接贴上地址。

3 模型转换问题

在转自己的pt到onnx模型时,容易出现以下问题:
(1)报错信息:

copying a param with shape torch.Size([64,64,3,3]) from checkpoint,the shape in current model is torch.Size(32,64,3,3)

在这里插入图片描述
主要的问题有两种:
1)在最后一步导出onnx时,yolov8s.yaml里面没有修改成自己的模型的类别信息;
2)自己训练的yolov8m模型,但是选择的yaml是yolov8s.yaml


from ultralytics import YOLO

# model = YOLO('/cytech_ai/sipingtest/rknntest/model/20230228_yolov8_LiftPerson_filter.pt')
# results = model(task='detect', mode='predict', source='/cytech_ai/sipingtest/rknntest/2.jpg', line_thickness=3, save=True, device='cpu')

model = YOLO('/cytech_ai/sipingtest/rknntest/rockchip-yolov8/ultralytics/cfg/models/v8/yolov8s.yaml')
results = model(task='detect', mode='predict', source='/cytech_ai/sipingtest/rknntest/2.jpg', line_thickness=3, save=True, device='cpu')

(2)多处修改时,最终的输出结果和分割模型的结果搞混了,导致模型输出对应不上:
在这里插入图片描述
在这里插入图片描述

4 RK3588上环境搭建

瑞芯微rk3588上,需要的环境主要是rknpu2,主要用来C++编写cmakelists文件时导入动态库和头文件,我这里将检测模型和分割模型全部集成到一个工程里面,分享一个个人的cmakelist文件:

cmake_minimum_required(VERSION 3.4.1)

# 声明一个 cmake 工程
set(PROJECT_NAME rknn_yolov8_AlgDetectModel)
project(${PROJECT_NAME})

set(CMAKE_CXX_STANDARD 11)


set(TARGET_SOC "rk3588")
set(CMAKE_C_COMPILER "aarch64")

# rknn api
if(TARGET_SOC STREQUAL "rk356x")
  set(RKNN_API_PATH ${CMAKE_SOURCE_DIR}/../../runtime/RK356X/${CMAKE_SYSTEM_NAME}/librknn_api)
  set(RKNN_API_PATH ${CMAKE_SOURCE_DIR}/../../runtime/RK356X/${CMAKE_SYSTEM_NAME}/librknn_api)
elseif(TARGET_SOC STREQUAL "rk3588")
  set(RKNN_API_PATH /home/siping/testrknn/rknpu2-1.5.2/runtime/RK3588/Linux/librknn_api/aarch64)
else()
  message(FATAL_ERROR "TARGET_SOC is not set, ref value: rk356x or rk3588 or rv110x")
endif()

if (CMAKE_SYSTEM_NAME STREQUAL "Android")
  set(RKNN_RT_LIB ${RKNN_API_PATH}/${CMAKE_ANDROID_ARCH_ABI}/librknnrt.so)
else()
  if (CMAKE_C_COMPILER MATCHES "aarch64")
    set(LIB_ARCH aarch64)
  else()
    set(LIB_ARCH armhf)
  endif()

  #直接链接这个库了
  set(RKNN_RT_LIB /home/siping/testrknn/rknpu2-1.5.2/runtime/RK3588/Linux/librknn_api/aarch64/librknnrt.so)
endif()

#链接头文件
include_directories(/home/siping/testrknn/rknpu2-1.5.2/runtime/RK3588/Linux/librknn_api/include)

#第三方依赖库
include_directories(${CMAKE_SOURCE_DIR}/../3rdparty)

# opencv
#if (CMAKE_SYSTEM_NAME STREQUAL "Android")
#    set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../3rdparty/opencv/OpenCV-android-sdk/sdk/native/jni/abi-${CMAKE_ANDROID_ARCH_ABI})
#else()
#  if(LIB_ARCH STREQUAL "armhf")
#    set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../3rdparty/opencv/opencv-linux-armhf/share/OpenCV)
#  else()
#    set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../3rdparty/opencv/opencv-linux-aarch64/share/OpenCV)
#  endif()
#endif()
#find_package(OpenCV REQUIRED)

#手动链接opencv480
set(OpenCV_DIR "/home/siping/thirdparty/opencv480/")
set(OpenCV_INCLUDE_DIRS "/home/siping/thirdparty/opencv480/include/opencv4")
set(OpenCV_LDFLAGS "/home/siping/thirdparty/opencv480/lib")

include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${OpenCV_LDFLAGS})

message(STATUS "OpenCV library status:")

message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
message(STATUS "    libraries: ${OpenCV_LDFLAGS}")

#rga
if(TARGET_SOC STREQUAL "rk356x")
  set(RGA_PATH ${CMAKE_SOURCE_DIR}/../3rdparty/rga/RK356X)
elseif(TARGET_SOC STREQUAL "rk3588")
  set(RGA_PATH ${CMAKE_SOURCE_DIR}/../3rdparty/rga/RK3588)
else()
  message(FATAL_ERROR "TARGET_SOC is not set, ref value: rk356x or rk3588")
endif()
if (CMAKE_SYSTEM_NAME STREQUAL "Android")
  set(RGA_LIB ${RGA_PATH}/lib/Android/${CMAKE_ANDROID_ARCH_ABI}/librga.so)
else()
  if (CMAKE_C_COMPILER MATCHES "aarch64")
    set(LIB_ARCH aarch64)
  else()
    set(LIB_ARCH armhf)
  endif()
  #链接库,就这一个
  set(RGA_LIB ${RGA_PATH}/lib/Linux//${LIB_ARCH}/librga.so)
endif()
include_directories( ${RGA_PATH}/include)


#瑞芯微 glog日志库
set(GLOG_INCLUDE "/home/siping/thirdparty/glog_arm64/include/")
set(GLOG_LIB "/home/siping/thirdparty/glog_arm64/lib")

include_directories(${GLOG_INCLUDE})
link_directories(${GLOG_LIB})

message(STATUS "GLOG library status:")
message(STATUS "    include path: ${GLOG_INCLUDE}")
message(STATUS "    libraries: ${GLOG_LIB}")

#链接头文件
include_directories( ${CMAKE_SOURCE_DIR}/include)

#链接cpp文件
aux_source_directory(src DIR_CPP)

#==============================================================

# install target and libraries 将所有需要的依赖库放在同一个位置
#set install path
set(CMAKE_BUILD_RPATH "${OpenCV_LDFLAGS}")
set(CMAKE_INSTALL_PREFIX /home/siping/algunion/alglib)
message(STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")



# set runtime path
set(CMAKE_INSTALL_RPATH ".")



# 如果想生成动态库,SHARE .so
#add_library(${PROJECT_NAME} SHARED  ${DIR_CPP})
#set(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
add_executable(${PROJECT_NAME} src/main.cc ${DIR_CPP})

target_link_libraries(${PROJECT_NAME}
        ${RKNN_RT_LIB} #必须的runtime  librknnrt.so
        ${RGA_LIB} #rga  librga.so
        ${OpenCV_LDFLAGS}
        -lopencv_world
        ${GLOG_LIB}
        -lglog
        )

install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX})

file(GLOB GLOG_LIB "${GLOG_LIB}/lib*.so.*")
file(GLOB OpenCV_LDFLAGS "${OpenCV_LDFLAGS}/lib*.so.*")

install(PROGRAMS
        ${OpenCV_LDFLAGS}
        ${RKNN_RT_LIB}
        ${RGA_LIB}
        ${GLOG_LIB}
        DESTINATION ${CMAKE_INSTALL_PREFIX})

install(DIRECTORY model DESTINATION "/home/siping/algunion")

前面用到的环境和代码打个包,上传到了百度网盘,C++的部署的代码参考的里面都有,我自己这边只是根据自己的项目做了集成,如有需要可私信。

5 参考

检测模型:https://blog.csdn.net/zhangqian_1/article/details/135523096?spm=1001.2014.3001.5502
分割模型:https://blog.csdn.net/zhangqian_1/article/details/131571838?spm=1001.2014.3001.5502

另外一种部署方法,仅检测模型(Python):
https://blog.csdn.net/m0_48979117/article/details/135628375

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1489698.html

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

相关文章

uniapp开发android原生插件

一、下载原生开发SDK Android 离线SDK - 正式版 | uni小程序SDK (dcloud.net.cn)、 https://nativesupport.dcloud.net.cn/AppDocs/download/android.html 将开发uniappa原生android的插件解压到ben本地目录,目录结构如下: 接下就可以使用 UniPlugin-Hel…

12 状态优先级

概念 cpu需要执行很多进程,有很多进程排在队列中,每个进程加载后运行一定的时间段,然后切换下一个进程。cpu如何判断进程需不需要加载,什么时候加载,依靠进程的状态和优先级属性来判断,进程调度&#xff0…

Node.js与Webpack笔记(一)

这里使用的16.19.0版本,官网和github没找到,去黑马2023年课程里找 篇幅较大会卡,此篇幅不写Webpack部分,留着下一篇 初识 1.什么是Node.js? Node.js 是一个独立的 JavaScript 运行环境,能独立执行 JS 代码&#xff…

A/D转换

硬件电路模型 模数转换代码 main.c #include <REGX52.H> #include "LCD1602.h" #include "Delay.h" #include "XPT2046.h"unsigned int ADValue; int main(){LCD_Init();LCD_ShowString(1,1,"ADJ NTC RG");while(1){ADValue …

iOS 17.0 UIGraphicsBeginImageContextWithOptions 崩溃处理

在升级到iOS17后你会发现&#xff0c;之前版本运行的很好&#xff0c;这个版本突然会出现一个运行闪退。报错日志为*** Assertion failure in void _UIGraphicsBeginImageContextWithOptions(CGSize, BOOL, CGFloat, BOOL)(), UIGraphics.m:410 跟踪到具体的报错位置如下所示&a…

redis09 集群(cluster)

思维草图 为什么要使用集群 单台redis内存容量的限制单台redis并发写量太大有性能瓶颈 redis集群认识 redis集群是对redis的水平扩容&#xff0c;即启动N个redis节点&#xff0c;将整个数据分布存储在这个N个节点中&#xff0c;每个节点存储总数据的1/N。 如下图&#xff1…

win11部署自己的privateGpt(2024-0304)

什么是privateGpt? privategpt开源项目地址 https://github.com/imartinez/privateGPT/tree/main 官方文档 https://docs.privategpt.dev/overview/welcome/welcome PrivateGPT是一个可投入生产的人工智能项目&#xff0c;利用大型语言模型&#xff08;LLMs&#xff09;的…

Windows安装SSH教程

Windows安装SSH教程 一、SSH1.SSH简介2.SSH功能3.SSH验证3.1 第一种级别&#xff08;基于口令的安全验证&#xff09;3.2 第二种级别&#xff08;基于密匙的安全验证&#xff09; 4.SSH层次4.1 传输层协议 [SSH-TRANS]4.2 用户认证协议 [SSH-USERAUTH]4.3 连接协议 [SSH-CONNEC…

场景问题: VisualVM工具Profiler JDBC不是真实执行的SQL

1. 问题 诡异的问题表象&#xff1a; 前端反馈分页接口的Total字段一直为0 使用Visualvm中的 Profiler 注入到应用后&#xff0c;查看JDBC监控得到了分页接口执行的SQL&#xff0c;复制出来执行是55. 此时还没有注意到 IN 的范围中有一个特别的值 NULL &#x1f928; 2. 排查…

【运维必学】2.零基础搞IT运维之服务器操作系统基础知识储备

微信改版了&#xff0c;现在看到我们全凭缘分&#xff0c;为了不错过【全栈工程师修炼指南】重要内容及福利&#xff0c;大家记得按照上方步骤设置「接收文章推送」哦~ 文章目录&#xff1a; 温馨提示&#xff1a;作者最近开通的知识星球&#xff0c;全栈系列从门到实践教程将会…

QT----写完的程序打包为APK在自己的手机上运行

目录 1、qt安装android组件2、打开qt配置Android 环境3、手机打开开发者模式&#xff0c;打开usb调试&#xff0c;连接电脑4、运行代码 1、qt安装android组件 qtcreater–工具-QTMaintenaceTool-startMaintenaceTool—登陆—添加或修改组件—找到android&#xff0c;安装 若是…

Windows环境MySQL全量备份+增量备份

目录 一、环境准备 1.1.安装MySQL 1.2.添加log-bin日志配置 二、创建测试数据库和表 2.1.创建测试数据库 2.2.创建测试数据表 三、全量备份恢复数据库 3.1.全量备份数据库 3.2全量恢复数据库 四、增量备份恢复数据库 4.1.增量备份数据库 4.2.增量恢复数据库 五、…

抽象步骤条(2.0版本)

vue3 router ele-plus 猜猜看为什么使用组件库&#xff01; 他呀的&#xff01;查看密码要自己写&#xff0c;验证信息也要自己写&#xff0c;所以说会用组件库会轻松一点&#xff0c;&#xff0c;&#xff0c; 代码如下 <template><div class"main"&g…

自动化构建平台(五)之Jenkins初始化配置以及插件安装操作

文章目录 前言一、安装必要插件二、系统参数配置三、全局工具配置总结 前言 上一篇我们介绍了Jenkins的安装和登录等相关操作&#xff0c;今天给大家介绍登录Jenkins后的一些初始化配置和插件安装的操作。因为如果要使用Jenkins来进行代码构建&#xff0c;必须先安装相关的插件…

WebDAV之π-Disk派盘+人生Life

人生Life是一款日程软件,在这款待办的日程软件当中各种功能极为的完善,完全的足够用户在日常当中的使用,你的待办方面的各种内容都能够在软件上面进行规划和填充,通过待办事项来帮助用户提高在日常当中的效率,对于用户来说这款待办事项的软件是绝佳的选择。 π-Disk派盘 …

VScode---php环境搭建

文章目录 1.下载php Dehug;php server2.下载php环境3.配置环境变量5.配置php.ini文件6.设置vscode6.测试遇到的问题 1.下载php Dehug;php server 2.下载php环境 下载地址&#xff1a;https://www.php.net/downloads.php 3.配置环境变量 C:\Users\hacker>php -v PHP 8.3.3 (…

c++编程复习之字符数组:电报文字

电报文字 内存限制&#xff1a;128Mb 时间限制&#xff1a;1000s 提交&#xff1a;138 解决&#xff1a;13 题目描述 输入一行电报文字&#xff0c;将字母变成其下一字母&#xff08;如’aa’变成’bb’……’zz’变成’&#xff41;&#xff41;’其它字符不变&#xff09;。 …

【leetcode】随机链表的复制

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 点击查看题目 思路: struct Node* copyRandomList(struct Node* head) {struct Node* curhead;//1.copy原链…

温湿度传感器SHT21

SHT21是一款基于IIC的温湿度传感器&#xff0c;它的引脚及定义如下&#xff1a; 标准的IIC器件&#xff0c;没有其他多余的引脚&#xff0c;应用框图如下&#xff1a; 温度的测量范围是-40到125℃&#xff0c;湿度测量范围0-100%RH&#xff0c;具体参数及采样精度见下图&#x…

利用excel文件增量同步一个库的数据并自动校正两端数据库条数不一致

利用excel文件增量同步一个库的数据并自动校正两端数据库条数不一致 现在有sqlserver和mysql两个库上的表在进行同步&#xff0c;sqlserver上的是源表&#xff0c;mysql上是目标表。 我们就把sqlserver上的数据同步到mysql上 mysql 是没有数据的。 sqlserver的三个表只是创建了…