改写paddledetection为cmake版(c++)

news2024/11/26 0:36:17

下载源代码

官方地址:
https://gitee.com/paddlepaddle/PaddleDetection

网盘:
paddledetection
链接:https://pan.baidu.com/s/1g0z5SYQNDR1pwe9iAtvR3A?pwd=ktl6 
提取码:ktl6
paddleocr
链接:https://pan.baidu.com/s/1QcLbGJD7NB9UVPbUAulCuA?pwd=o68i 
提取码:o68i

找到c++部署代码

在这里插入图片描述
在这里插入图片描述
我个人为了整体性把src文件里的后缀都改为了cpp
在这里插入图片描述

改CMakeLists.txt文件

原版cmake文件很繁琐,我改写了一个简洁版的
移植的时候只需要改头文件地址和库文件地址即可

cmake_minimum_required(VERSION 3.5)

set(CMAKE_BUILD_TYPE "Release")   #option: Debug / Release

if (CMAKE_BUILD_TYPE MATCHES "Debug" 
        OR CMAKE_BUILD_TYPE MATCHES "None")
    message(STATUS "CMAKE_BUILD_TYPE is Debug")
elseif (CMAKE_BUILD_TYPE MATCHES "Release")
    message(STATUS "CMAKE_BUILD_TYPE is Release")
endif()

# 设置c++标准
set(CMAKE_CXX_STANDARD 20)
project(DsYolo)

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

option(WITH_MKL        "Compile demo with MKL/OpenBlas support, default use MKL."       ON)
option(WITH_GPU        "Compile demo with GPU/CPU, default use CPU."                    ON)
option(WITH_STATIC_LIB "Compile demo with static/shared library, default use static."   ON)
option(WITH_TENSORRT "Compile demo with TensorRT."   ON)

macro(safe_set_static_flag)
    foreach(flag_var
        CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
        CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
      if(${flag_var} MATCHES "/MD")
        string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
      endif(${flag_var} MATCHES "/MD")
    endforeach(flag_var)
endmacro()

if (WITH_MKL)
    ADD_DEFINITIONS(-DUSE_MKL)
endif()

if (MSVC)
    add_definitions(-w)
    #add_definitions(-W0)
endif()

if (WIN32)
    add_definitions("/DGOOGLE_GLOG_DLL_DECL=")
    set(CMAKE_C_FLAGS /source-charset:utf-8)
    add_definitions(-D_CRT_SECURE_NO_WARNINGS)
    add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
    if(WITH_MKL)
        set(FLAG_OPENMP "/openmp")
    endif()
    set(CMAKE_C_FLAGS_DEBUG   "${CMAKE_C_FLAGS_DEBUG} /bigobj /MTd ${FLAG_OPENMP}")
    set(CMAKE_C_FLAGS_RELEASE  "${CMAKE_C_FLAGS_RELEASE} /bigobj /MT ${FLAG_OPENMP}")
    set(CMAKE_CXX_FLAGS_DEBUG  "${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd ${FLAG_OPENMP}")
    set(CMAKE_CXX_FLAGS_RELEASE   "${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT ${FLAG_OPENMP}")
    if (WITH_STATIC_LIB)
        safe_set_static_flag()
        add_definitions(-DSTATIC_LIB)
    endif()
    message("cmake c debug flags " ${CMAKE_C_FLAGS_DEBUG})
    message("cmake c release flags " ${CMAKE_C_FLAGS_RELEASE})
    message("cmake cxx debug flags " ${CMAKE_CXX_FLAGS_DEBUG})
    message("cmake cxx release flags " ${CMAKE_CXX_FLAGS_RELEASE})
endif()


# 头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
#include_directories(/home/nvidia/paddleOCR/PaddleOCR-release-2.6/deploy/cpp_infer/include)
#include_directories(/home/nvidia/paddleOCR/PaddleOCR-release-2.6/deploy/cpp_infer)
#include_directories(/usr/include)
include_directories(./)
include_directories(./include)
include_directories(./Ds_inference/opencv410/include/opencv4)
include_directories(./Ds_inference/opencv410/include/opencv4/opencv2)
include_directories(./Ds_inference/third_party/install/mklml/include)
include_directories(./Ds_inference/third_party/install/mkldnn/include)
include_directories(./Ds_inference/third_party/install/glog/include)
include_directories(./Ds_inference/third_party/AutoLog-main)
include_directories(./Ds_inference/third_party/install/gflags/include)
include_directories(./Ds_inference/third_party/install/protobuf/include)
include_directories(./Ds_inference/third_party/threadpool)
include_directories(./Ds_inference/third_party/yaml-cpp)
include_directories(./Ds_inference/paddle_gpu11.6/include)
# 库文件
#link_directories(/usr/lib)
link_directories(./Ds_inference/third_party/install/mklml/lib)
link_directories(./Ds_inference/third_party/install/mkldnn/lib)
link_directories(./Ds_inference/third_party/install/glog/lib)
link_directories(./Ds_inference/opencv410/lib)
link_directories(./Ds_inference/third_party/install/protobuf/lib)
link_directories(./Ds_inference/third_party/install/gflags/lib)
link_directories(./Ds_inference/paddle_gpu11.6/lib)
link_directories(./Ds_inference/third_party/yaml-cpp/lib)


aux_source_directory (src SRC_LIST)
add_executable (yoloV5 ${SRC_LIST})

set(LIBRARY_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/bin)
set(output)

target_link_libraries(yoloV5
opencv_world410
#opencv_highgui opencv_core opencv_imgproc opencv_imgcodecs opencv_calib3d opencv_features2d opencv_videoio 
paddle_inference mklml libiomp5md mkldnn glog gflags_static libprotobuf libcmt shlwapi yaml-cpp
)

# 注意测试
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

(windows平台)创造一个文件夹将生成可执行文件需要的库放入

在这里插入图片描述
在这里插入图片描述
需要用到gpu,就需要事先配置好cuda这一套的环境变量,就不用在cmakelists里面专门写来引用了,配置方法见http://t.csdn.cn/mgIMD

编译的时候遇到的bug

1.xxx已经在obj中定义

在这里插入图片描述
这三个关于main的cpp中只能同事存在一个,看自己需要那个,将不需要的文件里面代码全部注释,,我是使用了main.cpp,反正遇到这种报错通常把一些东西注释掉就能解决

2.error C7555: … requires at least ‘/std:c++latest’ when build in Win10

意思是c++版本低了
在这里插入图片描述
找到cmakelists这句函数,然后我发现我之前写的是17,我改成20之后完美解决。

3.fatal error C1083: 无法打开包括文件: “yaml-cpp/yaml.h”: No such file or directory

其实源cmakelists中是套了一个include(cmake/yaml-cpp.cmake),来编译


find_package(Git REQUIRED)

include(ExternalProject)

message("${CMAKE_BUILD_TYPE}")

ExternalProject_Add(
        ext-yaml-cpp
        URL https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip
        URL_MD5 9542d6de397d1fbd649ed468cb5850e6
        CMAKE_ARGS
        -DYAML_CPP_BUILD_TESTS=OFF
		-DYAML_CPP_BUILD_TOOLS=OFF
        -DYAML_CPP_INSTALL=OFF
        -DYAML_CPP_BUILD_CONTRIB=OFF
		-DMSVC_SHARED_RT=OFF
		-DBUILD_SHARED_LIBS=OFF
        -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
        -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
        -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
        -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}
        -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${CMAKE_BINARY_DIR}/ext/yaml-cpp/lib
        -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=${CMAKE_BINARY_DIR}/ext/yaml-cpp/lib
        PREFIX "${CMAKE_BINARY_DIR}/ext/yaml-cpp"
        # Disable install step
        INSTALL_COMMAND ""
	    LOG_DOWNLOAD ON
        LOG_BUILD 1
)

我还是想自己来编译,因为根据之前的经验,这种需要远程下载源码的总是有这样那样的问题。

下载源码

https://github.com/jbeder/yaml-cpp

在这里插入图片描述
我以为只是缺少头文件,cmakelists里面补上之后
在这里插入图片描述
出现无法解析的外部符号,大概率是缺少库,然后我去编译yaml-cpp的库。
在这里插入图片描述
就是很常规的操作,用cmake … 直接就编译出了一个lib库,很顺利,但是使用的时候显示无法打开此lib
在这里插入图片描述
我再重新生成找原因
在这里插入图片描述
注意到这一句Defining YAML_CPP_API for DLL import,然后我搜索这个关键词,搜到了https://blog.csdn.net/m0_37833142/article/details/115180471,
即在cmake后多加了一个参数,就成功可以正常调用了,到底是什么原理,我还得继续学习

cmake -DYAML_BUILD_SHARED_LIBS=ON ..

在这里插入图片描述

下载模型测试

代码报错查找,实例化

添加dll到exe目录

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

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

相关文章

不理解路径问题的大坑记录

./表示当前目录 当前所在的目录 一直写的是…/老是访问不到 就像着人家组件有什么问题 ./了一下成功了 果然 有句话说的真的很棒 不报错才是最可怕的 谁知道你的错误是什么

No servers available for service: renren…。 Gateway 网关报503错误 ,已解决

目录 环境配置问题描述loadbalancer的作用 环境配置 问题描述 配置spring cloud gateway使用端口访问就可以,使用lb:// 就报503 gateway:routes:- id: admin_routeuri: lb://gulimall-admin # uri: http://localhost:8080predicates:- Path/api/**filter…

Start 方法源码深究——模板方法设计模式

目录 一. 🦁 前言1.1 New状态1.2 Runnable1.3 Runing1.4 Block状态1.5 Terminated状态 二. 🦁 线程 start 方法源码剖析2.1 虚拟机调用run方法执行线程2.2 最少有两个线程在执行2. 3 不可以重复执行2.4 start方法体 三. 🦁 模板方法设计模式3…

李沐深度学习记录1:零碎知识记录、08线性回归

简要记录,以便查阅~ 一、零碎知识 x.numel():看向量或矩阵里元素个数 A.sum():向量或矩阵求和,axis参数可对某维度求和,keepdims参数设置是否保持维度不变 A.cumsum:axis参数设置沿某一维度计算矩阵累计和…

05_Bootstrap插件02

7 小标签 通过 .label 实现小标签&#xff0c;用于提示类。 <h1>h1标题 <span class"label label-default">标签</span></h1> <h2>h2标题<span class"label label-default">标签</span></h2> <h3&g…

精品Python思政素材数据库在线学习资源网

《[含文档PPT源码等]精品基于Python实现的思政素材数据库设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScri…

Linux:GlusterFS 集群

GlusterFS介绍 1&#xff09;Glusterfs是一个开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端.在传统的解决 方案中Glusterfs能够灵活的结合物理的,虚拟的和云资源去体现高可用和企业级的性能存储. 2&#xff09;Glusterfs通过TCP/IP或InfiniBand RDMA网络链…

2023年9月21日

完善登录界面的注册登录功能 头文件1 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QPushButton> #include <QLineEdit> #include <QLabel> #include <QMovie> #include <QDebug> #include <QMessage…

【计算机网络】深入理解TCP协议二(连接管理机制、WAIT_TIME、滑动窗口、流量控制、拥塞控制)

TCP协议 1.连接管理机制2.再谈WAIT_TIME状态2.1理解WAIT_TIME状态2.2解决TIME_WAIT状态引起的bind失败的方法2.3监听套接字listen第二个参数介绍 3.滑动窗口3.1介绍3.2丢包情况分析 4.流量控制5.拥塞控制5.1介绍5.2慢启动 6.捎带应答、延时应答 1.连接管理机制 正常情况下&…

记一次 .NET 某餐饮小程序 内存暴涨分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友找到我&#xff0c;说他的程序内存异常高&#xff0c;用 vs诊断工具 加载时间又太久&#xff0c;让我帮忙看一下到底咋回事&#xff0c;截图如下&#xff1a; 确实&#xff0c;如果dump文件超过 10G 之后&#xff0c;市面上那些可…

ESP8266 WiFi物联网智能插座—项目简介

目录 1、项目背景 2、设备节点功能 3、上位机功能 物联网虽然能够使家居设备和系统实现自动化、智能化管理&#xff0c;但是依然需要依靠更为先进的终端插座作为根本保障&#xff0c;插座是所有家用电器需要使用的电源设备&#xff0c;插座的有序智能管理&#xff0c;对于实…

SpringMVC初级

文章目录 一、SpringMVC 概述二、springMVC步骤1、新建maven的web项目2、导入maven依赖3、创建controller4、创建spring-mvc.xml配置文件&#xff08;本质就是spring的配置件&#xff09;5、web.xml中配置前端控制器6、新建a.jsp文件7、配置tomcat8、启动测试 三、工作流程分析…

echart在折线显示横纵(横纵线沿着折线展示)

产品有个需求&#xff0c;需要在echart折线上展示横纵向坐标系&#xff0c;echart的axisPointer默认是展示在鼠标当前位置的&#xff0c;不符合需求&#xff0c;所以是使用markline实现的 在线例子和源码 先上效果图 实现思路 横纵线的x轴线是比较容易的&#xff0c;因为ech…

ONES 全球化启航,用软件服务全球企业

美西太平洋时间2023年9月6日至9月8日&#xff0c;SaaStr Annual 2023 大会在美国旧金山举办。作为全球最大规模、最具影响力的 SaaS 行业盛会&#xff0c;SaaStr 吸引了上万名来自世界各地的 SaaS 行业从业者&#xff0c;ONES 也作为展商之一参与其中。 在为期三天的大会期间&a…

实用的嵌入式编码技巧:第三部分

每个触发器都有两个我们在风险方面违反的关键规格。“建立时间”是时钟到来之前输入数据必须稳定的最小纳秒数。“保持时间”告诉我们在时钟转换后保持数据存在多长时间。 这些规格因逻辑设备而异。有些可能需要数十纳秒的设置和/或保持时间&#xff1b;其他人则需要少一个数量…

DC/DC开关电源学习笔记(十)Buck降压电路仿真及工程应用实例

(十)Buck降压电路仿真及工程应用实例 1. 仿真应用实例1.1 案例一1.2 案例二2. 工程应用实例2.1 数字DC/DC应用实例2.2 模拟DC/DC应用实例1. 仿真应用实例 1.1 案例一 仿真技术要求输入:输入电压30~90V,输出电压28V,输出电流最大10A,开关频率100KHz。我们按照参数极限工…

大语言模型之十一 Transformer后继者Retentive Networks (RetNet)

在《大语言模型之四-LlaMA-2从模型到应用》的LLama-2推理图中可以看到&#xff0c;在输入“你好&#xff01;”时&#xff0c;是串行进行的&#xff0c;即先输入“你”这个token&#xff0c;然后是“好”&#xff0c;再然后是“&#xff01;”token&#xff0c;前一个token需要…

【QT】day5

1.登录注册和数据库联动 三个头文件 #ifndef DEMO_H #define DEMO_H#include <QWidget> #include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> //执行sql语句的类 #include <QSqlRecord> //数据库记录的类 #include <QMessageBox>…

传统的经典问题 Java 的 Interface 是干什么的

传统的经典问题 Java 的 Interface 是干什么 解答 上面的这个问题应该还是比较好回答的吧。 只要你做过 Java &#xff0c;通常 Interface 的问题多多少少会遇到&#xff0c;而且可能会遇到一大堆。 在JAVA编程语言中是一个抽象类型&#xff08;Abstract Type&#xff09;&…

SpringBoot之静态资源规则与定制化

文章目录 前言一、静态资源访问二、静态资源访问前缀三、webjar资源处理的默认规则 四、welcome与favicon功能1.欢迎页支持欢迎页处理规则 2.自定义Favicon 五、补充总结 前言 本文主要介绍关于SpringBoot中Web开发的简单功能。 一、静态资源访问 只要静态资源放在类路径下&am…