PaddleOCR 服務化部署(基於PaddleHub Serving)

铁皮鸭子發表於2024-03-08

最近用到百度飛槳的 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,安裝時間較長等待安裝完成介面。
    image
    #解除安裝當前包
    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,包含模型路徑和相關引數,這裡使用預設配置即可,如果更換模型需要對應修改配置檔案。
      image
  • 表格識別服務(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
      

    image

hubserving服務安裝

  • 服務配置完成就可以安裝服務了,後續如果服務相關配置存在變動需要重新執行以下命令安裝服務
    cd /home/PaddleOCR
    
    #安裝ocr_system服務
    hub install deploy/hubserving/ocr_system
    
    #安裝structure_table服務
    hub install deploy/hubserving/structure_table
    
    安裝完成
    image
  • 錯誤1:服務安裝時會提示protobuf版本過高,可以解除安裝當前版本安裝指定版本3.20.2即可
    pip uninstall protobuf
    pip install protobuf==3.20.2
    
    image
  • 錯誤2:服務安裝時還會提示cannot import name 'RNNCell' from 'paddle.fluid.layers'
    image
    這是因為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,對應變數引入也需要修改,修改如下
    image

hubserving服務啟動

#以後臺形式啟動ocr_system structure_table 服務
nohup hub serving start -m ocr_system structure_table -p 9997 &

#檢視啟動日誌
tail -f nohup.out
**引數說明**
|  引數 |  說明 |
| ------------ | ------------ |
|  -m | 指定啟動的服務名稱,多個用空格隔開 |
|  -p | 指定服務埠  |

啟動成功
image
介面訪問路徑

  • ocr_system: http://127.0.0.1:9997/predict/ocr_system
  • structure_table: http://127.0.0.1:9997/predict/structure_table
    介面說明
    引數 說明
    請求型別 post
    Content-Type application/json
    引數格式 {"images":["圖片 base64串"]}

image
image

吐槽

最後忍不住吐槽一下,百度的文件真的是一言難盡,要麼是程式碼已經更新文件還是幾年前的,要麼是有文件但寫的非常簡略,新手全靠自己踩坑,學習成本太高了!


相關參考文件

官方PaddleHub Serving部署文件
PP-Structure 系列模型列表
PP-OCR系列模型列表
解決RNNCell問題參考文件

相關文章