【yolov5系列】yolov5-onnxruntime在Ubuntu和RK芯片上运行

news2025/1/6 18:41:30

前言

这里yolov5的onnx模型的推理,分别在 x64上 和 移动端上运行,前者在自己本地Ubuntu系统上运行,后者在瑞芯微的rk3566上运行。
要完成如上工作我们需要一下步骤:

  • 1 下载onnxruntime编译好的库
  • 2 下载opencv库并安装
  • 3 下载交叉编译器
  • 4 下载yolov5-onnxruntime的工程并运行

1 下载onnxruntime库

github上搜索 onnxruntime,能看到微软提供的库。链接为 https://github.com/microsoft/onnxruntime
在这里插入图片描述
在这里插入图片描述

2 opencv的下载

https://opencv.org/releases/
在这里插入图片描述
opencv的编译比较容易 【OpenCV之路】ubuntu下的安装C++的opencv4、opencv_contrib、python中opencv的cuda加速、ubuntu下opencv的第一个工程 该链接下,只需要编译到【3.1 c++/opencv 的编译】章节即可。

3 交叉编译器的下载

下载链接为 gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu的下载
在这里插入图片描述
一般的,下载后解压到固定路径下,并添加到系统环境变量中即可使用。
这里只针对当前工程测试,暂不进行系统环境变量配置,下载解压即可。

4 下载yolov5的onnxruntime的工程并运行


4.1 工程下载与目录结构构建

使用的yolov5-onnxruntime的工程链接为 https://github.com/itsnine/yolov5-onnxruntime
在这里插入图片描述
创建某个路径,这里为【/home/xyy/LL_DATA/LL/YOLOV5】
解压并构建如下目录结构:

  • ├──yolov5-onnxruntime 【工程解压路径】
    ├──GCC_COMPILER
      ├── gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu 【交叉编译器解压文件】
    ├──libs
      ├── onnxruntime
        ├──onnxruntime-linux-x64-1.11.1   【库解压路径】  
        ├──onnxruntime-linux-aarch64-1.11.1 【库解压路径,用于移动端的库的编译】
      ├── opencv
        ├──opencv_x64       【编译好opencv的bin/include/lib64文件,拷贝到此】
        ├──opencv410_aarch64   【用于移动端库的编译,使用交叉编译器可编译,这里不展开介绍】

4.2 代码的修改

因为要在移动端运行,所以cv::imshow()无法使用,故将main.cpp中最后几行代码修改成如下(pc端运行时可不用修改)。
在这里插入图片描述


4.3 CMakeLists.txt 文件修改

修改【CMakeLists.txt】文件内的设置如下:

cmake_minimum_required(VERSION 3.0.0)
project(yolo_ort)

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

# onnxruntime api
option(ONNX_API_PATH "Path to built ONNX Runtime directory." STRING)
message(STATUS "ONNX_API_PATH: ${ONNX_API_PATH}")
# set(ONNX_API_PATH ${CMAKE_SOURCE_DIR}/../libs/onnxruntime/onnxruntime-linux-x64-1.11.1)
# message(${ONNX_API_PATH})
include_directories(${ONNX_API_PATH}/include)
set(ONNX_API_LIB ${ONNX_API_PATH}/lib/libonnxruntime.so)

# opencv
option(OPENCV_PATH "Path to built ONNX Runtime directory." STRING)
message(STATUS "OPENCV_PATH: ${OPENCV_PATH}")
# set(OPENCV_PATH ${CMAKE_SOURCE_DIR}/../libs/opencv/opencv_x64)
# message(${OPENCV_PATH}  )
include_directories(${OPENCV_PATH}/include/)
file(GLOB OpenCV_LIBS ${OPENCV_PATH}/lib64/*.so*)

##
include_directories("include/")

add_executable(yolo_ort
              src/main.cpp
              src/detector.cpp
              src/utils.cpp)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

target_include_directories(yolo_ort PRIVATE "${ONNXRUNTIME_DIR}/include")
# link_directories("${ONNXRUNTIME_DIR}/lib")
target_compile_features(yolo_ort PRIVATE cxx_std_14)
target_link_libraries(yolo_ort ${OpenCV_LIBS}
                               ${ONNX_API_LIB}
                               dl)

# install target and libraries
option(INSTALL_PATH "Path to built ONNX Runtime directory." STRING)
message(STATUS "INSTALL_PATH: ${INSTALL_PATH}")
set(CMAKE_INSTALL_PREFIX ${INSTALL_PATH})
install(TARGETS yolo_ort DESTINATION ./)
install(DIRECTORY models DESTINATION ./)
install(DIRECTORY images DESTINATION ./)
install(PROGRAMS ${ONNX_API_LIB} DESTINATION lib)
install(PROGRAMS ${OPENCV_LIBS} DESTINATION lib)

4.4 编译命令

本地Ubuntu上进行编译,方便期间这里将编译的命令写成sh文件【build_x64.sh】

rm -R build
set -e

ROOT_PWD=$(pwd)
echo ${ROOT_PWD}

# 进入build文件
mkdir ${ROOT_PWD}/build
cd ${ROOT_PWD}/build
cmake .. \
   -DONNX_API_PATH=${ROOT_PWD}/../libs/onnxruntime/onnxruntime-linux-x64-1.11.1 \
   -DOPENCV_PATH=${ROOT_PWD}/../libs/opencv/opencv_x64 \
   -DINSTALL_PATH=${ROOT_PWD}/install/yolov5_x64
   
make -j10
make install

echo "\n========================================="
md5sum yolo_ort
date +%Y/%m/%d%t%H:%M:%S

使用交叉编译器进行编译(然后在rk3566上运行),方便期间这里将编译的命令写成sh文件【build_aarch64_onnx.sh】

rm -R build
set -e

# for rk1808 aarch64
GCC_COMPILER_PATH=/home/xyy/LL_DATA/LL/YOLOV5/GCC_COMPILER/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin
GCC_COMPILER=${GCC_COMPILER_PATH}/aarch64-linux-gnu

ROOT_PWD=$(pwd)
echo ${ROOT_PWD}

# 进入build文件
mkdir ${ROOT_PWD}/build
cd ${ROOT_PWD}/build
cmake .. \
   -DCMAKE_C_COMPILER=${GCC_COMPILER}-gcc \
   -DCMAKE_CXX_COMPILER=${GCC_COMPILER}-g++ \
   -DONNX_API_PATH=${ROOT_PWD}/../libs/onnxruntime/onnxruntime-linux-aarch64-1.11.1 \
   -DOPENCV_PATH=${ROOT_PWD}/../libs/opencv/opencv410_aarch64 \
   -DINSTALL_PATH=${ROOT_PWD}/install/yolov5_aarch64_onnx 

make -j10
make install

echo "\n========================================="
${GCC_COMPILER_PATH}/aarch64-linux-gnu-strip ${ROOT_PWD}/install/yolov5_aarch64_onnx/yolo_ort
md5sum yolo_ort
date +%Y/%m/%d%t%H:%M:%S

4.5 编译与运行

4.5.1 PC上的编译与推理

根目录打开终端运行

sh build_x64.sh

然后会生成路径【install/yolov5_x64/】,在另外一个终端进入到到该路径下,运行命令

./yolo_ort --model_path=./models/yolov5s.onnx --image=./images/bus.jpg --class_names=./models/coco.names

终端显示如下,便是成共运行了,在【install/yolov5_x64/】路径下会生成预测结果【result.jpg】
在这里插入图片描述在这里插入图片描述

4.5.2 移动端库的编译和推理

根目录打开终端运行

sh build_aarch64_onnx.sh

然后会生成路径【install/yolov5_aarch64_onnx/】
在这里插入图片描述
我们将该路径下的文件全部拷贝到rk3566主板上,然后终端进入主板中的工程路径下运行如下命令

export LD_LIBRARY_PATH=./lib
./yolo_ort --model_path=./models/yolov5s.onnx --image=./images/bus.jpg --class_names=./models/coco.names

如果文件有权限问题,修改权限后运行即可。

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

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

相关文章

88E1548P大流量传输插拔网线导致网络不通

1、测试环境硬件:NXP LS1046A ARM64平台 88E1548P 软件:linux 4.19.26 linux 5.10.35环境说明:88E1548P 是一个QSGMII 的 phy 芯片,LS1046A CPU 提供4个GMAC 与 88E1548P 连接,就是4个千兆网口。2、具体现象eth7发包…

OFDM系统架构梳理(1)

1、ofdm简介OFDM是一种特殊的多载波传输方案,它可以被看作是一种调制技术,也可以被当作一种复用技术。多载波传输把数据流分解成若干子比特流,这样每个子数据流将具有低得多的比特速率,用这样的低比特率形成的低速率多状态符号再去…

Spring Batch 批处理-步骤Step与Tasklet

引言 接着上篇:Spring Batch 批处理-执行上下文,了解作业执行上下文后,本篇就来了解一下Spring Batch批处理步骤Step对象与任务处理对象Tasklet,看下Spring Batch 如何运作的。 步骤介绍 一般认为步骤是一个独立功能组件&#…

密码学大咖DavidWong历经数年创作编写而成的这本书

从我开始写本书到图书出版已经有几年了。最初,我打算将本书作为介绍现实世界常用密码原语的图书。但是,这显然是一件不可能完成的事情。任何一个领域都不可能用一本书来总 结清楚。出于这个原因,我必须在知识的深度和广度之间找到平衡。我希望…

3.6双端口RAM和多模块存储器

文章目录关键词正文一、存取周期二、引子三、双端口RAM四、多体并行存储器&#xff08;1&#xff09;高位交叉编址方式&#xff08;2&#xff09;低位交叉编址方式&#xff08;3&#xff09;编址&#xff08;4&#xff09;特性举例<1> 高位交叉编址<2> 低位交叉编址…

word实用技巧:拼音指南用法及注意事项

如果你是一位语文老师&#xff0c;在为学生准备试卷时&#xff0c;时常会用到Word拼音指南功能&#xff1b;如果你是一位职场白领&#xff0c;在为领导准备发言稿、颁奖名单时&#xff0c;以防领导读错音&#xff0c;也会用到Word拼音指南功能对生僻字&#xff0c;多音字进行单…

RabbitMQ 获取消息(Ack Mode)

在服务器端的客户端页面从队列中获取消息是一个危险的动作&#xff0c;生产环境一定要了解业务之后再做操作。 Act Mode Nack message requeue true 接收消息但不做确认&#xff0c;消息会重新加入队列 Automatic ack 获取消息&#xff0c;应答确认&#xff0c;消息不…

C#,编程语言的基本概念与知识点

本文归纳整理C#的一些知识点&#xff0c;便于快速浏览与掌握C#语言的一些基本概念。本文并没有很好地层次与组织&#xff0c;抄了不少&#xff0c;写了不少&#xff0c;想到什么&#xff0c;就写什么。01 类 class类是C#等面向对象编程语言&#xff08;Object-oriented program…

分享152个ASP源码,总有一款适合您

ASP源码 分享152个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 152个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1fOOs06p6YghEzceqJ4twaA?pwd0p4z 提取码&#x…

Vue-透传Attributes使用解析

透传是vue中一种特性&#xff0c;官方的解释是&#xff1a;“透传 attribute”指的是传递给一个组件&#xff0c;却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on 事件监听器。最常见的例子就是 class、style 和 id。这句话解释过来就是一些不被prop定义的属性直接…

面对层出不穷的问题,延迟开学的原因就是取消延时服务?

面对层出不穷的问题&#xff0c;延迟开学的原因就是取消延时服务&#xff1f; #延迟开学#请问为什么要延迟&#xff1f;疫情期间说要回家可以理解&#xff0c; 这两天都传着说郑州市的中小学、幼儿园推迟开学了&#xff0c;到底有没有这种情况&#xff1f;我们现在又来到了郑…

零基础入行软件测试怎么学习~

随着近几年软件测试行业的异军突起&#xff0c;加之这又是个进入门槛相对较低的行业&#xff0c;导致不少人都想从事这个岗位。那么&#xff0c;许多初学者在一开始都会想知道&#xff0c;零基础入门软件测试要学什么?希望本文可以对大家的软件测试学习之路有一定的指导意义&a…

Vue实现考勤记录删除-自定义右击删除菜单

一、定义和使用oncontextmenu 事件在元素中用户右击鼠标时触发并打开上下文菜单。注意&#xff1a;所有浏览器都支持 oncontextmenu 事件&#xff0c; contextmenu 元素只有 Firefox 浏览器支持。二、语法HTML 中:<element oncontextmenu"myScript">JavaScript…

RabbitMQ面试题

什么是 MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已。 还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。 在互联网架构中&#xff0c;MQ 是一种非常常见的…

一文走进多核架构下的内存模

一、走进多核编程CPU 发展早期阶段&#xff0c;性能的提升主要来自于主频的提升和架构的优化&#xff0c;当这条优化途径出现瓶颈后&#xff0c;多核 CPU 开始流行起来。多核心同时执行任务极大地提高了系统整体性能&#xff0c;但也对硬件架构和软件编写提出了更大的挑战。各个…

C语言#define的用法

#define 叫做宏定义命令&#xff0c;它也是C语言预处理命令的一种。所谓宏定义&#xff0c;就是用一个标识符来表示一个字符串&#xff0c;如果在后面的代码中出现了该标识符&#xff0c;那么就全部替换成指定的字符串。我们先通过一个例子来看一下 #define 的用法&#xff1a;…

【Spring(九)】带你了解Spring整合MyBatis的详细过程

文章目录前言Spring整合mybatis思路分析Spring整合MyBatis总结前言 前面我们已经学习完了Spring的注解开发&#xff0c;接下来我们来学习Spring整合MyBatis&#x1f4aa;&#x1f4aa;。 Spring整合mybatis思路分析 整合其实我们在核心容器中已经完成了一个东西了:DruidDataSou…

Hue使用

文章目录HUE功能概览界面介绍Quick browseApp应用 App* 编辑器 【Editor】调度器 【Scheduler】浏览 Browsers*【Documents】【File Browser】HDFS【Job Browser】YARN、oozie【Table Browser】Hive、mysql、SQLite...【HBase Browser】HbaseHUE 在hue.ini 配置集成其他服务&a…

Doris-1.2.0安装部署详细流程

doris介绍 Doris是一个MPP的OLAP系统&#xff0c;以较低的成本提供在大数据集上的高性能分析和报表查询功能。 MPP (Massively Parallel Processing)&#xff0c;即大规模并行处理。简单来说&#xff0c;MPP是将任务并行的分散到多个服务器和节点上&#xff0c;在每个节点上计…

Power BI中创建父子层级二:父级单独产生值

一、父子层级 在数据分析中&#xff0c;经常会遇到父子层级问题&#xff0c;通常来说&#xff0c;父子层级又可以分为两种情况&#xff0c;一种为图1&#xff0c;江苏中烟的销量就是南京品牌和苏烟品牌的销量之和&#xff0c;南京品牌的销量就是南京&#xff08;硬红&#xff…