PaddleLite部署PaddleOCR流程

1.准备交叉编译的opencv4.2

具体步骤和问题解决方案见
https://blog.csdn/qiaolin19890323/article/details/107692034
https://wwwblogs/weicaiershang/archive/2004/01/13/12834497.html

2.准备PaddleLite编译环境(可以选择交叉编译或者本地编译)


3.PaddleLite源码编译获得预测库

由于PaddleLite的版本更替频繁,我这里用的是 git checkout release/v2.7
注意:2.6及以下版本与2.7的 MobileConfig 对应的模型格式有变化不同,需采用对应的opt工具转换模型,opt与lite版本不对应会出现模型加载错误等问题。

# 1. 推荐:git Paddle-Lite源码 并切换到release分支
git clone https://github/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite && git checkout release/v2.7

交叉编译:在…/Paddle-Lite/cmake/cross_compiling 下修改armlinux.cmake
把编译器改为交叉工具链提供的gcc和g++

#使用自带脚本编译获得预测库 --arch:(armv8|armv7|armv7hf)
./lite/tools/build_linux.sh  --arch=armv8  --with_cv=ON --with_extra=ON

提示: 编译过程中,如出现源码编译耗时过长,通常是第三方库下载过慢或失败导致。请在git clone完Paddle-Lite仓库代码后,手动删除本地仓库根目录下的third-party目录。编译脚本会自动下载存储于国内 CDN 的第三方依赖的压缩包,节省从git repo同步第三方库代码的时间。

4.模型优化(转化为.nb模型文件)

需要使用PaddleLite的opt工具进行模型转化。也是编译PaddleLite源码获得。

# 如果准备环境时已经clone了Paddle-Lite,则不用重新clone Paddle-Lite
git clone https://github/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite
git checkout release/v2.7
# 启动编译
./lite/tools/build.sh build_optimize_tool

注意:opt工具不能本地编译,armlinux可能出现编译器不支持的错误,另外在编译opt时,可能需要6G以上内存,否则我出现过在编译中卡死的情况。
如果直接用上述命令下图报错,可以尝试在build.opt目录下直接make opt

PP-OCR 1.1系列模型列表(9月17日更新)

模型简介模型名称推荐场景检测模型方向分类器识别模型
中英文超轻量OCR模型(8.1M)ch_ppocr_mobile_v1.1_xx移动端&服务器端推理模型/预训练模型推理模型/预训练模型推理模型/预训练模型
中英文超轻量压缩OCR模型(3.5M)ch_ppocr_mobile_slim_v1.1_xx移动端推理模型/slim模型推理模型/slim模型推理模型/slim模型

编译完成后,opt文件位于build.opt/lite/api/下,可通过如下方式查看opt的运行选项和使用方式;

cd build.opt/lite/api/
./opt

#PaddleOCR模型转换样例:
./opt --model_file=./ch_ppocr_mobile_v1.1_det_infer/model  --param_file=./ch_ppocr_mobile_v1.1_det_infer/params  --optimize_out=./ch_ppocr_mobile_v1.1_det_opt --valid_targets=arm

转换成功后,会出现.nb文件,即转换成功。

5.准备优化后的模型、预测库文件、测试图像和使用的字典文件

git clone https://github/PaddlePaddle/PaddleOCR.git
cd PaddleOCR/deploy/lite/
# 运行prepare.sh,准备预测库文件、测试图像和使用的字典文件,并放置	在预测库中的demo/cxx/ocr文件夹下
sh prepare.sh /{lite prediction library path}/inference_lite_lib.armlinux.armv8

# 进入OCR demo的工作目录
cd /{lite prediction library path}/inference_lite_lib.armlinux.armv8/
cd demo/cxx/ocr/
# 将C++预测静态库.a(动态库.so)文件复制到debug文件夹中
cp ../../../cxx/lib/libpaddle_light_api_shared.so ./debug/

准备lite opt工具优化后的模型文件,比如使用ch_ppocr_mobile_v1.1_det_opt.nb,ch_ppocr_mobile_v1.1_rec_opt.nb, ch_ppocr_mobile_cls_opt.nb,模型文件放置在demo/cxx/ocr/debug/文件夹下。

接着在demo/cxx/ocr目录下找到Makefile文件,这个Makefile是不能用的,vim打开Makefile,找到下载clipper.cpp和clipper.hpp的命令,把这两个文件下载到demo/cxx/ocr目录下。

6.根据Paddle-Lite-Demo写一个CMakeList

百度官方的paddle-lite-demo
https://github/PaddlePaddle/Paddle-Lite-Demo

  1. 复制demo/cxx/ocr的所有文件到
    Paddle-Lite-Demo/PaddleLite-armlinux-demo/ocr-demo
    复制例程的CMakeList.txt和run.sh到上述目录下

  2. 修改CMakeList.txt
    修改CmakeList下project、add_executable、target_link_libraries
    注:Paddlelite预测库的路径在run.sh中定义

  3. 更新预测库:
    Paddle-Lite-Demo/PaddleLite-armlinux-demo/Paddle-Lite下的include目录更换为第5步中
    /{lite prediction library path}/inference_lite_lib.armlinux.armv8/cxx 目录下的include

    Paddle-Lite-Demo/PaddleLite-armlinux-demo/Paddle-Lite下armv7hf和armv8中的libpaddle_light_api_shared.so更换为第5步中 /{lite prediction library path}/inference_lite_lib.armlinux.armv8/cxx/lib下的libpaddle_light_api_shared.so

    Paddle-Lite-Demo/PaddleLite-armlinux-demo/ocr-demo/debug中的
    libpaddle_light_api_shared.so也作上述替换

7.执行编译,得到可执行文件ocr_db_crnn

# ocr_db_crnn可执行文件的使用方式为:
# ./ocr_db_crnn  检测模型文件 方向分类器模型文件  识别模型文件  测试图像路径  字典文件路径
# 例如:在debug文件夹下执行
../build/ocr_db_crnn ch_ppocr_mobile_v1.1_det_opt.nb  ch_ppocr_mobile_v1.1_rec_opt.nb  ch_ppocr_mobile_cls_opt.nb  
./11.jpg  ppocr_keys_v1.txt

8.其他:

debug目录下的config.txt 包含了检测器、分类器的超参数

执行遇到Check failed: op: no Op found for feed
解决:静态编译需要在ocr_db_crnn 中加
#include “paddle_use_kernels.h” // NOLINT
#include “paddle_use_ops.h” // NOLINT

更多推荐

PaddleLite部署PaddleOCR流程