!!!以下內容為作者原創,首發於個人博客園&掘金平台。未經原作者同意與許可,任何人、任何組織不得以任何形式轉載。原創不易,如果對您的問題提供了些許幫助,希望得到您的點贊支持。
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
可以自己選擇一個穩定的版本安裝,或者不指定版本,直接安裝最新版本
yum install docker-ce
接下來就是yum來安裝docker完成
啟動docker服務
service docker start
啟動docker服務
docker --version
查看docker版本,以檢查docker是否正常啟動
systemctl enable docker
配置一下docker服務開機自啟動
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分鍾左右
下載完畢后,會自動進入到鏡像內部的shell里,進入下面這樣的界面中。
不用理睬,直接exit退出來。
docker ps -a
查看一下docker的運行進程,發現這個這個剛剛下載來的ppocr已經被關閉掉了。
docker start ppocr
重啟這個ppocr容器
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容器內部
python3 --version
檢查python3 版本,如圖版本是3.5.1,必須要進行升級
pip3 --version
檢查pip3版本,如果pip3是3.5.1下的,也要跟着一起升級
升級安裝python3
容器內已經有python3 的源碼安裝文件 在/home 目錄下,有3.7.0 和 3.8.0 我們直接選擇3.8.0 編譯安裝。
cd /Python-3.8.0
進入到Python-3.8.0目錄下
./configure
編譯器會執行一些安裝前檢查,稍等片刻就會檢查完成。
make && make install
源碼安裝,稍等幾分鍾,等待安裝完成。
安裝完成,重新檢查一下python3,pip3版本,確保版本已經升級到3.8.0
【很重要】更新用戶環境變量參數
安裝一個vim,方便容器內進行文本編輯
apt-get update
apt-get install vim
復制代碼
vi ~/.bashrc
修改.bashrc中指定的python環境變量
在文件編輯中將所有的 python3.5.1 的配置全部刪除掉,將下面截圖紅框處的內容刪除掉並保存
source ~/.bashrc
重新生效配置文件
升級pip3
解決掉python3版本問題后,就要安裝paddleOcr 所需要的環境paddlepaddle2.0
pip3 install --upgrade pip
升級一下 pip3 (官方安裝指導)
稍等片刻即可
安裝paddlepaddle2.0
這一步官方的指導里面是區分gpu 還是 cpu版本,下面的例子都是以cpu版本為例。 (請需要安裝gpu版本的小伙伴執行到此處稍微移步到官方文檔鏈接中去找一下gpu版本的安裝指令)
python3 -m pip install paddlepaddle==2.0.0 -i https://mirror.baidu.com/pypi/simple 復制代碼
稍微等待幾分鍾的下載與更新
cd /home
切換回目錄下
clone PaddleOcr 倉庫代碼
【推薦】git clone https://github.com/PaddlePaddle/PaddleOCR 如果無法訪問github 的小伙伴們也可以通過gitee倉庫里面將源碼下載下來: git clone https://gitee.com/paddlepaddle/PaddleOCR 復制代碼
安裝第三方庫
cd /home/PaddleOCR
切換到PaddleOcr目錄下:
pip3 install -r requirements.txt
安裝第三方庫
進入稍微漫長的下載等待。這一步我在實際安裝過程中因為網絡原因失敗過一次,請大家耐心安裝,如遇 HTTPSConnectionPool Read timed out. 這樣的問題,請多嘗試安裝幾次,等其安裝完成。
5.下載官方模型
以官方的服務器端模型為例說明。 (官方另為模型包更小的適合移動端的模型,感興趣的小伙伴小移步官方的文檔說明中 github.com/PaddlePaddl…)
docker 鏡像中創建模型目錄
mkdir /home/PaddleOCR/inference && cd /home/PaddleOCR/inference
在paddleOCR下創建inference模型目錄
下載、解壓模型
官方模型分為檢測,方向,識別模型,分別下載與解壓
下載檢測模型 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 復制代碼
解壓完成后的目錄如下
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 復制代碼
以下分別是原圖,識別后標識圖,以及識別結果
7.服務部署
單張圖片測試通過后,我們就需要把服務以WEB方式部署上,以供其它服務以接口形式來調用了。
PaddleHub Server 服務部署
這種部署形式也是官方推薦的部署方式之一。
安裝paddlehub 環境
在docker鏡像中執行以下命令pip3 install paddlehub==1.8.3 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
稍等片刻即可下載完成
修改部署參數文件
部署參數文件地址為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/ 其它參數暫時不需要修改 復制代碼
安裝服務模塊
安裝檢測+識別串聯服務模塊:hub install deploy/hubserving/ocr_system/
安裝flask
下面使用flask 部署web框架 pip3 install flask
安裝flask-cors
pip3 install flask-cors
新建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 &
成功會出現如下說明
啟動web服務
cd /home/PaddleOCR/tools
目錄切換到tools下 python3 test_myocr.py &
啟動web服務,啟動成功會出現如下說明
8.服務測試
Postman工具調用測試
使用postman向 5000端口去發起請求,可以看到服務正常返回識別的結果
Vue簡單頁面測試
使用vue寫一個簡單的圖片上傳頁面,后端接口負責轉發數據與請求到5000接口中 這塊后面有時間再單獨寫篇介紹下
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秒
復制代碼