最详细的编译paddleOcrGPU C++版本指南(包含遇到坑的解决办法)

news2024/11/28 10:57:55

前言:
我是之前编译过调用CPU的paddleOcr的C++版本,其实CPU版本与GPU版本并无太大不同,只不过是调用库版本的不同,然后原项目中几个相关参数改一下就可以,但是在这个过程中我找不到关于编译paddleOcrGPU C++版本的详细教程介绍,没有目的的踩了一些坑,在这里详细的记录下来整个过程与解决办法。

配环境的准备工作

首先需要看官方提供的库需要什么什么版本的CUDA,cudnn,tensorRT,官方库地址在这里
https://paddleinference.paddlepaddle.org.cn/user_guides/download_lib.html#windows
在这里插入图片描述
我是选的最后一个版本,可以看到上面需要cuda11.6,cudnn8.4,tensorRT8.4.1.5,所以按照需要的版本进行安装,我是参考的这篇https://blog.csdn.net/weixin_42408280/article/details/125933323写的非常好

  • cuda下载路径
    https://developer.nvidia.com/cuda-toolkit-archive
    在这里插入图片描述
    这个Version10是windows10的意思
  • cudnn下载路径
    https://developer.nvidia.com/rdp/cudnn-archive
  • tensorRT下载路径(GA是指稳定版)
    https://developer.nvidia.com/nvidia-tensorrt-8x-download

配环境

其实配环境很简单,cuda就直接继续安装就行,会默认安装到C盘,测试就算我该地址到D盘,还是会装到C盘,需要C盘空间足够

  • 配置cudnn与TensorRT
    将下载好的cudnn和TensorRT分别解压,并分别将两个解压后的文件夹内的:bin, include, lib\ 目录复制到cuda安装路径下,cuda的默认安装路径为:C:\Program Files\NVIDIA GPU Computing Toolkit\CUD

下载Paddle库

地址:https://paddleinference.paddlepaddle.org.cn/user_guides/download_lib.html#windows
解压后的文件
在这里插入图片描述

改代码

之前如果部署过cpu版本的就非常简单了,只需要将CMakeLists里调用的静态库(.lib)改成GPU版本的库即可
这是我的CMakeLists.txt

# cmake_minimum_required(VERSION 3.5)
# # 设置c++标准
# set(CMAKE_CXX_STANDARD 17)
# project(PaddleOcr)
# # 默认arm
# set(path lib/arm)
# set(opencvVersion opencv410)#设置opencv版本
# # 头文件
# include_directories(./include)
# include_directories(/home/nvidia/paddleOCR/PaddleOCR-release-2.6/deploy/cpp_infer)
# include_directories(/usr/include)
# include_directories(/home/nvidia/paddleOCR/paddle_inference_install_dir/paddle/include)
# include_directories(/home/nvidia/opencv-4.1.0/include/opencv2)
# include_directories(/home/nvidia/paddleOCR/paddle_inference_install_dir/third_party/install/glog/include)
# include_directories(/home/nvidia/paddleOCR/paddle_inference_install_dir/third_party/AutoLog-main)
# include_directories(/home/nvidia/paddleOCR/paddle_inference_install_dir/third_party/install/gflags/include)
# include_directories(/home/nvidia/paddleOCR/paddle_inference_install_dir/third_party/install/protobuf/include)
# include_directories(/home/nvidia/paddleOCR/paddle_inference_install_dir/third_party/threadpool)
# # 库文件
# link_directories(/usr/lib)
# link_directories(/home/nvidia/paddleOCR/paddle_inference_install_dir/third_party/install/glog/lib)
# link_directories(/home/nvidia/paddleOCR/paddle_inference_install_dir/paddle/lib)
# link_directories(/home/nvidia/opencv-4.1.0/build/lib)
# link_directories(/home/nvidia/paddleOCR/paddle_inference_install_dir/third_party/install/protobuf/lib)
# link_directories(/home/nvidia/paddleOCR/paddle_inference_install_dir/third_party/install/gflags/lib)

# aux_source_directory (src SRC_LIST)
# add_executable (test ${SRC_LIST})
# # c++17
# target_link_libraries(test  opencv_highgui opencv_core opencv_imgproc opencv_imgcodecs opencv_calib3d opencv_features2d opencv_videoio protobuf glog gflags paddle_inference pthread)
# # 注意测试
# set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin/arm)

##################################################################################################
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()

cmake_minimum_required(VERSION 3.5)
# 设置c++标准
set(CMAKE_CXX_STANDARD 17)
project(DsOcr)

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."   OFF)

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()


set(opencvVersion opencv410)#设置opencv版本
# 头文件
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/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)

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

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

target_link_libraries(test
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
)

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

除了改CMakeLists文件,只需要改args.cpp里的参数就可以了
请添加图片描述

  • use_gpu打开
  • use_tensorrt我选择true,然后运行的时候会报这个错,我不知道怎么解决,就暂时不使用这个功能
    在这里插入图片描述
  • gpu_id是gpu的编号,默认为一个,即调用一个GPU
  • benchmark打开可以看到具体的推理速度等信息
    在这里插入图片描述

编译出exe可执行文件

使用vscode编译
如果是x64系统就选择这个
在这里插入图片描述
特别注意一定要选好是release版本还是debug版本,我之前没有注意到这个地方,默认选的debug,然后会报好多找不到库的错,然后我就用的visual studio生成exe,vs太庞大了,运行很慢,所以很麻烦,后来才发现是我没有选成release模式。
在这里插入图片描述

  1. 用vscode编译可执行文件非常简单丝滑,先在build文件夹下cmake ..生成sln文件
  2. 然后按build生成exe文件
  3. 最后按4那个箭头就可以直接运行生成好的exe文件

遇到的大坑

因为我之前编译过cpu版本的,所以我属于直接复制了之前的项目,然后改了几个参数,到运行的时候报错请添加图片描述
我排查了好久,网上根本找不到同种报错的解决办法,最后知道这类错误就属于dll与lib的版本不匹配的问题,我突然想去来我的exe文件夹内还是用的之前的cpu版本的dll,而我的lib使用的gpu版本的lib,我把dll替换为gpu版本的就没有报这个错了,这给了我一个解决办法的思路,如果解决问题时没有方向可以把整个项目清空,从头开始搭建项目,就不会受其他因素影响,有可能就能解决项目的报错。

  • exe需要的dll文件
    在这里插入图片描述
    都是从官方库里下载的库里的thirdparty或者lib里复制过来的

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

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

相关文章

【Docker】Consul的容器服务更新与发现

目录 一、Consul二、什么是服务注册与发现1.2什么是consul1.3consul提供的一些关键特性 二、Consul部署2.1环境配置2.2Consul服务器配置1. 建立 Consul 服务2. 查看集群信息3. 通过 http api 获取集群信息 2.3 registrator服务器配置1. 安装 Gliderlabs/Registrator2. 测试服务…

如何设置Axure中文版 Mac系统下axurerp10怎么设置成中文

有许多小伙伴肯定想知道axure rp 10怎么转换为中文版,接下来就为大家带来最详细的汉化教程,大家可以根据教程一步一步操作,保证可以汉化成功! 准备工作 安装好axurerp10 axurerp10汉化包 百度网盘链接: 百度网盘 请输入提取码 …

【C++】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值

最近想用c做一个小游戏,游戏的主要内容是利用键盘控制一个飞机躲避和击落屏幕顶部随机掉落敌方炮弹,飞机被敌方炮弹击中则减掉一条命,飞机也可以发射炮弹反击,每击落一个敌方炮弹,则有相应积分。 游戏的思路就是利用w…

Docker配置阿里云容器镜像加速

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

目录操作在C语言中:一个全面的指南

(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…

7.26 Qt

用QT制作一个登陆界面 运行代码 login.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> //信息调试类&#xff0c;用于输出 #include <QIcon> //图标类头文件 #include <QPushButton&…

更新合集 | 七月功能上新记

点击链接了解详情 七月来临&#xff0c;正式开启 2023 下半年的新征途&#xff01;这个盛夏&#xff0c;腾讯云 CODING 上线了微信扫码注册、微信通知、Go 制品管理等重点能力&#xff0c;为企业及团队研发管理带来更多便利&#xff01;以下是 CODING 新功能速递&#xff0c;快…

一文搞定IP地址

IP编址系列文章&#xff08;上&#xff09; 目录 一&#xff0c;什么是IP地址&#xff1f; 二&#xff0c;IP地址的表示方式 问题&#xff1a;计算机能识别二进制&#xff1f;十进制&#xff1f;十六进制&#xff1f; 三&#xff0c;二进制如何转换为十进制呢&#xff1f; …

如何准备远程开发环境

准备一台有root权限的服务器 创建用于开发的子用户 使用adduser命令创建新用户: sudo adduser newuser为新用户添加sudo权限,编辑sudoers文件: sudo visudo在文件中添加: newuser ALL(ALL:ALL) ALL将新用户添加到docker用户组: sudo usermod -aG docker newuser改权限 ch…

Java 聊天程序案例

单线程版本&#xff1a; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;//服务端 public class Server {public static void main(String…

HikariCP连接池

HikariCP连接池 HikariCP连接池是高性能的JDBC连接池&#xff0c;官网标注的三大特点&#xff1a;快速、简单、可靠&#xff0c;性能优于其他连接池。 官网详细地说明了HikariCP所做的一些优化&#xff0c;总结如下&#xff1a; 字节码精简&#xff1a;优化代码&#xff0c;直…

领跑人机协同时代!实在智能与EFCIO携手举办AI沙龙,推动企业数字化转型

GPT翻开了AGI&#xff08;通用人工智能&#xff09;领域的新篇章&#xff0c;也开启了各行各业的新时代。毫不夸张地说&#xff0c;进入大模型时代&#xff0c;所有的应用都值得被重写一遍。同时&#xff0c;企业也需要积极采纳新技术和创新模式&#xff0c;以应对竞争压力和不…

MURF2080CT/MURF2080CTR-ASEMI快恢复对管

编辑&#xff1a;ll MURF2080CT/MURF2080CTR-ASEMI快恢复对管 型号&#xff1a;MURF2080CT/MURF2080CTR 品牌&#xff1a;ASEMI 芯片个数&#xff1a;2 芯片尺寸&#xff1a;102MIL*2 封装&#xff1a;TO-220F 恢复时间&#xff1a;50ns 工作温度&#xff1a;-50C~150C…

代码随想录day28

46. 全排列 思路&#xff1a;这道题首先是一个排列问题&#xff0c;排列问题是讲究顺序的&#xff0c;例如[1,2]和[2,1]是两个不一样的排列&#xff0c;这里的1我们会有重复使用到&#xff0c;但是&#xff0c;在每一个排列中&#xff0c;每一个元素只能使用一次。所以需要一个…

外贸行业企业邮箱选择:安全好用的邮箱服务

随着全球化的发展&#xff0c;外贸行业在全球经济中越来越重要。作为一家从事对外贸易的企业&#xff0c;可靠、安全、易用的邮箱系统对于成功的国际交易至关重要。为您的企业选择正确的邮箱解决方案可能是一个挑战。为了使选择过程更加简化&#xff0c;我们在这里提供了一些提…

C++模板的简单练习

运行代码&#xff1a; #include"std_lib_facilities.h"template <class T>struct S { private:T val; public:S<T>() :val(T()) {}S<T>(T tt) : val(tt) {};T& get();void set(T tt) { val tt; }ostream& operator << (ostream&a…

为什么 Splashtop 是更好用的 iOS 远程桌面应用

全球远程桌面软件市场最近达到19.2亿美元&#xff0c;表明使用任意设备实现随处远程控制越来越受欢迎。 近年来&#xff0c;企业的运营方式发生了重大改变&#xff0c;远程桌面软件已成为广泛使用的解决方案。Splashtop 是目前最好用的远程桌面工具之一&#xff0c;安全可靠且…

Android安卓实战项目(2)---健身UI APP(源码在文末)

Android安卓实战项目&#xff08;2&#xff09;—健身UI APP&#xff08;源码在文末&#xff09; 一.项目运行介绍 1.大致浏览 2.功能介绍 &#xff08;1&#xff09;功能一 第一个界面点击后可以弹出图像&#xff0c;如图&#xff1a; &#xff08;2&#xff09;功能二 界…

[Spring] 三级缓存解决循环依赖详解

什么是循环依赖 注册一个bean对象的过程&#xff1a; Spring扫描class得到BeanDefinition – 根据得到的BeanDefinition去生成bean – 现根据class推断构造方法 – 根据推断出来的构造方法&#xff0c;反射&#xff0c;得到一个对象 – 填充初始对象中的属性(依赖注入) – 如果…

window的anaconda下安装opencv

window安装opencv 阿巴阿巴&#xff0c;安装了多少遍的opencv今天居然搞了这么久。整理一下笔记把。 解决思路主要来源于&#xff1a;(37条消息) 导入import cv2时出现ImportError:DLL load fail:找不到指定模块的解决办法_import cv2 importerror: dll load failed: 找不到指定…