C++ ubuntu环境下安装编译部署环境,用onnxruntime部署ppyoloe_r模型

news2025/1/11 13:01:03

在新安装的ubuntu环境下修改源、安装gcc和cmake,编译安装opencv,安装onnxruntime环境。并编写cmakelist文件,编译与运行ppyoloe_r模型。
windows环境下onnx部署ppyoloe_r模型的代码可以参考 https://blog.csdn.net/a486259/article/details/128151738,这里基于该代码进行linux适配,最终成功实现部署。

1、基础环境配置

1.1 更换源

参考一下链接,基于图形界面设置国内源即可
https://blog.csdn.net/u012206617/article/details/122321849

1.2 安装gcc

安装命令如下

sudo apt update
sudo apt install gcc-8
sudo apt install g++-8

查看安装效果 ls /usr/bin/gcc*

root@ubuntu:/home/xxx# ls /usr/bin/gcc*
/usr/bin/gcc-7  /usr/bin/gcc-ar-7  /usr/bin/gcc-nm-7  /usr/bin/gcc-ranlib-7

可以看到并没有生成gcc、g++的软链接。通过以下方式构建软链接,即可使用gcc、g++命令

cd /usr/bin
rm gcc
rm g++
sudo ln -s gcc-8 gcc
sudo ln -s g++-8 g++

1.3 安装cmake

sudo apt install cmake

检验cmake版本

root@ubuntu:/usr/bin# cmake --version
cmake version 3.10.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).
root@ubuntu:/usr/bin# 

2、运行环境配置

2.1 安装opencv

安装依赖包,参考https://blog.csdn.net/KIK9973/article/details/118830187,注意其博文中的cmake命令中多了个—D参数

sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev 
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

wget https://www.witersen.com/wp-content/uploads/2022/03/opencv-4.5.5.tar.gz
wget https://www.witersen.com/wp-content/uploads/2022/03/opencv_contrib-4.5.5.tar.gz

unzip opencv_contrib-4.5.5.tar.gz
unzip opencv-4.5.5.tar.gz

将opencv_contrib-4.5.5重命名为opencv_contrib,然后拷贝到opencv-4.5.5目录下

cd opencv-4.5.5/
mkdir -p build
cd build
cmake -D CMAKE_INSTALL_PREFIX=/usr/local -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON  -D OPENCV_ENABLE_NONFREE=True ..

	
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local  -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/ -D WITH_TBB=OFF  -D WITH_CUDA=OFF -D BUILD_opencv_gpu=OFF -D BUILD_opencv_gpuarithm=OFF -D OPENCV_GENERATE_PKGCONFIG=ON .. 

输出以下内容则表示cmake配置成功

--   OpenCL:                        YES (no extra features)
--     Include path:                /home/xxx/opencv-4.7.0/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
-- 
--   Python (for build):            /usr/bin/python2.7
-- 
--   Java:                          
--     ant:                         NO
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
-- 
--   Install to:                    /usr/local
-- -----------------------------------------------------------------
-- 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xxx/opencv-4.7.0/build

项目配置成功后,进行make操作

make -j12
make install

参考https://blog.csdn.net/KIK9973/article/details/118830187,实现对opencv的安装和环境测试。

2.2 安装onnxruntime

这里以cpu版,非源码安装为实现案例。
在https://github.com/microsoft/onnxruntime/releases 中可以下载linux版的onnxruntime。这里下载onnxruntime-linux-x64-1.12.0.tgz 然后解压。

将lib目录下的so文件都拷贝到usr/local/lib/目录下

cd onnxruntime-linux-x64-1.12.0/lib
sudo cp * /usr/local/lib/

3、编写代码测试

3.1 编写c++代码

直接使用https://hpg123.blog.csdn.net/article/details/128151738?spm=1001.2014.3001.5502 导出的旋转框模型(ppyoloe_r)和博文中的c++代码
代码保存到src目录下,头文件和自己的动态库、静态库保存到include目录下。最终使整体的目录结构如下所示,其中ppyoloe_r_crn_s_3x_dota.onnx和t1.jpg是模型文件和图像,因为代码里写的是相对路径,故如此操作。

root@ubuntu:~/project1$ tree
.
├── build
├── CMakeLists.txt
├── include
└── src
    └── main.cpp

3 directories, 4 files

代码保存后要进行轻微修改,首先是将里面的 wchar_t 修改为char (因为linux没有wchar_t类型),
然后将第142行的output_node_dims.size()修改为k,并在该行前面插入代码: int k=output_node_dims.size();

此外,关于代码中的图片路径和模型路径可以按照个人实际情况修改。

3.2 编写CMakeLists.txt

project(myproject), 是设置项目的名称为myproject,最终编译的可执行文件也是myproject。
这里需要注意onnxruntime的路径,同时在target_link_libraries中看是否有自己的私有库需要链接。

cmake_minimum_required(VERSION 3.5.1)
#生成生成项目的名称

set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(CMAKE_SUPPRESS_REGENERATION FALSE)
#设置生成release项目
set(CMAKE_BUILE_TYPE RELEASE)
set(CMAKE_CXX_STANDARD 14)
# It prevents the decay to C++98 when the compiler does not support C++14
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# It disables the use of compiler-specific extensions
# e.g. -std=c++14 rather than -std=gnu++14
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
 
set(ONNXRUNTIME_DIR  "/home/xxx/onnxruntime-linux-x64-gpu-1.12.0")
#set library path
find_package(OpenCV REQUIRED)

file(GLOB SOURCE_FILES src/*.cpp)
add_executable(${CMAKE_PROJECT_NAME} ${SOURCE_FILES})

include_directories(
    ${OpenCV_INCLUDE_DIRS}
    ${ONNXRUNTIME_DIR}/include
    /usr/local/include
    ${PROJECT_SOURCE_DIR}/include
)
link_directories(
    ${ONNXRUNTIME_DIR}/lib
    /usr/local/lib64
    /usr/local/lib
    ${PROJECT_SOURCE_DIR}/include
)

target_link_libraries (
    ${CMAKE_PROJECT_NAME}
    ${OpenCV_LIBS}
	onnxruntime
)
 

3.3 编译项目并运行

具体命令为:
cd build #进入目录
cmake … #配置父目录项目
make #编译项目
ls #查看编译结果,其中myproject就是编译好的可执行文件,与cmakelist中配置相同

root@ubuntu:~/project1$ cd build
root@ubuntu:~/project1/build$ cmake ..
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xxx/project1/build
root@ubuntu:~/project1/build$ make
[100%] Built target myproject
root@ubuntu:~/project1/build$ ls
CMakeCache.txt  cmake_install.cmake  myproject                     t1.jpg
CMakeFiles      Makefile             ppyoloe_r_crn_s_3x_dota.onnx

执行可执行文件,./myproject,程序输出如下

root@ubuntu:~/project1/build$ ./myproject 
Structure message of model, input_nodes:1   output_nodes:2
Input0,  name=image,   num_dims:4,  shape:(-1,3,-1,-1,)  data_size:-3
Output0,  name=transpose_1.tmp_0,  num_dims:3,  shape:(-1,-1,2,)
Output1,  name=concat_21.tmp_0,  num_dims:3,  shape:(-1,-1,5,)
Gtk-Message: 01:48:32.428: Failed to load module "canberra-gtk-module"

所弹出的检测结如下,如果绘图的角度不对,请查看一下博文代码中第192行是否需要注释
在这里插入图片描述

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

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

相关文章

Python-入门基础小练习

通过前面的两个篇章Python-入门基础篇和Python-入门基础语句篇大家应该已经认识了python基础的语句和函数了,并且可以使用pycharm编译器创建.py文件进行运行了,今天适当的来一些小练习,给枯燥的学习增添一些趣味性。 判断一个数是否为偶数 …

Node 模块

文章目录 Node 模块概述使用方式一:module.exports方式二:exports 目录模块package.json配置 引入模块的基本流程 Node 模块 概述 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为模块化。 其中拆分出的 每…

Identity标识框架配上JWT的使用

在Identity标识框架的代码上继续编写 .Net中的标识框架Identity_风的艺术的博客-CSDN博客 添加NuGet包 Nuget:Microsoft.AspNetCore.Authentication.JwtBearer 创建存储JWT数据类 public class JWTOptions { public string SigningKey { get; set; } pub…

嵌入式51单片机03-数码管系列

文章目录 数码管一、数码管基础知识二、数码管系列代码1. 数码管操作(单个数码管静态显示)(1)仿真电路图(2)源代码(3)实验结果 2. 数码管操作(多个数码管静态显示&#x…

CSDN官方文章MD编辑器文章示例

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Day950.遗留系统的四化建设 -遗留系统现代化实战

遗留系统的四化建设 Hi,我是阿昌,今天学习记录的是关于遗留系统的四化建设的内容。 对于老旧、过时,但又十分重要、不可替代的遗留系统,是遗留系统。听之任之只会埋下隐患,真正出现问题就为时已晚了。在动手改造遗留…

【蓝桥杯省赛真题39】Scratch棒球本垒打 少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

目录 scratch棒球本垒打 一、题目要求 编程实现 二、案例分析 1、角色分析

托福高频真词List01 // 附阅读真题

4月18日单词 🍮segregateseparateV.隔离🍮leftover remainingadj.剩余的 🍮rivalcompetitor 🍮rivalcompete n.对手🍮 v.对抗🍮 apparentlyseeminglyadv.显然 🍮unrivaledunequaledadj.无与伦…

Create a Process for Managing Support Cases

文章目录 前言&学习目标学习目标背景 一,Create Support Processes1.创建用户2.创建Processes3.创建Record Types4.创建升级规则(Escalation Rule) 前言&学习目标 记录trailhead学习重点,创建管理支持个案的流程,简化工作流并用新的…

mysql企业级安装部署(保姆级别教程)

前言 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系…

Spring——利用五大类注解和Bean注解实现更简单的存储

目录 一、配置扫描路径 二、使用注解存储Bean对象 2.1 Controller(控制器存储) 2.1.1 bean标签是否可以和component-san一起使用呢? 2.2 Service(服务存储) 2.3 Repository 2.4 Component 2.5 Configuration 2.6 五大类注解可以不在…

27岁,测试在职近5年,月薪不到2W,担心被应届生取代

工作了近5年,一个月工资不到20K,担心被应届毕业生取代!互联网的快速发展伴随着员工适者生存的加速,测试员的薪资也在不断增长,以3年、5年、8年为一条分水岭。如果人们的能力和体力不够,他们就会被淘汰。看起…

Android添加C++/CPP项目代码(2)

Android添加C/CPP项目代码(2) (1)选中某个module,右键,Add C to Module 在随后弹出的选项框中选第一个,OK。 (2)此时会在app下产生一个cpp目录和两个文件: x…

TiDB实战篇-BR进行数据备份与恢复

简介 使用BR进行数据备份与恢复。 原理 Backup备份的时候在PD上面找到表的元数据,然后找到对应的TiKV数据以后,直接备份到外部系统中(注意如果没有像HDFS这样的分布式文件存储,那么它每个TiKV备份到本地的文件就只有一部分数据&…

nssctf web 入门(10)

[NISACTF 2022]midlevel [NISACTF 2022]midlevel 尝试使用x-forwarded-for 发现可行判断是不是ssti 确定是ssti模板注入 [NISACTF 2022]is secret [NISACTF 2022]is secret 根据这个我们去看看secret 这里看到这个猜测是通过get传入secret的值然后会机密我们的值 我们发现传…

优秀软件方法学“漫游记”

你好,我是东(在极客时间的 ID 是 Fredo)。大学的时候我读的是计算机专业,现在是一名工作了近3年的程序员,很高兴能和你分享我的学习体会。 我是怎样学习课程的? 首先聊聊我是怎么学习这门课的。 DDD 是一…

智网工程师培训一些心得

智网工程师培训一些心得 MYSQLApache Flask开发小程序 MYSQL MYSQL的日期如果定义为datetime类型,比较的时候可以使用 entry_form.exercise_date between 2022-1-1 and 2023-4-19 日期可以是非2位宽对齐方式 日期比较也可以使用大于或者小于号MYSQL支持定时备份数…

学习数据结构第6天(栈的基本概念)

栈的基本概念 栈的定义栈的基本操作栈的存储结构 栈的定义 栈(Stack)是一种基于先进后出(FILO)或者后进先出(LIFO)的数据结构,是一种只允许在一端进行插入和删除操作的特殊线性表。 栈按照先进后出的原则存储数据,先进入的数据被压入栈底,最…

数据结构初阶(链表)

文章目录 一、链表的基础概念1.1 什么是链表1.2 分类1.3 链表的底层代码1.4 例题1.5 LinkedList 的实现(1)什么是LInkedList(2)底层代码(3)LinkedLIst的使用 1.6 ArrayList和LinkedList的区别 一、链表的基…

Spring底层架构核心概念

文章目录 Spring底层架构核心概念BeanDefinitionBeanDefinitionReaderAnnotatedBeanDefinitionReaderXmlBeanDefinitionReaderClassPathBeanDefinitionScanner BeanFactoryApplicationContext国际化资源加载获取运行时环境事件发布 类型转换PropertyEditorConversionServiceTyp…