如何将PaddleOCR中的移动端Demo升级到PaddleLite-v2.8版本
一、目的github上的demo版本是PaddleLite-2.6.1版本的,由于一些原因我的移动端项目必须使用PaddleLite-2.8版本否则会出现未知的错误,所以我的项目若想使用PaddleOCR功能的话必须基于demo版本进行升级。二、步骤2.1 下载demo并成功运行demo地址:demo如果没有版本需求直接下载该demo运行就能体验在移动端进行OCR识别的功能啦。在assets/mo
一、目的
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主要有两点:
- 将PaddleLite升级
- 将模型用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方法都试过,因为服务器性能原因编译一次起码两三小时,还经常编译一半就出错,哭。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)