PaddleOCR服務器端部署C++ cpu或者gpu進行預測

簡介

paddleocr的環境安裝需要opencv和paddle C++環境。

因爲服務器中的cmake版本低於3.15,可以通過cmake -version知道。
安裝
1. cmake3.19.8安裝

1)下載地址

https://github.com/Kitware/CMake/releases/download/v3.19.8/cmake-3.19.8-Linux-x86_64.tar.gz

2)安裝

    tar -xvf cmake-3.19.8-Linux-x86_64.tar.gz 
    mv cmake-3.19.8-Linux-x86_64 cmake-3.19.8

    vim ~/.bashrc
    export PATH=/home/cxzx/cmake-3.19.8/bin:$PATH
    source ~/.bashrc

2.opencv-3.4.7

1)下載和解壓

    wget https://github.com/opencv/opencv/archive/3.4.7.tar.gz
    tar xvf opencv-3.4.7.tar.gz

    cd opencv-3.4.7/
    mkdir build && cd build

    cmake .. \
        -DCMAKE_INSTALL_PREFIX=../opencv3 \
        -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

    make -j
    make install

make install完成之後,會在opencv install的目錄下生成opencv頭文件和庫文件,用於後面的OCR代碼編譯。最終在安裝路徑下的文件結構如下所示:

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

3.編譯paddle C++預測庫

1)下載源碼

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

2) 編譯

    cd Paddle
    mkdir build && cd build
     
    cmake -DWITH_CONTRIB=OFF \
        -DWITH_MKL=OFF \
        -DWITH_MKLDNN=OFF  \
        -DWITH_TESTING=OFF \
        -DCMAKE_BUILD_TYPE=Release \
        -DWITH_INFERENCE_API_TEST=OFF \
        -DON_INFER=ON \
        -DWITH_PYTHON=OFF \
        -DWITH_GPU=OFF \
        -DWITH_TENSORRT=OFF \
        -DWITH_NCCL=OFF ..

ulimit -n 63356 # 解決不同同時打開太多的文件,一般會報出Too many open files.

    make -j
    make inference_lib_dist

在make -j的時候出現

    fatal: unable to access 'https://github.com/xianyi/OpenBLAS.git/': Failed to connect to github.com port 443: Connection timed out
    fatal: unable to access 'https://github.com/dmlc/dlpack.git/': Failed to connect to github.com port 443: Connection timed out
    fatal: unable to access 'https://github.com/herumi/xbyak.git/': Failed to connect to github.com port 443: Connection timed out
    fatal: unable to access 'https://github.com/madler/zlib.git/': Failed to connect to github.com port 443: Connection timed out
    Cloning into 'extern_openblas'...
    Cloning into 'extern_dlpack'...
    Cloning into 'extern_xbyak'...
    Cloning into 'extern_zlib'...
    fatal: unable to access 'https://github.com/gflags/gflags.git/': Empty reply from server
    Cloning into 'extern_gflags'...
    fatal: unable to access 'https://github.com/baidu-research/warp-ctc.git/': Failed to connect to github.com port 443: Connection timed out
    Cloning into 'extern_warpctc'...
    fatal: unable to access 'https://github.com/herumi/xbyak.git/': Failed to connect to github.com port 443: Connection timed out
    fatal: unable to access 'https://github.com/dmlc/dlpack.git/': Failed to connect to github.com port 443: Connection timed out
    fatal: unable to access 'https://github.com/xianyi/OpenBLAS.git/': Failed to connect to github.com port 443: Connection timed out
    fatal: unable to access 'https://github.com/madler/zlib.git/': Failed to connect to github.com port 443: Connection timed out

這個主要原因是在編譯paddle的時候,需要一些第三方庫,但是這些第三方庫是通過git下載源碼,編譯安裝的(網絡原因無法下載源碼)。所以會報這些錯誤。

可以不用管這些,再次make -j,直到make -j成功。

安裝完成之後可以看到

    Paddle/build/paddle_inference_install_dir$ ls
    CMakeCache.txt  paddle  third_party  version.txt

其中paddle文件

    ├── include
    │   ├── crypto
    │   │   └── cipher.h
    │   ├── experimental
    │   │   ├── complex128.h
    │   │   ├── complex64.h
    │   │   ├── ext_all.h
    │   │   ├── ext_dispatch.h
    │   │   ├── ext_dll_decl.h
    │   │   ├── ext_dtype.h
    │   │   ├── ext_exception.h
    │   │   ├── ext_op_meta_info.h
    │   │   ├── ext_place.h
    │   │   ├── ext_tensor.h
    │   │   └── float16.h
    │   ├── internal
    │   │   └── framework.pb.h
    │   ├── paddle_analysis_config.h
    │   ├── paddle_api.h
    │   ├── paddle_infer_declare.h
    │   ├── paddle_inference_api.h
    │   ├── paddle_mkldnn_quantizer_config.h
    │   ├── paddle_pass_builder.h
    │   └── paddle_tensor.h
    └── lib
        ├── libpaddle_inference.a
        └── libpaddle_inference.so

可以發現lib庫裏面的是libpaddle_inference.so,這個是paddle2.0+版本編譯出來的so包,paddle1.1給的libpaddle_fluid.so。
 
4.paddleocr C++代碼

因爲編譯的是paddle版本是2.0以上的,所以下載的paddleocr也要是2.0以上的。如果不同會報錯。

1.下載paddleocr源碼

    git clone https://github.com/PaddlePaddle/PaddleOCR.git
    cd PaddleOCR/deploy/cpp_infer/

2.下載模型ch_ppocr_server_v2.0_xx

https://github.com/PaddlePaddle/PaddleOCR

將檢測分類識別模型放在PaddleOCR/deploy/cpp_infer/的inference文件夾(新建)裏面,同時在./tools/config.txt修改模型路徑

    det_model_dir  ./inference/ch_ppocr_server_v2.0_det_infer/
     
    # cls config
    use_angle_cls 0
    cls_model_dir  ./inference/ch_ppocr_mobile_v2.0_cls_infer/
    cls_thresh  0.9
     
    # rec config
    rec_model_dir  ./inference/ch_ppocr_server_v2.0_rec_infer/
    char_list_file ../../ppocr/utils/ppocr_keys_v1.txt

3.修改tools/build.sh

    OPENCV_DIR=~/opencv347/opencv3/                                         #修改
    LIB_DIR=~/paddleocr/Paddle/build/paddle_inference_install_dir/          #修改
    #CUDA_LIB_DIR=your_cuda_lib_dir
    #CUDNN_LIB_DIR=your_cudnn_lib_dir
     
    BUILD_DIR=build
    rm -rf ${BUILD_DIR}
    mkdir ${BUILD_DIR}
    cd ${BUILD_DIR}
    cmake .. \
        -DPADDLE_LIB=${LIB_DIR} \
        -DWITH_MKL=OFF \     #修改
        -DWITH_GPU=OFF \
        -DWITH_STATIC_LIB=OFF \
        -DUSE_TENSORRT=OFF \
        -DOPENCV_DIR=${OPENCV_DIR} \
        # -DCUDNN_LIB=${CUDNN_LIB_DIR} \
        # -DCUDA_LIB=${CUDA_LIB_DIR} \
     
    make -j

4.執行

    ./tools/build.sh
    ./tools/run.sh 

結果爲

    The detection visualized image saved in ./ocr_vis.png
    The predicted text is :
    上海斯格威鉑爾大酒店    score: 0.991523
    打浦路15號      score: 0.996377
    綠洲仕格維花園公寓      score: 0.996051
    打浦路25 29 35號        score: 0.943492
    Cost  2.68492s

期間遇到過這個問題,主要原因你下載的paddleocr代碼是根據paddle1.1寫的,它裏面的CMakeLists.txt文件還是libpaddle_fluid.so(paddle1.1的預測庫),我編譯的是libpaddle_inference.so(paddle2.0+的),解決方法去官網下載最新的paddleocr代碼。

make[2]: *** No rule to make target '/home/zhangyt/paddleocr/Paddle/build/paddle_inference_install_dir/paddle/lib/libpaddle_fluid.so', needed by 'ocr_system'.  Stop.

5.paddleocr C++ gpu版本
5.1paddle重新編譯

paddle編譯需要cuda10.1+

    cd Paddle
    cd build
    rm -rf *
     
    cmake -DWITH_CONTRIB=OFF \
        -DWITH_MKL=OFF \
        -DWITH_MKLDNN=OFF  \
        -DWITH_TESTING=OFF \
        -DCMAKE_BUILD_TYPE=Release \
        -DWITH_INFERENCE_API_TEST=OFF \
        -DON_INFER=ON \
        -DWITH_PYTHON=OFF \
        -DWITH_GPU=ON \
        -DWITH_TENSORRT=OFF \
        -DWITH_NCCL=OFF ..

    ulimit -n 63356 
    make -j
    make inference_lib_dist -j

5.2修改paddleocr

修改tools/build.sh

    OPENCV_DIR=~/opencv347/opencv3/                                         #修改
    LIB_DIR=~/paddleocr/Paddle/build/paddle_inference_install_dir/          #修改
    CUDA_LIB_DIR=/usr/local/cuda-10.1/lib64                                 #修改
    CUDNN_LIB_DIR=/usr/local/cuda-10.1/lib64                                #修改
     
    BUILD_DIR=build
    rm -rf ${BUILD_DIR}
    mkdir ${BUILD_DIR}
    cd ${BUILD_DIR}
    cmake .. \
        -DPADDLE_LIB=${LIB_DIR} \
        -DWITH_MKL=OFF \
        -DWITH_GPU=OFF \
        -DWITH_STATIC_LIB=OFF \
        -DUSE_TENSORRT=OFF \
        -DOPENCV_DIR=${OPENCV_DIR} \
        -DCUDNN_LIB=${CUDNN_LIB_DIR} \
        -DCUDA_LIB=${CUDA_LIB_DIR} \
     
     
    make -j

修改build/config.txt

    use_gpu 1
    gpu_id  0

執行

    ./tools/build.sh
    ./tools/run.sh 

發現推理時間變長,應爲使用gpu加載時間變長了,推理的話也就50多ms,

    The predicted text is :
    我一直在承受我這個年紀  score: 0.998935
    不該有的帥氣和機智      score: 0.977983
    我好累  score: 0.982173
    二      score: 0.637757
    Cost  0.052505s

如果服務器是多gpu,可能需要

export CUDA_VISIBLE_DEVICES=0

參考

https://blog.csdn.net/u013171226/article/details/115398058

https://www.paddlepaddle.org.cn/documentation/docs/en/develop/guides/05_inference_deployment/inference/build_and_install_lib_en.html


————————————————
版權聲明:本文爲CSDN博主「pursuit_zhangyu」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/pursuit_zhangyu/article/details/115729095

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章