手把手0基礎Centos下安裝與部署paddleOcr 教程

jiansword發表於2021-07-21

!!!以下內容為作者原創,首發於個人部落格園&掘金平臺。未經原作者同意與許可,任何人、任何組織不得以任何形式轉載。原創不易,如果對您的問題提供了些許幫助,希望得到您的點贊支援。

0.paddleOcr簡介

paddleOcr 是基於paddlepaddle飛槳這一開源的深度學習平臺下訓練出來的一個輪子,它的作用正如名稱:提取並識別圖片中的文字。
目前paddleOcr 官方已經發布了80+語言的識別模型,針對日常的使用來說是足夠了。
下面就以官方的 中英文通用OCR模型 為例,來一步步教大家如何在centos7的系統中下載、安裝、測試、部署服務等全部過程

下面的教程全程非常詳細,適合0基礎小夥伴們來學習操作。

1.寫在教程前

為什麼會想著寫這樣一篇教程?

   其實paddleOcr的github裡已經有很詳細的教程,有能力和基礎的小夥伴完全可以自己看著官方說明搞定所有的問題。但是對沒那麼熟悉的小夥伴來說就教程顯得不那麼友好,自己在網上東拼西找一些相關資料,最後還是可能會卡住在1、2個小問題上,導致無法部署成功;

在教程的最後我會將本次參考到的所有資料與連結放在下面。

下面直接進入本次教程

2.centos下準備好docker工具

正所謂工欲善其事,並先利其器;我們直接用官方準備好的docker環境來安裝,會避免掉大部分的問題,但是也會碰到一些小坑,下面會一一說明

centos下找到在docker安裝包並安裝

  • yum list docker-ce --showduplicates | sort -r

可以自己選擇一個穩定的版本安裝,或者不指定版本,直接安裝最新版本docker-ce.x$6_64.png

  • yum install docker-ce 接下來就是yum來安裝docker完成

Pasted Graphic 1.png

啟動docker服務

  • service docker start 啟動docker服務

Lrootelocalhost ~

  • docker --version 檢視docker版本,以檢查docker是否正常啟動

[root@localhost ~]# docker --version.png

  • systemctl enable docker 配置一下docker服務開機自啟動

Pasted Graphic 4.png

3.下載paddleOcr官方docker映象

官方github倉庫地址 官方gitee倉庫地址
官方建議是去github地址上,但github的訪問速度懂的都懂。
下面的例子以github地址為例,無法訪問github的小夥伴去gitee中找到替換的地址

建立paddleOcr目錄

該目錄是用於存放paddleOcr映象,官方建議是在/home/Projects下
mkdir /home/Projects 建立專案目錄
cd /home/Projects 進入專案目錄

下載官方映象

docker run --name ppocr  -v $PWD:/paddle --network=host -it paddlepaddle/paddle:latest-dev-cuda10.1-cudnn7-gcc82 /bin/bash
說明一下:
官方的docker命令沒有對映執行埠,這裡要說明一下:官方啟動docker的方式為 network=host,即容器內用的埠就是宿主機的埠
複製程式碼

接下來docker就會自動開始下載映象了,然後就是漫長的下載等待,大概下載時間會有10分鐘左右

Pasted Graphic 7.png

下載完畢後,會自動進入到映象內部的shell裡,進入下面這樣的介面中。0fgest Sha25693072d145036423016038e088490G0340b1299300143d55026€e469487254cdo.png

不用理睬,直接exit退出來。

Localhost home exit.png

docker ps -a 檢視一下docker的執行程式,發現這個這個剛剛下載來的ppocr已經被關閉掉了。Pasted Graphic 11.png

docker start ppocr 重啟這個ppocr容器Pasted Graphic 12.png

4.安裝paddlepaddle2.0

之前在0.簡介裡面也說了,paddleOcr是基於paddlepaddle這個平臺下的,所以它的執行理所當然離不開paddlepaddle這個平臺

【很重要】檢查docker內的python3以及pip3版本

進入docker容器中,一定要檢查一下python3 的版本和 pip3用的版本,要確保版本在3.7及以上,這是官方要求的版本。 但是很坑的是,官方docker你映象中竟然是3.5.1 的python3。這裡必須手動去升級安裝新版本

docker exec -it ppocr /bin/bash 進入docker容器內部[rootelocalhost Projects]# docker exec -it ppocr binbash.png

python3 --version 檢查python3 版本,如圖版本是3.5.1,必須要進行升級localhost home python3 --version.png

pip3 --version 檢查pip3版本,如果pip3是3.5.1下的,也要跟著一起升級Pasted Graphic 15.png

升級安裝python3

容器內已經有python3 的原始碼安裝檔案 在/home 目錄下,有3.7.0 和 3.8.0 我們直接選擇3.8.0 編譯安裝。E POM..8822084.800 rwon .S.10w R L& 1ee .2.2.0w.png

cd /Python-3.8.0 進入到Python-3.8.0目錄下Pasted Graphic 17.png

./configure 編譯器會執行一些安裝前檢查,稍等片刻就會檢查完成。ocalnost.png

make && make install 原始碼安裝,稍等幾分鐘,等待安裝完成。(cd usrlocooini in -s pythons.i pythons.png

安裝完成,重新檢查一下python3,pip3版本,確保版本已經升級到3.8.0Localhost homePython-3.8.0 python3 --version.png

pipJ--verston.png

【很重要】更新使用者環境變數引數

安裝一個vim,方便容器內進行文字編輯

apt-get update
apt-get install vim
複製程式碼

locolrost apt-qet update.png

ne mone or2 T vir atkpr2 1vie stasp MIRIERNGRe 3Y2 1VIR ROSFY.png

vi ~/.bashrc 修改.bashrc中指定的python環境變數
在檔案編輯中將所有的 python3.5.1 的配置全部刪除掉,將下面截圖紅框處的內容刪除掉並儲存Pasted Graphic 29.png

source ~/.bashrc 重新生效配置檔案localhost.png

升級pip3

解決掉python3版本問題後,就要安裝paddleOcr 所需要的環境paddlepaddle2.0

pip3 install --upgrade pip 升級一下 pip3 (官方安裝指導)
稍等片刻即可Pasted Graphic 22.png

安裝paddlepaddle2.0

這一步官方的指導裡面是區分gpu 還是 cpu版本,下面的例子都是以cpu版本為例。 (請需要安裝gpu版本的小夥伴執行到此處稍微移步到官方文件連結中去找一下gpu版本的安裝指令)

python3 -m pip install paddlepaddle==2.0.0 -i https://mirror.baidu.com/pypi/simple
複製程式碼

稍微等待幾分鐘的下載與更新Pasted Graphic 23.png

cd /home 切換回目錄下

clone PaddleOcr  倉庫程式碼

【推薦】git clone https://github.com/PaddlePaddle/PaddleOCR
如果無法訪問github 的小夥伴們也可以通過gitee倉庫裡面將原始碼下載下來:
git clone https://gitee.com/paddlepaddle/PaddleOCR
複製程式碼

tocolhost.png

安裝第三方庫

cd /home/PaddleOCR 切換到PaddleOcr目錄下:Pasted Graphic 25.png

pip3 install -r requirements.txt 安裝第三方庫

進入稍微漫長的下載等待。這一步我在實際安裝過程中因為網路原因失敗過一次,請大家耐心安裝,如遇 HTTPSConnectionPool Read timed out. 這樣的問題,請多嘗試安裝幾次,等其安裝完成。

Kfre PeanPennS.TA Ce 29)1 N0).png

5.下載官方模型

以官方的伺服器端模型為例說明。 (官方另為模型包更小的適合移動端的模型,感興趣的小夥伴小移步官方的文件說明中 github.com/PaddlePaddl…

docker 映象中建立模型目錄

mkdir /home/PaddleOCR/inference && cd /home/PaddleOCR/inference 在paddleOCR下建立inference模型目錄lecelrost hosefotdleo Rinference leoe2.png

下載、解壓模型

官方模型分為檢測,方向,識別模型,分別下載與解壓

下載檢測模型  wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar
下載方向分類器 wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar
下載識別模型 wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_infer.tar

解壓壓縮包

tar xf ch_ppocr_mobile_v2.0_cls_infer.tar
tar xf ch_ppocr_server_v2.0_det_infer.tar 
tar xf ch_ppocr_server_v2.0_rec_infer.tar
複製程式碼

解壓完成後的目錄如下Pasted Graphic 34.png

6.單張圖片識別測試

回到/home/paddleOCR目錄下

cd /home/PaddleOCR

圖片測試

用官方自帶的圖片來測試識別,官方自帶圖片目錄為/home/PaddleOCR/doc/imgs

測試命令為:
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_server_v2.0_det_infer/"  --rec_model_dir="./inference/ch_ppocr_server_v2.0_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" --use_angle_cls=True --use_space_char=True --use_gpu=False
複製程式碼

以下分別是原圖,識別後標識圖,以及識別結果

純臻營養護髮素.png

純臻營養護髮素.png

Pasted Graphic 35.png

7.服務部署

單張圖片測試通過後,我們就需要把服務以WEB方式部署上,以供其它服務以介面形式來呼叫了。

PaddleHub Server 服務部署

這種部署形式也是官方推薦的部署方式之一。

安裝paddlehub 環境

在docker映象中執行以下命令
pip3 install paddlehub==1.8.3 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
稍等片刻即可下載完成Pasted Graphic 38.png

修改部署引數檔案

部署引數檔案地址為docker映象中: /home/PaddleOCR/deploy/hubserving/ocr_system 下的 params.py

用vi 開啟params.py ,將下圖紅框處的3個檔案地址分別修改為下面地址:
/home/PaddleOCR/inference/ch_ppocr_server_v2.0_det_infer/
/home/PaddleOCR/inference/ch_ppocr_server_v2.0_rec_infer/
/home/PaddleOCR/inference/ch_ppocr_mobile_v2.0_cls_infer/
其它引數暫時不需要修改
複製程式碼

fo. .olgorktr.png

安裝服務模組

安裝檢測+識別串聯服務模組:
hub install deploy/hubserving/ocr_system/localhost.png

安裝flask

下面使用flask 部署web框架 pip3 install flasksnaoed aikcoor.12 tn Maeforoin(enheny waftepol Kfroe faty c.e.1).png

安裝flask-cors

pip3 install flask-corsPasted Graphic 43.png

新建web服務程式

在 /home/PaddleOCR/tools 目錄下新建一個新的py檔案,檔名為test_myocr.py 並且給許可權為 775
testmyocr.py的內容如下:

# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import sys
__dir__ = os.path.dirname(os.path.abspath(__file__))
sys.path.append(__dir__)
sys.path.append(os.path.abspath(os.path.join(__dir__, '..')))

from ppocr.utils.logging import get_logger
logger = get_logger()

import cv2
import numpy as np
import time
from PIL import Image
from ppocr.utils.utility import get_image_file_list
from tools.infer.utility import draw_ocr, draw_boxes

import requests
import json
import base64

from flask import Flask,request
from flask_cors import CORS


import requests
app = Flask(__name__)
CORS(app)  # 解決跨域問題

def cv2_to_base64(image):
    return base64.b64encode(image).decode('utf8')


def draw_server_result(image_file, res):
    img = cv2.imread(image_file)
    image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    if len(res) == 0:
        return np.array(image)
    keys = res[0].keys()
    if 'text_region' not in keys:  # for ocr_rec, draw function is invalid 
        logger.info("draw function is invalid for ocr_rec!")
        return None
    elif 'text' not in keys:  # for ocr_det
        logger.info("draw text boxes only!")
        boxes = []
        for dno in range(len(res)):
            boxes.append(res[dno]['text_region'])
        boxes = np.array(boxes)
        draw_img = draw_boxes(image, boxes)
        return draw_img
    else:  # for ocr_system
        logger.info("draw boxes and texts!")
        boxes = []
        texts = []
        scores = []
        for dno in range(len(res)):
            boxes.append(res[dno]['text_region'])
            texts.append(res[dno]['text'])
            scores.append(res[dno]['confidence'])
        boxes = np.array(boxes)
        scores = np.array(scores)
        draw_img = draw_ocr(
            image, boxes, texts, scores, draw_txt=True, drop_score=0.5)
        return draw_img

@app.route("/test")
def test():
    return 'Hello World!'

@app.route("/myocr", methods=["POST"] )
def myocr():
    # 輸入引數
    image_file = request.files['file']
    basepath = os.path.dirname(__file__)

    logger.info("{} basepath".format(basepath))

    savepath = os.path.join(basepath, image_file.filename)
    image_file.save(savepath)
    img = open(savepath, 'rb').read()
    if img is None:
        logger.info("error in loading image:{}".format(image_file))

    # 轉為 base64
    data = {'images': [cv2_to_base64(img)]}
    # 傳送請求
    url = "http://127.0.0.1:8866/predict/ocr_system"
    headers = {"Content-type": "application/json"}
    r = requests.post(url=url, headers=headers, data=json.dumps(data))

    # 返回結果
    res = r.json()["results"][0]
    logger.info(res)
    return  json.dumps(res)
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
複製程式碼

啟動服務

服務分為hub服務、web服務

啟動hub服務

【很重要】 export PATHONPATH=.這步很重要,血淚教訓哇;

如果少了這一步設定環境變數,在下面的執行中會報錯,提示找不到tools module

hub serving start -m ocr_system & 成功會出現如下說明lecalhost oneMolrod reioasoel hdb stcog Srart KotL.png

啟動web服務

cd /home/PaddleOCR/tools 目錄切換到tools下 python3 test_myocr.py & 啟動web服務,啟動成功會出現如下說明

grp BrLNg sIPeeTECA ss drgrecene. oleore see on olfes or Merip.png

8.服務測試

Postman工具呼叫測試

使用postman向 5000埠去發起請求,可以看到服務正常返回識別的結果Pasted Graphic 46.png

Vue簡單頁面測試

使用vue寫一個簡單的圖片上傳頁面,後端介面負責轉發資料與請求到5000介面中 這塊後面有時間再單獨寫篇介紹下截圖2021-07-19 22.36.19.png

9.效能分析

測試機配置

測試機器是在實體機器中使用VM虛擬化出來的

實體機:
cpu: AMD Ryzen 5 2600X Six-Core Processor
記憶體:32G
作業系統:window10 x64

虛擬Centos:
處理器:4核單執行緒
記憶體:8GB
作業系統:Centos 7.8
複製程式碼

以下解析時間僅供參考
在沒做任何優化情況下,且不考慮網路傳輸速度的影響,單張6.中的官方自帶測試圖片,解析時間分別為:

docker中直測:11秒
postman:17秒
vue中:18秒
複製程式碼

10.參考資料

PaddleOCR github
PaddleOCR安裝與實踐(CPU版)

相關文章