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

编译环境

操作系统: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 · GitHubhttps://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文件夹

bash 复制代码
git clone https://github.com/PaddlePaddle/PaddleOCR.git

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

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

进入PaddleOCR路径下

bash 复制代码
cd PaddleOCR

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

bash 复制代码
git show-ref

切换tag到v2.8.1

bash 复制代码
git checkout 40c56628fda416e1c8710eb19e4b260536902520

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

第二步 下载paddle预测库

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

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

bash 复制代码
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目录中。

bash 复制代码
mkdir infer && cd infer

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

bash 复制代码
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倍(我个人电脑上实测)不止

bash 复制代码
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

下载文字方向分类器

bash 复制代码
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/

bash 复制代码
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文件夹置空,具体如下

bash 复制代码
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

运行脚本执行编译

bash 复制代码
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

bash 复制代码
vim ocr.sh

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

bash 复制代码
./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识别

bash 复制代码
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推理库路径修改。

bash 复制代码
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下如何执行编译。

相关推荐
内核程序员kevin31 分钟前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
安静读书2 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
小陈phd2 小时前
OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算
人工智能·opencv·计算机视觉
‘’林花谢了春红‘’3 小时前
C++ list (链表)容器
c++·链表·list
机器视觉知识推荐、就业指导5 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
朝九晚五ฺ5 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream5 小时前
Linux的桌面
linux
xiaozhiwise5 小时前
Makefile 之 自动化变量
linux
Yang.997 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3