最近用到百度飞桨的 PaddleOCR,研究了一下PaddleOCR的服务化部署,简单记录一些部署过程和碰到的问题。
基础环境
- paddlepaddle 2.5.2
- python 3.7
- paddlehub 2.1.0
- PaddleOCR 2.6
- pip 20
#查看 python 版本
python --version
#查看pip版本
pip --version
#查看paddlepaddle版本
pip show paddlepaddle
部署过程中也尝试多次,不同版本遇到的问题不尽相同,这里选取其中一组进行部署说明
使用 docker部署paddlepaddle2.5.2
容器
PaddleOCR
依赖飞桨环境运行,所以需要先安装paddlepaddle
环境,默认docker
已经安装,执行脚本获取paddlepaddle2.5.2
镜像并自动创建名称为ppocr
的容器,网络顺畅的话很快就可以下载完成,下载完成后执行attach
命令就可以进入容器继续操作。官方paddlepaddle2.5.2容器内python版本为3.7,pip版本为20,默认即可。
# 下载并创建容器 docker run -p 9997:9997 --name ppocr -itd -v $PWD:/paddle registry.bAIdubce.com/paddlepaddle/paddle:2.5.2 /bin/bash # 进入容器 docker attach ppocr
参数 说明 -p 指定 docker 映射的端口 -name 指定容器的名称 docker
部分常用管理命令#查看容器情况 docker ps -a #停止容器 docker stop ppocr #启动容器 docker start ppocr #查看所有镜像 docker images
以下操作都在容器内进行
安装paddlehub
- 进入容器后执行脚本安装paddlehub,版本为2.1.0
pip3 install paddlehub==2.1.0 --upgrade -i https://mirror.baidu.com/pypi/simple
- 安装过程中会提示
typing-extensions
版本过低,要求版本要大于4.6.1,卸载当前版本安装指定版本,安装完成后再次执行上述命令安装paddlehub,安装时间较长等待安装完成接口。
#卸载当前包 pip uninstall typing-extensions #安装4.6.1版本 pip3 install typing-extensions==4.6.1
安装PaddleOCR 2.6.0
PaddleOCR 使用 2.6.0版本
- 首先从gitee获取PaddleOCR代码,PaddleOCR在gitee仓库的最新版本为2.6.0,在 github仓库的最新版本为2.7.1,2.7.1依赖 python 版本需要>=3.8,此处需要注意.
cd /home git clone https://gitee.com/paddlepaddle/PaddleOCR.git
- 代码下载完成后进入PaddleOCR文件夹内执行脚本安装依赖包
cd /home/PaddleOCR #安装依赖包 pip3 install -r requirements.txt -i https://mirror.baidu.com/pypi/simple
hubserving
服务配置
hubserving服务部署目录下包括文本检测、文本方向分类,文本识别、文本检测+文本方向分类+文本识别3阶段串联,版面分析、表格识别和PP-Structure七种服务包,可以按需安装使用,使用前需要下载对应模型并进行配置,以下已文本检测+文本方向分类+文本识别3阶段串联服务(ocr_system)和表格识别(structure_table)为例进行说明。
-
文本检测+文本方向分类+文本识别3阶段串联服务(ocr_system)配置
- 相关模型下载
cd /home/PaddleOCR mkdir inference && cd inference # 下载并解压 OCR 文本检测配置 wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar && tar -xf ch_PP-OCRv3_det_infer.tar # 下载并解压 OCR 文本识别模型 wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar && tar -xf ch_PP-OCRv3_rec_infer.tar # 下载并解压 OCR 文本方向分类模型 wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar && tar xf ch_ppocr_mobile_v2.0_cls_infer.tar
- 服务配置
文本检测+文本方向分类+文本识别3阶段串联服务(ocr_system)配置文件是deploy/hubserving/ocr_system/params.py
,包含模型路径和相关参数,这里使用默认配置即可,如果更换模型需要对应修改配置文件。
- 相关模型下载
-
表格识别服务(structure_table)配置
- 下载中文表格识别模板
cd /home/PaddleOCR/inference #下载基于SLANet的中文表格识别模型 wget https://paddleocr.bj.bcebos.com/ppstructure/models/slanet/ch_ppstructure_mobile_v2.0_SLANet_infer.tar && tar xf ch_ppstructure_mobile_v2.0_SLANet_infer.tar
- 服务配置
structure_table
默认配置为英文表格识别模型和英文字典,需要调整为中文识别模板和对应的中文字典文件,修改完成保存即可。#打开配置文件 vim /home/PaddleOCR/deploy/hubserving/structure_table/param.py #调整模型文件路径为./inference/ch_ppstructure_mobile_v2.0_SLANet_infer/ #调整字典文件路径为./ppocr/utils/dict/table_structure_dict_ch.txt
- 下载中文表格识别模板
hubserving
服务安装
- 服务配置完成就可以安装服务了,后续如果服务相关配置存在变动需要重新执行以下命令安装服务
cd /home/PaddleOCR #安装ocr_system服务 hub install deploy/hubserving/ocr_system #安装structure_table服务 hub install deploy/hubserving/structure_table
- 错误1:服务安装时会提示
protobuf
版本过高,可以卸载当前版本安装指定版本3.20.2即可pip uninstall protobuf pip install protobuf==3.20.2
- 错误2:服务安装时还会提示
cannot import name 'RNNCell' from 'paddle.fluid.layers'
这是因为paddlepaddle2.5.0后没有fluid了,需要修改paddlehub
安装包中的/usr/local/lib/python3.7/dist-packages/paddlehub/compat/task/text_generation_task.py
文件,将文件中paddle.fluid.layers import RNNCell ...
换成from paddle.nn import RNNCellBase
,对应变量引入也需要修改,修改如下
hubserving
服务启动
#以后台形式启动ocr_system structure_table 服务
nohup hub serving start -m ocr_system structure_table -p 9997 &
#查看启动日志
tail -f nohup.out
**参数说明**
| 参数 | 说明 |
| ------------ | ------------ |
| -m | 指定启动的服务名称,多个用空格隔开 |
| -p | 指定服务端口 |
启动成功
接口访问路径
ocr_system:
http://127.0.0.1:9997/predict/ocr_systemstructure_table:
http://127.0.0.1:9997/predict/structure_table
接口说明参数 说明 请求类型 post Content-Type application/json 参数格式 {"images":["图片 base64串"]}
吐槽
最后忍不住吐槽一下,百度的文档真的是一言难尽,要么是代码已经更新文档还是几年前的,要么是有文档但写的非常简略,新手全靠自己踩坑,学习成本太高了!
相关参考文档
官方PaddleHub Serving部署文档
PP-Structure 系列模型列表
PP-OCR系列模型列表
解决RNNCell问题参考文档