首页 > 编程语言 >PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)

时间:2022-12-01 10:04:50浏览次数:60  
标签:05 PaddleOCR C++ 编译 GPU 49564



导读

本文主要介绍PaddleOCR v2.6 C++ GPU版的编译详细步骤与踩坑记录,方便大家快速上手。(公众号:OpenCV与AI深度学习)

PaddleOCR 2.6

    8月24日PaddleOCR更新了2.6版本,下面是主要更新内容:

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_paddle

    详细介绍请查看对应github:

​    https://github.com/PaddlePaddle/PaddleOCR​

    往前相关PaddleOCR内容:

C++ GPU编译

    C++ CPU版的编译与推理详细步骤前几天已介绍过,详见下面链接:

    ​​PaddleOCR v2.6新特征与C++编译推理详细步骤演示​

    下面来介绍GPU版本的编译与使用:

【1】安装CUDA和cuDNN环境,这里以CUDA10.1和cuDnn7.6.5为例:

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_c++_02

安装CUDA10.1并将cuDnn7.6.5解压后复制到CUDA安装目录:

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_深度学习_03

【2】下载PaddleOCR-release-2.6,与前面一样创建build文件夹deploy\cpp_infer\build

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_深度学习_04

【3】下载paddle_inference推理库文件,这里下载avx_mkl_cuda10.1_cudnn7.6.5_avx_mkl-trt6.0.1.5这一版,包含TensorRT,没有TensorRT的版本不要下,里面的头文件不全,后续编译会报错,下载地址:

​https://paddleinference.paddlepaddle.org.cn/user_guides/download_lib.html#windows​

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_paddle_05

【4】安装上面图片对应版本下载TensorRT-6.0.1.5.Windows10.x86_64.cuda-10.1.cudnn7.6,然后解压即可。

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_深度学习_06

【5】CMake编译,注意勾选相关选项、设置对应目录如下:

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_paddle_07

然后config、generate,完成后打开ppocr.sln,本文使用VS2017编译。

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_深度学习_08

【6】VS2017编译,先生成ALL_BUILD,然后生成ppocr。同样会报错,内容与上篇文章一样:

(1) 无法打开包括文件: “dirent.h”: No such file or directory

(2) mkdir找不到标识符

解决方法:

PaddleOCR v2.6新特征与C++编译推理详细步骤演示

【7】下载推理库,复制对应的dll到ppocr.exe同目录,命令行运行即可。

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_c++_09

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_paddle_10

英文识别cmd命令行指令:

ppocr.exe --det_model_dir=./model_1/en_PP-OCRv3_det_infer/ --rec_model_dir=./model_1/en_PP-OCRv3_rec_infer/ --image_dir=./imgs/

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_paddle_11

输出log信息与识别结果:

e[1me[35m--- Running analysis [ir_graph_to_program_pass]e[0m
I0829 16:05:56.560971 49564 analysis_predictor.cc:1035] ======= optimize end =======
I0829 16:05:56.560971 49564 naive_executor.cc:102] --- skip [feed], feed -> x
I0829 16:05:56.563968 49564 naive_executor.cc:102] --- skip [softmax_2.tmp_0], fetch -> fetch
predict img: ./imgs\1.JPG
W0829 16:05:56.576009 49564 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 6.1, Driver API Version: 10.1, Runtime API Version: 10.1
W0829 16:05:56.576009 49564 gpu_resources.cc:91] device: 0, cuDNN Version: 7.6.
W0829 16:05:56.579969 49564 helper.h:107] TensorRT was linked against cuBLAS 10.2.0 but loaded cuBLAS 10.1.0
W0829 16:05:56.597970 49564 helper.h:107] TensorRT was linked against cuBLAS 10.2.0 but loaded cuBLAS 10.1.0
predict img: ./imgs\2.JPG
predict img: ./imgs\3.JPG
./imgs\1.JPG
0 det boxes: [[12,53],[636,48],[636,102],[12,107]] rec text: Improve Brand Awareness rec score: 0.961477
1 det boxes: [[95,137],[573,143],[572,197],[94,191]] rec text: The Best to Rely on rec score: 0.941693
The detection visualized image saved in ./output//1.JPG
***************************

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_paddle_12

中文识别类似,参考前面文章即可。

【8】VS2017 + RTX3060编译遇到的问题(因为另外一台电脑GPU是RTX3060)

(1) 按照下图版本下载对应文件:

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_paddle_13

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_深度学习_14

(2) CMake编译按照上面步骤不会出错,在编译ppocr.sln的时候会有两个新错误:

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_深度学习_15

这里需要改一下cudnn.lib的路径,因为它跟另外两个lib不在同一个文件夹下:

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_c++_16

另一个报错如下(如果你本身用的VS2019,此问题忽略):

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_深度学习_17

报错原因是这里面的gflags_static.lib和glog.lib是VS2019编译的

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_c++_18

我们在前面avx_mkl_cuda10.1_cudnn7.6.5_avx_mkl-trt6.0.1.5里面找到对应的lib替换当前对应两个的lib,重新编译ppocr即可。

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_paddle_19

PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)_c++_20



觉得有用,记得点个赞

标签:05,PaddleOCR,C++,编译,GPU,49564
From: https://blog.51cto.com/stq054188/5901178

相关文章

  • 计挑-C++-20-编程4
    题目描述有N个正整数,求这N个正整数两两之间的公共质因数之和。输入说明第1行:正整数N(N<100)第2行:N个空格分隔的正整数(每个元素<10000)输出说明输出这N个正整数两......
  • C++ 友元函数实现运算符重载、成员函数实现运算符重载
    1.友元函数实现运算符重载(复数的加减法)Complex.h:#pragmaonce#include<string>usingnamespacestd;classComplex{public:Complex();Complex(intr......
  • OpenCV+yolov2-tiny实现目标检测(C++)
    OpenCV+yolov2-tiny实现目标检测(C++)  目标检测算法主要分为两类:一类是基于RegionProposal(候选区域)的算法,如R-CNN系算法(R-CNN,FastR-CNN,FasterR-CNN),它们是two-stag......
  • C++生成均匀分布的随机实数
    #include<random>#include<iostream>intmain(){//定义均匀分布对象,均匀分布区间(a,b)为(2,6)std::uniform_real_distribution<double>uid{2,6};////......
  • C++数据结构和算法:排序算法
    为了便于测试,先写一个生成随机数组的方法。1pair<int*,int>GenerateRandomArray(intmaxSize,intmaxValue,intminValue)2{3//随机数组长度4cons......
  • 基于GPU 显卡在k8s 集群上实现hpa 功能
    前言Kubernetes支持HPA模块进行容器伸缩,默认支持CPU和内存等指标。原生的HPA基于Heapster,不支持GPU指标的伸缩,但是支持通过CustomMetrics的方式进行HPA指标的扩展。我们......
  • (一)C++什么时候需要将#include写到头文件,什么时候需要写到cpp文件?
    https://www.zhihu.com/question/270945429首先.h和.cpp文件在编译器中是几乎一样不做区分的都是文件而已。其次#include的作用就相当于把引入文件中的所有内容完整的复......
  • C++ 不知算法系列之初识动态规划算法思想
    1.概述动态规划算法应用非常之广泛。对于算法学习者而言,不跨过动态规划这道门,不算真正了解算法。初接触动态规划者,理解其思想精髓会存在一定的难度,本文将通过一个案例,抽......
  • C++基础语法学习:STL
    基础语法学习,少点比较,多些谦虚1.容器:常见的容器有以下几类:1.vector:向量2.deque:双端队列3.list:列表4.set:集合5:multiset:多重集合6.map:映射7:multimap:多重映射2.......
  • Effective C++试读笔记
    Part1习惯C++1.视C++为一个语言联邦C++非常的屌,除了开发效率和编译效率不高,其他的都非常屌C++可以视为一系列的语言联邦构成的紧密结合体,分为以下四个部分C2.C......