出于某种原因,我需要在某平台上打包编译paddleocr的组件,中间踩了很多坑。
简单在这里总结一下吧。有其他问题可以留言。
文章末尾我给出已经编译好的文件,有需要自取。
环境不用多说,CMake和Git必备。GCC建议自备10+,官方推荐8和5,看个人,不使用官方推荐的版本,还是建议全自己编译一下。
编译openCV
首先编译openCV,openCV似乎3和4都可以(不作确定与保证),在官方的readme里面写得很清楚,openCV毕竟是大项目,基本上不会出现问题。
我用的是官方推荐的3.4.7,似乎4.5.5也能在paddle中使用。
编译sh如下。
# 建议使用绝对路径
root_path="/xxxxxxx/deployCpp/opencv-3.4.7"
install_path=${root_path}/opencv3
build_dir=${root_path}/build
rm -rf ${build_dir}
mkdir ${build_dir}
cd ${build_dir}
cmake .. \
-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
make -jxx
make install
接下来没什么好说的,等着滚动条滚动就行,openCV毕竟是国际大项目,没啥问题。
编译完成后得到build文件,Linux系统接下来的OPENCV_DIR变量指向这个文件夹就行了,Windows参考VS版本,一般为指向build文件夹下的VC15文件夹。
编译paddlepaddle
clone paddlepaddle仓库,建议直接最新版本梭哈。
先说说Linux下的编译,在deploy/cpp_infer/tools内有编译脚本,我没用CUDA和CUDNN,纯CPU MKL部署。我是在英特尔CPU下部署的,据说openBLAS对AMD友好,就这样。
官方的预编译仓库地址:https://paddleinference.paddlepaddle.org.cn/user_guides/download_lib.html#linux
官方的手册:https://paddleinference.paddlepaddle.org.cn/user_guides/source_compile.html
吐槽一下,现在越来越喜欢docker了,编译怎么也用docker。
sudo apt-get install gcc g++ make cmake git vim unrar python3 python3-dev python3-pip swig wget patchelf libopencv-dev
pip3 install numpy protobuf wheel setuptools
rm -rf build
mkdir build
cd build
# 注意需要修改ulimit -n nofile属性
# 在高版本ubuntu不起作用,需要手动修改/etc/systemd/system.conf
# /etc/systemd/user.conf,添加 DefaultLimitNOFILE=65535
# 在 /etc/security/limits.conf 添加以下两行
# hard nofile 65535
# soft nofile 65535
ulimit -n 4096
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
# 可在此手动修改,针对高版本GCC
# 在thr_party/protobuf 中的报错,将函数修改为const类型
# paddle自己的报错,取消迭代器为const的限制
# 再手动make clean
# make -jx 即可
make -j48
make inference_lib_dist
等等,先别着急跑,有坑,paddle亲自给你挖的。
paddle里面所有的编译优化参数-O (IO戏称氧气)全部写成了小写-o3,-o其实是重命名的代码,于是乎会导致Cmake找不到。
nano CMakeList.txt
把所有的-o3都改成-O3,就没问题了。
paddle本体编译一般不会出现什么问题,Windows有官方的预编译包,直接下就好了,别折腾了。如果要折腾也一样,Windows有好用的CMake GUI,参数一填,也一样。Windows建议使用VS编译。
编译paddleOCR cpp_infer
OK,现在我们有paddle本体和openCV了,开始编译paddleOCR里面的cpp_infer吧。
主要讲讲Linux,Windows有非常详细的官方教程,都别忘了改CMakeList.txt里面的-o3。
Windows 参考链接:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/deploy/cpp_infer/docs/windows_vs2019_build.md
Windows 没啥坑可以踩,别忘了拷贝DLL哦。
Linux编译脚本如下
OPENCV_DIR="/xxxx/deployCpp/opencv-3.4.7/opencv3"
LIB_DIR="/xxxx/deployCpp/paddlepaddle/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=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 -jxx
到此,编译结束了。可以看到build文件夹内生成的ppocr文件。Windows拷贝DLL就可以运行,Linux似乎包含了所有内容(仅限于完全自己编译),使用官方预编译似乎不行,需要手动拷贝一些.so文件。
文件下载列表:
(懒得加,有时间先)
洗出结果的正则:(适合摆烂用,到时候一起补全)