使用paddle-lite在Arm开发板上部署paddleOCR

序言

最近有个需求,需要在arm板子上部署一个通用的ocr模型,正好度娘家开源的PaddleOCR效果识别得非常不错,并且提供了mobile版本,因为业务中对精度要求不是特别的高,而且自己去训练的话效果还大概率没有人家的好,所以就不从训练开始折腾了,索性就直接拿来用。PaddleOCR对于部署来说非常的友好,提供了很多方式的部署代码,因为我是要用到arm边缘板子上,所以选择了paddle-lite方式进行部署,而paddle-lite的部署代码,在PaddleOCR源码的deploy/lite文件夹中,具体文件如下:
在这里插入图片描述
因为代码人家都直接给出了,所以直接拿来交叉编译就行,本文的关键在与如何交叉编译,并将编译得到的可执行文件放到板子上运行。

paddle-lite官方文档

相关详细的教程paddleocr官方也给出来了,可以直接看PaddleOCR端侧部署,但是我感觉他们教程写的太乱了,参考了大部分他们的教程,还时用自己的方式进行编译,具体过程看正文。

一、环境搭建

1.1 运行准备
  • ubuntu电脑一台(提供交叉编译环境)
  • arm板子一块(rk3328,armv8,可执行文件运行环境)
1.2 准备交叉编译环境

我这里的交叉编译环境是使用的rk3328自带的armv8交叉编译工具链,在其完整的sdk中提供,不需要对其进行任何修改,记住这个路径即可,在编译的时候需要指定:
在这里插入图片描述
如果是其他的板子,可以看其是否sdk中有提供,如果没有提供的话,可以根据自己的系统按照paddleocr官方教程进行准备:
在这里插入图片描述

1.3 准备paddle-lite预测库

根据官方的教程,paddle-lite库文件准备有两种方式:

  1. 直接下载
    paddle-lite提供了已经编译好的库文件,只需要根据自己的系统进行下载即可,比如我这里要使用的是在armv8系统上,所以我可以直接到这里中下载paddle-lite v2.9预测库文件
    在这里插入图片描述
    为什么是下载这个呢?注意看几个对应的标签:armv8、with_extra、with_cv,在源码编译的时候会提到。

  2. 源码编译
    Paddle-Lite的编译方式如下:

git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite
# 切换到Paddle-Lite release/v2.9 稳定分支
git checkout release/v2.9
./lite/tools/build_android.sh  --arch=armv8  --with_cv=ON --with_extra=ON

在编译中,放开了–with_cv=ON --with_extra=ON 选项,并指定了–arch=armv8,所以正好和上面下载的相对应。

两种预测库的获取方式,如果嫌麻烦的话可以选第一种,不嫌麻烦就选第二种,我这里是直接选第一种,直接下载下来然后解压得到如下两个文件夹:
在这里插入图片描述
其中cxx中是paddle-lite的预测库头文件和动态库文件,这个文件夹我们可以直接拷贝到自己的项目中调用;demo中是提供了示例代码,供使用者调用参考。

二、代码整合

好了,我们现在已经有paddleOCR的部署代码,也有paddle-lite的预测库文件了,那怎么将他们整合到一起编译呢?首先新建一个文件夹,取名paddle_lite_ocr,将第一部分中的paddle-lite的部署代码拷贝进去,因为我是按照自己的方式去编译的,所以只需要拷贝这几个源码即可:
在这里插入图片描述
然后将刚才的预测库中cxx的文件拷贝到该目录下,新建一个model文件夹,用于存放模型文件,模型文件可以官方教程中下载,如果不想自己手动优化的话:
在这里插入图片描述
下载下来的模型文件放到model文件夹中。

等等,是不是忘了一件事情,opencv库呢?预测的时候还需要opencv库的支持,所以我们还需要对opencv源文件进行交叉编译,具体过程参考这个链接ubuntu16.04交叉编译opencv 移植到rk1808上,将编译得到的opencv文件也打包存放到cxx文件中供调用:
在这里插入图片描述

最后的文件目录结构如下,下面的源文件没有截全,反正就是上面拷贝的:
在这里插入图片描述
除了拷贝过来的源代码,你可能还需要clipper.h 和clipper.cpp这两个文件,因为代码里有调用,但是又找不到这两个文件,太长了我不想贴出来,太占篇幅,我告诉你们去哪里找,在chineseocr_lite中拷贝过来
在这里插入图片描述
在这里插入图片描述

接着需要新建一个CMakeLists.txt文件,文件内容如下:

cmake_minimum_required(VERSION 2.8)

project(paddle_lite_ocr)
set(TARGET paddle_lite_ocr)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

# Set ARMLINUX_ARCH_ABI to armv8 or armv7 or armv7hf
set(ARMLINUX_ARCH_ABI armv8)

# 1. path to Paddle-Lite lib
set(LITE_DIR "${CMAKE_SOURCE_DIR}/cxx")

# 2. link Paddle-Lite directory
link_directories(${LITE_DIR}/lib)
include_directories(${LITE_DIR}/include)

FIND_PACKAGE( OpenMP REQUIRED)
if(OPENMP_FOUND)
  message("OPENMP FOUND")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

# opencv
set(OpenCV_DIR ${LITE_DIR}/opencv-linux-aarch64/share/OpenCV)
find_package(OpenCV REQUIRED)

set(CMAKE_CXX_STANDARD 14)

# 3.add executable output
add_executable(${TARGET} ocr_db_crnn.cc cls_process.cc db_post_process.cc crnn_process.cc clipper.cpp)
target_link_libraries(${TARGET} -lpaddle_light_api_shared ${OpenCV_LIBS})
target_link_libraries(${TARGET} -ldl)

set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install/paddle_lite_ocr)
install(TARGETS paddle_lite_ocr DESTINATION ./)
#install(DIRECTORY model DESTINATION ./)

调用相关链接库,然后再新建一个build.sh文件,用于指定工具链编译,内容如下:

#!/bin/bash

set -e

# for rk3328 aarch64
GCC_COMPILER=/home/cai/rk3328_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu

ROOT_PWD=$( cd "$( dirname $0 )" && cd -P "$( dirname "$SOURCE" )" && pwd )

# build rockx
BUILD_DIR=${ROOT_PWD}/build

if [[ ! -d "${BUILD_DIR}" ]]; then
  mkdir -p ${BUILD_DIR}
fi

cd ${BUILD_DIR}
cmake .. \
    -DCMAKE_C_COMPILER=${GCC_COMPILER}-gcc \
    -DCMAKE_CXX_COMPILER=${GCC_COMPILER}-g++
make -j4
make install
cd -

编译的时候只需要指定GCC_COMPILER交叉编译工具链路径即可,然后直接在目录下运行./build.sh
在这里插入图片描述
编译成功后的可执行文件在install/paddle_lite_ocr文件夹中:
在这里插入图片描述
将该文件通过scp -r或者adb,push到板子上执行即可。

三、ARM板子上的环境准备

不过在push到板子上时运行需要一些依赖库的支持,因为板子上是没有opencv和paddle-lite的环境依赖的,所以需要把刚才交叉编译过的opencv的so文件拷贝到板子上的/usr/lib目录中,so文件在如下目录:
在这里插入图片描述
全部拷贝到/usr/lib,然后还有这个也一起拷贝过去:
在这里插入图片描述
当然别忘了把模型文件,字典文件,config.txt文件一起拷贝过去,最终运行的目录文件如下:
在这里插入图片描述
这时候只需要运行如下命令:

./paddle_lite_ocr ch_ppocr_mobile_v2.0_det_slim_opt.nb ch_ppocr_mobile_v2.0_rec_slim_opt.nb ch_ppocr_mobile_v2.0_cls_slim_opt.nb model/test_img/7.png ppocr_keys_v1.txt

传入五个参数,分别是:文字检测模型路径、文字识别模型路径、文字方向模型路径、测试图片路径、字典路径。找两张图片来测试一下:
在这里插入图片描述
运行结果:
在这里插入图片描述

在这里插入图片描述
运行结果:
在这里插入图片描述
推理是在cpu上进行的,rk3328只有四核A53的cpu,算力比较差,所以推理时间长了一些;还有一些阈值没有调好,识别效果可能会差了一点,如果有需要的话可以再对阈值进行调整,应该会更好。

我也用了ncnn进行部署,作为对比,paddle-lite要比ncnn效果差很多,具体的对比有时间我再写一篇ncnn部署的文章。好了,就先这样吧。

  • 12
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值