PaddleOCR使用笔记-基于C++预测引擎推理(第二次尝试)(成功)

PaddleOCR使用笔记

Linux环境下

基于C++预测引擎推理(第二次尝试)(失败)(又成功了)

注:本节基于PaddleOCR 2.3分支

参考文档:PaddleOCR/readme.md at release/2.3 · PaddlePaddle/PaddleOCR (github.com)

1.1 编译OpenCV库
  • 首先需要从opencv官网上下载在Linux环境下源码编译的包,以opencv3.4.7为例,下载命令如下。
cd deploy/cpp_infer
wget https://github.com/opencv/opencv/archive/3.4.7.tar.gz
# wget https://gitee.com/mirrors/opencv/repository/archive/3.4.7?format=tar.gz
tar -xf 3.4.7.tar.gz

最终可以在当前目录下看到opencv-3.4.7/的文件夹。

在这里插入图片描述
在这里插入图片描述

  • 编译opencv,设置opencv源码路径(root_path)以及安装路径(install_path)。进入opencv源码路径下,按照下面的方式进行编译。
cd opencv-3.4.7root_path='/home/xxx/PaddleOCR/deploy/cpp_infer/opencv-3.4.7'
install_path=${root_path}/opencv3rm -rf build
mkdir build
cd buildcmake .. \-DCMAKE_INSTALL_PREFIX=${install_path} \-DCMAKE_BUILD_TYPE=Release \-DBUILD_SHARED_LIBS=OFF \-DWITH_IPP=OFF \-DBUILD_IPP_IW=OFF \-DWITH_LAPACK=OFF \-DWITH_EIGEN=OFF \-DCMAKE_INSTALL_LIBDIR=lib64 \-DWITH_ZLIB=ON \-DBUILD_ZLIB=ON \-DWITH_JPEG=ON \-DBUILD_JPEG=ON \-DWITH_PNG=ON \-DBUILD_PNG=ON \-DWITH_TIFF=ON \-DBUILD_TIFF=ON

其中root_path为下载的opencv源码路径,install_path为opencv的安装路径,make install完成之后,会在该文件夹下生成opencv头文件和库文件,用于后面的OCR代码编译。

在这里插入图片描述

在这里插入图片描述

make -j

在这里插入图片描述
在这里插入图片描述

make install

在这里插入图片描述

在这里插入图片描述

最终在安装路径下的文件结构如下所示。

opencv3/
|-- bin
|-- include
|-- lib
|-- lib64
|-- share

在这里插入图片描述

1.2 下载或者编译Paddle预测库
  • 有2种方式获取Paddle预测库,下面进行详细介绍。
1.2.1 直接下载安装(这种方式到1.3里的步骤时候失败了)(后来又成功了)
  • Paddle预测库官网 上提供了不同cuda版本的Linux预测库,可以在官网查看并选择合适的预测库版本建议选择paddle版本>=2.0.1版本的预测库 )。

用这个新的官网:下载安装Linux预测库 — Paddle-Inference documentation (paddlepaddle.org.cn)

在这里插入图片描述

  • ~/.bashrc中配置cuda的版本
vi ~/.bashrc
export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
# 激活更改
source ~/.bashrc
  • 看一下cuda版本(10.1.105)
# cat /usr/local/cuda/version.txt
cat /usr/local/cuda-10.1/version.txt

在这里插入图片描述

  • 看一下cuDNN的版本(7.6.2)
# cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
cat /usr/local/cuda-10.1/include/cudnn.h | grep CUDNN_MAJOR -A 2

在这里插入图片描述

  • 看一下gcc的版本(5.4.0)
gcc --version

在这里插入图片描述

  • 综合上面查看的版本,我们选择

在这里插入图片描述

下载下来

wget https://paddle-inference-lib.bj.bcebos.com/2.1.1-gpu-cuda10.1-cudnn7-mkl-gcc5.4/paddle_inference.tgz

在这里插入图片描述

  • 下载之后使用下面的方法解压。
tar -xf paddle_inference.tgz

最终会在当前的文件夹中生成paddle_inference/的子文件夹。

在这里插入图片描述

在这里插入图片描述

1.2.2 预测库源码编译(失败了)
  • 如果希望获取最新预测库特性,可以从Paddle github上克隆最新代码,源码编译预测库。
  • 可以参考Paddle预测库安装编译说明 的说明,从github上获取Paddle代码,然后进行编译,生成最新的预测库。使用git获取代码方法如下。
git clone https://github.com/PaddlePaddle/Paddle.git
cd Paddle
git checkout release/2.1

在这里插入图片描述

在这里插入图片描述

  • 进入Paddle目录后,编译方法如下。
rm -rf build
mkdir build
cd build# 这个命令失败
cmake  .. \-DWITH_CONTRIB=OFF \-DWITH_MKL=ON \-DWITH_MKLDNN=ON  \-DWITH_TESTING=OFF \-DCMAKE_BUILD_TYPE=Release \-DWITH_INFERENCE_API_TEST=OFF \-DON_INFER=ON \-DWITH_PYTHON=ON# 这个命令成功
cmake  .. \-DWITH_CONTRIB=OFF \-DWITH_MKL=ON \-DWITH_MKLDNN=ON  \-DWITH_TESTING=OFF \-DCMAKE_BUILD_TYPE=Release \-DWITH_INFERENCE_API_TEST=OFF \-DON_INFER=ON \-DWITH_PYTHON=OFF \-DCUDA_ARCH_NAME=All# 这个命令成功
cmake  .. \-DWITH_CONTRIB=OFF \-DWITH_MKL=ON \-DWITH_MKLDNN=ON  \-DWITH_TESTING=OFF \-DCMAKE_BUILD_TYPE=Release \-DWITH_INFERENCE_API_TEST=OFF \-DON_INFER=ON \-DWITH_PYTHON=OFF \-DWITH_GPU=ON  \-DWITH_NCCL=OFF \make -j
make inference_lib_dist

更多编译参数选项介绍可以参考文档说明。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 编译完成之后,可以在build/paddle_inference_install_dir/文件下看到生成了以下文件及文件夹。
build/paddle_inference_install_dir/
|-- CMakeCache.txt
|-- paddle
|-- third_party
|-- version.txt

其中paddle就是C++预测所需的Paddle库,version.txt中包含当前预测库的版本信息。

1.3 编译PaddleOCR C++预测demo
  • 修改tools/build.sh中环境路径,相关内容如下:
OPENCV_DIR=your_opencv_dir
LIB_DIR=your_paddle_inference_dir
CUDA_LIB_DIR=your_cuda_lib_dir
CUDNN_LIB_DIR=/your_cudnn_lib_dir

其中,OPENCV_DIR为opencv编译安装的地址;LIB_DIR为下载(paddle_inference文件夹)或者编译生成的Paddle预测库地址(build/paddle_inference_install_dir文件夹);CUDA_LIB_DIR为cuda库文件地址,在docker中为/usr/local/cuda/lib64CUDNN_LIB_DIR为cudnn库文件地址,在docker中为/usr/lib/x86_64-linux-gnu/注意:以上路径都写绝对路径,不要写相对路径。

  • docker中/usr/local/cuda/lib64目录下的文件:

在这里插入图片描述

  • 本地/usr/local/cuda-10.1/lib64目录下的文件:

在这里插入图片描述

  • docker中/usr/lib/x86_64-linux-gnu/目录下的文件:

在这里插入图片描述

在这里插入图片描述

  • 本地没有/usr/lib/x86_64-linux-gnu/这个目录

  • 查找cuda库的路径

locate libcuda.so

在这里插入图片描述

  • 查找cudnn库的路径
locate libcudnn.so

在这里插入图片描述

在这里插入图片描述

  • build.sh内容如下:(这里是最终成功的版本中的内容)
OPENCV_DIR=/home/chenying/PaddleOCR/deploy/cpp_infer/tmp/opencv-3.4.7/opencv3
LIB_DIR=/home/chenying/PaddleOCR/deploy/cpp_infer/tmp/paddle_inference
CUDA_LIB_DIR=/usr/local/cuda/lib64
CUDNN_LIB_DIR=/usr/local/cuda/lib64BUILD_DIR=build
rm -rf ${BUILD_DIR}
mkdir ${BUILD_DIR}
cd ${BUILD_DIR}
cmake .. \-DPADDLE_LIB=${LIB_DIR} \-DWITH_MKL=ON \-DWITH_GPU=ON \-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
  • 编译命令如下:
sh tools/build.sh

在这里插入图片描述

【Bug解决】

参考cpp_infer demo build failed · Issue #4654 · PaddlePaddle/PaddleOCR (github.com)

修改了CMakeLists.txt中的这一行代码

# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -o3 ${FLAG_OPENMP} -std=c++11")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} ${FLAG_OPENMP} -std=c++11")

在这里插入图片描述

  • 编译完成之后,会在build文件夹下生成一个名为ppocr的可执行文件。

在这里插入图片描述

1.4 运行demo

运行方式:

./build/ppocr  [--param1] [--param2] [...]

其中,mode为必选参数,表示选择的功能,取值范围[‘det’, ‘rec’, ‘system’],分别表示调用检测、识别、检测识别串联(包括方向分类器)。具体命令如下:

1. 只调用检测:
./build/ppocr det \--det_model_dir=inference/ch_ppocr_mobile_v2.0_det_infer \--image_dir=../../doc/imgs/12.jpg./build/ppocr det \--det_model_dir=inference/det_db_mv3_crown_inference \--image_dir=../../train_data/crown_dataset/det_crown/test/20160517_101050_A8Y0930108BZ_Z.jpg

在这里插入图片描述

在这里插入图片描述

2. 只调用识别:
./build/ppocr rec \--rec_model_dir=inference/ch_ppocr_mobile_v2.0_rec_infer \--image_dir=../../doc/imgs_words/ch/./build/ppocr rec \--rec_model_dir=inference/rec_en_number_lite \--image_dir=../../train_data/crown_dataset/rec_crown/test/20160517_101426_ZD24930108BZ_B_crop_0.jpg \--char_list_file=../../ppocr/utils/dict/en_dict.txt

在这里插入图片描述

3. 调用串联:
# 不使用方向分类器
./build/ppocr system \--det_model_dir=inference/ch_ppocr_mobile_v2.0_det_infer \--rec_model_dir=inference/ch_ppocr_mobile_v2.0_rec_infer \--image_dir=../../doc/imgs/12.jpg
# 使用方向分类器
./build/ppocr system \--det_model_dir=inference/ch_ppocr_mobile_v2.0_det_infer \--use_angle_cls=true \--cls_model_dir=inference/ch_ppocr_mobile_v2.0_cls_infer \--rec_model_dir=inference/ch_ppocr_mobile_v2.0_rec_infer \--image_dir=../../doc/imgs/12.jpg./build/ppocr system \--det_model_dir=inference/det_db_mv3_crown_inference \--rec_model_dir=inference/rec_en_number_lite \--image_dir=../../train_data/crown_dataset/det_crown/test/20160517_101050_A8Y0930108BZ_Z.jpg \--char_list_file=../../ppocr/utils/dict/en_dict.txt

在这里插入图片描述

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部