最近用到百度飛槳的 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問題參考文件