PaddleLite部署PaddleOCR流程
1.准备交叉编译的opencv4.2
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.com/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.com/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 | 移动端 |
编译完成后,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.com/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.com/PaddlePaddle/Paddle-Lite-Demo
- 复制demo/cxx/ocr的所有文件到
Paddle-Lite-Demo/PaddleLite-armlinux-demo/ocr-demo
复制例程的CMakeList.txt和run.sh到上述目录下 - 修改CMakeList.txt
修改CmakeList下project、add_executable、target_link_libraries
注:Paddlelite预测库的路径在run.sh中定义 - 更新预测库:
把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.cc 中加
#include “paddle_use_kernels.h” // NOLINT
#include “paddle_use_ops.h” // NOLINT