(一)ubuntu下通过c++编译cpu版本paddleocr-2.8.1

news2024/11/28 2:46:15

编译环境

操作系统:ubuntu 20.04/22.04

OCR版本:paddleocr 2.8.1

Opencv版本:opencv3.4.16/4.10.0

o参照官方文档:

PaddleOCR/deploy/cpp_infer/readme_ch.md at release/2.6 · PaddlePaddle/PaddleOCR · GitHubicon-default.png?t=O83Ahttps://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/deploy/cpp_infer/readme_ch.md#12

第一步 安装opencv

方式一 源代码编译安装

        【推荐】篇幅太长,请按照我另外一篇文章使用源代码安装

opencv3.4.16之Ubuntu22.04/20.04下源代码编译安装-CSDN博客文章浏览阅读954次,点赞10次,收藏9次。通常安装无需新增路径,而是后续指定到/usr/local,但是我又特殊用途,而且要观察安装后的内容有哪些,所以我在当前个人文件夹下新增一个opencv文件来安装。在个人目录下如我的是/home/wuxiutong/下运行一个wget代码即可将opencv3.4.16的源代码zip包下载到当前个人目录下。至此我需要的编译及安装即结束,如果需要其他用途的则需要将opencv设置到环境变量中及其他配置,可以参考文首的LLL_666的文件末尾配置。安装依赖,安装依赖很重要,依赖没有安装好会编译失败。https://blog.csdn.net/atumu11520/article/details/143054707?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522FE11871B-9B92-44DE-B827-4934BC60903C%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=FE11871B-9B92-44DE-B827-4934BC60903C&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-143054707-null-null.142%5Ev100%5Epc_search_result_base8&utm_term=opencv3.4.16%E4%B9%8BUbuntu22.04%2F20.04%E4%B8%8B%E6%BA%90%E4%BB%A3%E7%A0%81%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85&spm=1018.2226.3001.4187

 方式二 使用已经编译好的版本

        如果源代码编译容易报错或编译速度很慢,可使用我以下的编译好的版本,下载后解压到个人目录下的opencv文件夹中备用。

        以下链接中按需下载指定版本,目前包含3.4.16及4.10.0版本。3.4.16的版本是ubuntu 2020.04下g++ 9.4.0编译,4.10.0的版本是ubuntu 2024.04下g++ 13.2.0编译,请按照自己的环境下载使用。

链接: https://pan.baidu.com/s/1IW9YVIXADV_QmcS7RwrQJg 提取码: n6h4

第二步 下载paddleOcr源码

        执行如下代码,会在当前目录下生成一个PaddleOCR文件夹        

git clone https://github.com/PaddlePaddle/PaddleOCR.git

         上述无法clone时使用国内gitee镜像

git clone https://gitee.com/paddlepaddle/PaddleOCR.git

         进入PaddleOCR路径下

cd PaddleOCR

        进入PaddleOCR,查看发行版本,切换版本到2.8.1.

git show-ref

        切换tag到v2.8.1  

git checkout 40c56628fda416e1c8710eb19e4b260536902520

        切换后使用git log查看,可以看到当前版本执行2.8.1即可

第二步 下载paddle预测库

注意此时所在路径是PaddleOCR下。

我这里使用官方已经编译好的版本,执行一下代码会直接下载并加以到paddle_inference文件夹中

wget https://paddle-inference-lib.bj.bcebos.com/2.3.2/cxx_c/Linux/CPU/gcc8.2_avx_mkl/paddle_inference.tgz && tar -xf paddle_inference.tgz && rm paddle_inference.tgz

第三步 下载paddleOCR推理模型

注意此时所在路径是PaddleOCR下,新建一个目录infer,后续的三个模型都会下载到该infer目录中。

mkdir infer && cd infer

下载检测模型v4轻量版,这里使用轻量的原因是轻量版本的速度比高清版本快了10倍(我个人电脑上实测)不止

wget https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_infer.tar && tar -xf ch_PP-OCRv4_det_infer.tar && rm ch_PP-OCRv4_det_infer.tar

下载文字识别模型v4轻量版,这里使用轻量的原因是轻量版本的速度比高清版本快了10倍(我个人电脑上实测)不止

wget https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_infer.tar &&  tar -xf ch_PP-OCRv4_rec_infer.tar && rm ch_PP-OCRv4_rec_infer.tar

下载文字方向分类器

wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar && tar xf ch_ppocr_mobile_v2.0_cls_infer.tar && rm ch_ppocr_mobile_v2.0_cls_infer.tar

以上下载完成后当前目录下文件内容如下:

第四步 编译paddleOCR代码

        进入PaddleOCR下的deploy/cpp_infer/

cd deploy/cpp_infer

 1、修改tools/build.sh脚本

        修改tools/build.sh文件中的OPENCV_DIR路径指向第一步编译后的opencv文件夹和LIB_DIR路径指向第三步下载的paddle_inference文件夹,因为不使用GPU所以将CUDA_LIB_DIR和CUDNN_LIB_DIR文件夹置空,具体如下

OPENCV_DIR="/home/wuxiutong/opencv"
LIB_DIR="/home/wuxiutong/PaddleOCR/paddle_inference"
CUDA_LIB_DIR=""
CUDNN_LIB_DIR=""

BUILD_DIR=build
rm -rf ${BUILD_DIR}
mkdir ${BUILD_DIR}
cd ${BUILD_DIR}
cmake .. \
    -DPADDLE_LIB=${LIB_DIR} \
    -DWITH_MKL=ON \
    -DWITH_GPU=OFF \
    -DWITH_STATIC_LIB=OFF \
    -DWITH_TENSORRT=OFF \
    -DOPENCV_DIR=${OPENCV_DIR} \
    -DCUDNN_LIB=${CUDNN_LIB_DIR} \
    -DCUDA_LIB=${CUDA_LIB_DIR} \
    -DTENSORRT_DIR=${TENSORRT_DIR} \

make -j

         上述脚本的中/home/wuxiutong这路径需要替换成你当前电脑。

2、执行编译

        执行编译提示没有cmake的时候请安装cmake这个版本提示3.11及以上均可。

sudo apt install cmake

        运行脚本执行编译

sudo sh ./tools/build.sh

       若编译报错则主要看后面的异常处理。

        编译成功截图如下:

        编译成功后在PaddleOCR/deploy/cpp_infer/build下会有一个ppocr可执行文件生成。

3、编译异常处理

a、提示cc1plus: error *****too many filenames given字样报错。

该错误在ubuntu 20.04的g++ 9.4.0上不会报错,但是在ubuntu 22.04的g++ 11.4.0上则会报错,如下图所示
        报以上错误则需要去PaddleOCR/deploy/cpp_infer下的CMakeLists.txt文件中第74行的-o3修改成-O3(前者是小写字母,后者是大写字符),如下图所示。

        说明:两者区别是大写O是指定编译器优化级别(Optimize的首字母),总共四个级别(-O0不优化,-O1默认值,-O2,-O3最高优化级别),小写o是指定输出文件(output的首字母),应该是官方的打字错误导致)。

 b、提示unable to access 'https://github.com/LDOUBLEV/AutoLog.git/字样

        该

错误是因为无法方式github导致的,错误如下图所示:

        如上图报错则去修改PaddleOCR/deploy/cpp_infer/external-cmake/auto-log.cmake文件,将里面的GIT_REPOSITORY修改整gitee库即可解决。

 c、提示opencv***.cmake文件找不到

        报错如下图所示:

        以上是编译时检测opencv的cmake文件位置,查看deploy/cpp_infer下的CMakeLists.txt文件发现默认查找的是opencv/share/OpenCV文件夹下如图所示:

      请自行去编译好的opencv路径下查找包含“OpenCVConfig-version.cmake,OpenCVConfig.cmake, OpenCVModules-release.cmake,OpenCVModules.cmake”的路径,然后将deploy/cpp_infer/CMakeLists.txt下如上图所示路径做调整执行以上路径。

        如opencv-4.10.0编译时指定了“-DCMAKE_INSTALL_LIBDIR=lib64”,所以需要将该地址修改为如下图所示:

第五步 运行ppocr识别图片

1、添加运行脚本ocr.sh

添加在PaddleOCR/deploy/cpp_infer/下新增运行脚本ocr.sh

vim ocr.sh

        run.sh脚本内容如下,其中/home/wuxiutong/infer/路径部分根据你实际下载的ocr模型地址调整,--image_dir值可以指向具体图片或者一个文件夹(一个文件夹则文件夹下的所有图片格式jpg、png都会被执行ocr识别,该图片自行准备)。

./build/ppocr --det_model_dir=/home/wuxiutong/PaddleOCR/infer/ch_PP-OCRv4_det_infer \
    --rec_model_dir=/home/wuxiutong/PaddleOCR/infer/ch_PP-OCRv4_rec_infer \
    --cls_model_dir=/home/wuxiutong/PaddleOCR/infer/ch_ppocr_mobile_v2.0_cls_infer \
    --image_dir=/home/wuxiutong/pic/jzpz1.png \
    --use_angle_cls=true \
    --det=true \
    --rec=true \
    --cls=true \

2、执行ocr识别

sh ocr.sh

识别结果如下图所示

3、运行报错排查

        如果执行遇到类似于如下的报错则需要去paddle_inference/install下找提示中的如libiomp5.so文件然后做个软连接到/usr/lib/下就可以解决。

./build/ppocr: error while loading shared libraries: libiomp5.so: cannot open shared object file: No such file or directory

以下就是我整理的需要连接的库文件,其中/home/wuxiutong/PaddleOCR/paddle_inference/路径需要根据前面“第三步”下载的paddleOCR推理库路径修改。

sudo ln -s /home/wuxiutong/PaddleOCR/paddle_inference/third_party/install/mklml/lib/libiomp5.so /usr/lib/libiomp5.so
sudo ln -s /home/wuxiutong/PaddleOCR/paddle_inference/third_party/install/onnxruntime/lib/libonnxruntime.so /usr/lib/libonnxruntime.so.1.11.1
sudo ln -s /home/wuxiutong/PaddleOCR/paddle_inference/third_party/install/paddle2onnx/lib/libpaddle2onnx.so /usr/lib/libpaddle2onnx.so.1.0.0rc2
sudo ln -s /home/wuxiutong/PaddleOCR/paddle_inference/third_party/install/mkldnn/lib/libdnnl.so.2 /usr/lib/libdnnl.so.2

最后再次运行sh run.sh即可出现识别成功提示。

本文更新日期:2024年11月22日

下文将会讲些windows下如何执行编译。

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

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

相关文章

Vue3脚手架和指令

什么是Vue? 简单来说,vue就是可以让有写代码很爽的体验。 概念:Vue是一套构建用户界面的渐进式JavaScript框架。 什么是构建用户界面? 基于数据渲染出用户可以看到的界面 什么是渐进式? 渐进式就是循序渐进的学习…

LabVIEW提高开发效率技巧----VI继承与重载

在LabVIEW开发中,继承和重载是面向对象编程(OOP)中的重要概念。通过合理运用继承与重载,不仅能提高代码的复用性和灵活性,还能减少开发时间和维护成本。下面从多个角度介绍如何在LabVIEW中使用继承和重载,并…

HttpURLConnection构造请求体传文件

HttpURLConnection构造请求体传文件 在Java中,使用HttpURLConnection构造请求体传输文件,你需要做以下几步: 1、创建URL对象指向你想要请求的资源。 2、通过URL打开连接,转换为HttpURLConnection实例。 3、设置请求方法为POST。 …

Java 多线程(五)—— 阻塞队列、wait、notify

wait wait 和 notify 都是 Object 类提供的方法,也就是说 Java 任意对象都可以使用 这两个方法。 首先 wait 会抛出 InterruptedException 这个异常,说明这个方法可以被 interrupt 给唤醒。 然后我们是不能直接使用 wait 方法的,否则还会抛…

Win10系统安装docker操作步骤

Docker下载 docker下载地址:Docker: Accelerated Container Application Development 打开网页后,点击图下所示,下载windows版本的docker 启用Hyper-V 和容器特性 右键左下角windows图标,选择应用和功能 然后在下面的界面中&am…

电脑技巧:Rufus——最佳USB启动盘制作工具指南

目录 一、功能强大,兼容性广泛 二、界面友好,操作简便 三、快速高效,高度可定制 四、安全可靠,社区活跃 在日常的电脑使用中,无论是为了安装操作系统、修复系统故障还是进行其他需要可引导媒体的任务,拥…

初始JavaEE篇——多线程(2):join的用法、线程安全问题

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 模拟实现线程中断 join的用法 线程的状态 NEW: RUNNABLE: TIMED_WAITING: TERMINATED…

ElasticSearch-7.17.10集群升级至ElasticSearch-7.17.24

文章目录 集群概览 主机名系统版本es01CentOS_7.6-aaarch64ElasticSearch-7.17.10es02CentOS_7.6-aaarch64ElasticSearch-7.17.10es03CentOS_7.6-aaarch64ElasticSearch-7.17.10 需求 1. 将三台ES节点从ElasticSearch-7.17.10升级至ElasticSearch-7.17.24; 2. 保证…

1212,查询球队积分

查询球队积分 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表…

HarmonyOS 模块化设计

1.HarmonyOS 模块化设计 模块化设计文档   应用程序包开发与使用文档 1.1. 概述 组件化一直是移动端比较流行的开发方式,有着编译运行快,业务逻辑分明,任务划分清晰等优点,HarmonyOs组件化的使用,有利于模块之间的解…

【WRF数据准备】地形-SRTM的3s高分辨率地形数据集

【WRF数据准备】地形-SRTM的3s高分辨率地形数据集 数据概述数据下载 数据处理合并多个SRTM 数据-GDAL库转为geogrid二进制格式WPS 中的设置 数据对比海洋区域缺省值参考 WRF中地形数据(海拔高度)分辨率最高为30s,差不多就是900 m,…

CST光子晶体微谐振腔分析和Q值提取

本期介绍基于文献[1]的一种二维光子晶体波导结构,利用路径上加微谐振腔来实现一些特殊的滤波功能。一般是要看谐振频率的变化和Q值变化,因为工艺误差或任何造成结构不规则的因素对这样细小的结构谐振来说影响非常大。下图为文献中提到的硅薄膜结构&#…

使用Jenkins持续集成的一些经验总结!

01、Performance插件兼容性问题 自由风格项目中,有使用 Performance 插件收集构建产物,但是截至到目前最新版本(Jenkins v2.298,Performance:v3.19),此插件和Jenkins都存在有兼容性问题&#x…

业余时间试一试利用AI 人工智能赚钱

内容创作与写作: 撰写文章:许多网站、博客和企业都需要大量的优质内容。利用 AI 工具如 ChatGPT 等,获取文章的思路、框架甚至初稿,然后根据自己的知识和经验进行修改、润色和完善。你可以在一些自由撰稿人平台、内容创作平台上承…

autumn是 “秋天”,year是 “年”,那autumn years是什么意思?柯桥商务剑桥英语学习外贸口语

autumn是“秋天”,year是“年”, 那你知道 autumn years 是什么意思? autumn years是什么意思? autumn years 直译为“秋天的15857575376*年”,但这样的理解并不准确,《剑桥辞典》中对这个词组的英文解释…

如何评估检索增强型生成(RAG)应用

RAG,也就是检索增强型生成,是现在大型语言模型(LLMs)时代里的一个超火的AI框架,比如你知道的ChatGPT。它通过把外面的知识整合进来,让这些模型变得更聪明,能给出更准确、更及时的回答。详见前篇…

[WiFi] Wi-Fi HaLow: IEEE 802.11ah 无线网络协议介绍

参考链接 802.11ah(HaLow)协议解析1:协议简介 - 知乎 802.11ah(HaLow)协议解析3:物理层改进 - 知乎 Wi-Fi HaLow: IEEE 802.11ah Wireless Networking Protocol - IoTEDU Wi-Fi CERTIFIED HaLow | Wi-F…

实现iOS Framework生成全流程详解

引言 在iOS开发中,Framework是实现代码复用和模块化开发的有效手段。它不仅可以将复杂的功能封装为独立的组件,还能提升代码的可维护性和可扩展性。Framework的广泛应用使得我们可以轻松地集成第三方库,或将自己的功能打包分发给团队成员使用…

CF351E Jeff and Permutation 题解

#1024程序员节|征文# 人生中的第一道紫题。。。 ​​​​​​题目传送门 解题思路 首先我们可以得到读入时 的正负不影响答案,因为我们可以进行一次操作将它们变成它们的相反数,从而使其变成原数,因此,我们可以将…

项目篇--Maven+Idea+ PrimeFaces+Jsf--项目搭建

文章目录 前言一、PrimeFaces 和 Jsf:1.1 JSF 基础:1.2 PrimeFaces 扩展: 二、项目搭建:2.1 Maven 项目的创建:2 xml 配置:2.1 pom.xml 配置2.2web.xml 配置: 2.3 代码:2.3.1 页面&a…