一、目的

github上的demo版本是PaddleLite-2.6.1版本的,由于一些原因我的移动端项目必须使用PaddleLite-2.8版本否则会出现未知的错误,所以我的项目若想使用PaddleOCR功能的话必须基于demo版本进行升级。

二、步骤

2.1 下载demo并成功运行

demo地址:demo

如果没有版本需求直接下载该demo运行就能体验在移动端进行OCR识别的功能啦。

在assets/models/ocr_v1_for_cpu目录下,可以看到demo中用到了三个模型:

名称作用
ch_det_mv3_db_opt.nb文本框检测
ch_rec_mv3_crnn_opt.nb文本检测
cls_opt_arm.nb方向分类

如果目录是assets/models/ocr_v1_for_cpu/ocr_v1_for_cpu 这样的,要把多出来的这个ocr_v1_for_cpu文件夹删了,模型转移到上一级中才能成功运行。

而将版本升级到v2.8主要有两点:

  1. 将PaddleLite升级
  2. 将模型用v2.8版本的opt工具转换

(还不清楚Lite预测流程的小伙伴们可以先看官方文档:文档

2.2 将PaddleLite版本升级

更改build.gradle中的PaddleLite版本,改为2.8

[
    'src' : 'https://paddlelite-demo.bj.bcebos.com/libs/android/paddle_lite_libs_v2_8_0.tar.gz',
    'dest': 'PaddleLite'
]

注意:更改版本后,重新运行demo项目时先把PaddleLite文件夹删除了,如果不删好像还是2.6.1版本不会下新的

2.3 准备模型

首先要安装好最新版本的Paddle,Paddlehub。如何安装参考官方文档:文档

然后建立一个Python工程,运行以下代码:

import paddlehub as hub
import cv2

# 加载移动端预训练模型
ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")
# 保存模型
ocr.save_inference_model(dirname="chinese_ocr",model_filename="model.pdmodel",params_filename="params.pdiparams")

可以看到在chinese_ocr文件夹下已经保存好了三个模型,但是这样保存的模型实际上是有问题的,这源于PaddleHub的一个bug
在这里插入图片描述
bug地址

大家可以自己进去看看,就是检测函数的return位置不对

修复bug:我发现加载的预训练模型并没有修复这个bug,我们需要进行手动更改。进入PaddleHub下载模型的目录:C:\Users\你的用户名\.paddlehub\modules\chinese_ocr_db_crnn_mobile,打开module.py文件,找到_recognize_text(self, img_list)函数,将return退回一个Tab。

    def _recognize_text(self, img_list):
        img_num = len(img_list)
        # Calculate the aspect ratio of all text bars
        width_list = []
        for img in img_list:
            width_list.append(img.shape[1] / float(img.shape[0]))
        # Sorting can speed up the recognition process
        indices = np.argsort(np.array(width_list))

        rec_res = [['', 0.0]] * img_num
        batch_num = 30
        for beg_img_no in range(0, img_num, batch_num):
        	.
            .
            .
            for rno in range(len(rec_idx_lod) - 1):
				.
				.
				.
        return rec_res

调整完 return 位置后,记得重新保存模型:

import paddlehub as hub
import cv2

# 加载移动端预训练模型
ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")
# 保存模型
ocr.save_inference_model(dirname="chinese_ocr",model_filename="model.pdmodel",params_filename="params.pdiparams")

2.4 下载opt工具并进行转换

下载地址:opt工具v2.8

我用的是Linux下的opt工具,所以还要准备一个Linux系统。

将之前保存的模型和工具传到Linux服务器上。模型传到paddle_model文件夹中。

用以下命令进行opt转换

./opt_linux --model_file=./paddle_model/cls/model.pdmodel\
      --param_file=./paddle_model/cls/params.pdiparams\
      --valid_targets=arm \
      --optimize_out_type=naive_buffer \
      --optimize_out=cls_model2

./opt_linux --model_file=./paddle_model/rec/model.pdmodel\
      --param_file=./paddle_model/rec/params.pdiparams\
      --valid_targets=arm \
      --optimize_out_type=naive_buffer \
      --optimize_out=rec_model2

./opt_linux --model_file=./paddle_model/det/model.pdmodel\
      --param_file=./paddle_model/det/params.pdiparams\
      --valid_targets=arm \
      --optimize_out_type=naive_buffer \
      --optimize_out=det_model2

最后得到

cls_model rec_model det_model 这三个模型

2.5 替换模型

然后将转换后得到的模型与demo中的模型进行替换,注意模型文件名与demo中的文件名保持一致。

三、总结

在没发现bug时,我一直以为是编译库不是最新的原因,因为运行升级后的demo是一直警告PaddleLite和opt版本不一致。我还试过根据文档上的步骤编译最新v2.8库,docker或linux方法都试过,因为服务器性能原因编译一次起码两三小时,还经常编译一半就出错,哭。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐