Paddle Inference 模型推理流程
分別介紹文字檢測、方向分類器和文字識別3個模型,基於Paddle Inference的推理過程。
Paddle Inference 的 Python 離線推理
離線推理,即在特定機器上部署的程式碼只能在這臺機器上使用,無法透過其他機器進行訪問
使用whl包預測推理
“WHL”是“WHeeL”的英文縮寫,意思是“車輪” ,whl 格式本質上是一個壓縮包,裡面包含了py檔案,以及經過編譯的pyd檔案
為了更加方便快速體驗OCR文字檢測與識別模型,PaddleOCR提供了基於Paddle Inference預測引擎的whl包,方便您一鍵安裝,體驗PaddleOCR。
安裝whl包
pip install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple --verbose
使用whl包預測推理
paddleocr whl包會自動下載PP-OCRv2超輕量模型作為預設模型,也支援自定義模型路徑、預測配置等引數,引數名稱與基於Paddle Inference的python預測中引數相同。
單獨執行檢測
import cv2
import matplotlib.pyplot as plt
import numpy as np
import os
from paddleocr import PaddleOCR, draw_ocr
ocr = PaddleOCR(use_gpu=False) # need to run only once to download and load model into memory
img_path = './images/006.jpg'
result = ocr.ocr(img_path, rec=False)
for line in result:
print(line)
# 顯示結果
from PIL import Image
image = Image.open(img_path).convert('RGB')
im_show = draw_ocr(image, result, txts=None, scores=None, font_path='./fonts/simfang.ttf')
plt.figure(figsize=(15, 8))
plt.imshow(im_show)
plt.show()
單獨執行識別
可以指定det=False
,僅執行單獨的識別模組。
import matplotlib.pyplot as plt
from paddleocr import PaddleOCR, draw_ocr
ocr = PaddleOCR(use_gpu=False) # need to run only once to download and load model into memory
img_path = './images/006.jpg'
result = ocr.ocr(img_path, det=False)
for line in result:
print(line)
單獨執行方向分類器
可以指定det=False, rec=False, cls=True
,僅執行方向分類器。
import cv2
import matplotlib.pyplot as plt
from paddleocr import PaddleOCR, draw_ocr
ocr = PaddleOCR(use_angle_cls=True, use_gpu=False) # need to run only once to download and load model into memory
img_path = './images/006.jpg'
result = ocr.ocr(img_path, det=False, rec=False, cls=True)
for line in result:
print(line)
img = cv2.imread(img_path)
plt.imshow(img[...,::-1])
plt.show()
全流程體驗(檢測+方向分類器+識別)
import cv2
import os
import matplotlib.pyplot as plt
from paddleocr import PaddleOCR, draw_ocr
# PaddleOCR目前支援中英文、英文、法語、德語、韓語、日語,可以透過修改lang引數進行切換
# 引數依次為`ch`, `en`, `french`, `german`, `korean`, `japan`。
ocr = PaddleOCR(use_angle_cls=True, lang="ch", use_gpu=False) # need to run only once to download and load model into memory
save_results = []
img_path = 'images/003.jpg'
save_dir = 'ocr_result'
result = ocr.ocr(img_path, cls=True)[0]
# 將結果寫入檔案
with open(
os.path.join(save_dir, "003_result.txt"),
'w',
encoding='utf-8') as f:
for line in result:
f.writelines(str(line)+'\n')
print(line)
# 顯示結果
from PIL import Image
image = Image.open(img_path).convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores, font_path='./fonts/simfang.ttf')
cv2.imwrite(os.path.join(save_dir, "003_result.jpg"), im_show)
plt.figure(figsize=(15, 8))
plt.imshow(im_show)
plt.show()
使用原始碼推理
下載原始碼,並解壓:https://gitee.com/paddlepaddle/PaddleOCR/tree/release/2.6
安裝依賴包
https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.6/requirements.txt
將檔案 requirements.txt 儲存到執行目錄下如 D:\OpenSource\PaddlePaddle\PaddleOCR-release-2.6
shapely
scikit-image
imgaug
pyclipper
lmdb
tqdm
numpy
visualdl
rapidfuzz
opencv-python==4.6.0.66
opencv-contrib-python==4.6.0.66
cython
lxml
premailer
openpyxl
attrdict
Polygon3
lanms-neo==1.0.2
PyMuPDF<1.21.0
安裝執行所需要的包
D:\OpenSource\PaddlePaddle\PaddleOCR-release-2.6>pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --verbose
D:\OpenSource\PaddlePaddle\PaddleOCR-release-2.6>pip install paddlenlp -i https://pypi.tuna.tsinghua.edu.cn/simple --verbose
文字檢測
PaddleOCR中,在基於文字檢測模型進行推理時,需要透過引數image_dir
指定單張影像或者影像集合的路徑、引數det_model_dir
, 指定檢測的 inference
模型路徑。
百度OCR原始碼中提供了樣例圖片:https://gitee.com/paddlepaddle/PaddleOCR/tree/release/2.6/doc/imgs
準備資料和環境
import cv2
import matplotlib.pyplot as plt
import numpy as np
import os
# 選擇2張影像視覺化
img1 = cv2.imread("doc/imgs/00006737.jpg")
img2 = cv2.imread("doc/imgs/00056221.jpg")
plt.figure(figsize=(15, 6))
plt.subplot(1, 2, 1) # 定義 1行2列
plt.imshow(img1[:, :, ::-1]) # 第1列 放 img1 ,::-1 => axis 3 倒序
plt.subplot(1, 2, 2) # 定義 1行2列
plt.imshow(img2[:, :, ::-1]) # 第2列 放 img1
plt.show()
準備推理模型
下載模型:https://paddleocr.bj.bcebos.com/PP-OCRv2/chinese/ch_PP-OCRv3_det_infer.tar
解壓放至:inference
目錄
如果您希望匯出自己訓練得到的模型,使用Paddle Inference部署,那麼可以使用下面的命令將預訓練模型使用動轉靜的方法,轉化為推理模型。
# 參考程式碼
# https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/tools/export_model.py
# 下載預訓練模型(V2)
wget https://paddleocr.bj.bcebos.com/PP-OCRv2/chinese/ch_PP-OCRv2_det_distill_train.tar && tar -xf ch_PP-OCRv2_det_distill_train.tar && rm ch_PP-OCRv2_det_distill_train.tar
# 匯出推理模型(V2)
python tools/export_model.py -c configs/det/ch_PP-OCRv2/ch_PP-OCRv2_det_cml.yml \
-o Global.pretrained_model="ch_PP-OCRv2_det_distill_train/best_accuracy" \
Global.save_inference_dir="./my_model"
文字檢測模型推理
CMD 進到程式碼目錄如圖
使用V3模型預測
# 預測
python tools/infer/predict_det.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/ch_PP-OCRv3_det_infer" --use_gpu=False
輸出
- 定義引數設定
PaddleOCR-release-2.6\tools\infer\utility.py
更多引數說明:doc\doc_ch\inference_args.md
- 文字檢測
PaddleOCR-release-2.6\tools\infer\predict_det.py
部分程式碼說明:https://aistudio.baidu.com/aistudio/projectdetail/6180758
方向分類器模型推理
//TODO 現在還不知道這玩意具體是用來幹嘛的。
將角度不正確的文書處理成正常方向的
https://www.paddlepaddle.org.cn/modelsDetail?modelId=17
下載模型:https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar
解壓放至:inference
目錄
# 預測
python tools/infer/predict_cls.py \
--image_dir="./doc/imgs_words/ch/word_1.jpg" \
--cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer" \
--use_gpu=False
方向分類器的具體實現程式碼: PaddleOCR-release-2.6\tools\infer\predict_cls.py
文字識別
https://www.paddlepaddle.org.cn/modelsDetail?modelId=17
下載模型:https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar
解壓放至:inference
目錄
# 預測
python tools/infer/predict_rec.py \
--image_dir="./doc/imgs_words/ch/word_4.jpg" \
--rec_model_dir="./inference/ch_PP-OCRv3_rec_infer" \
--use_gpu=False
文字識別的具體程式碼:PaddleOCR-release-2.6\tools\infer\predict_rec.py
系統串聯預測推理
在執行PP-OCR的系統推理時,需要透過引數image_dir
指定單張影像或者影像集合的路徑、引數det_model_dir
, cls_model_dir
和 rec_model_dir
分別指定檢測、方向分類和識別的 inference
模型路徑。引數 use_angle_cls
用於控制是否啟用方向分類模型。use_mp
表示是否使用多程式。total_process_num
表示在使用多程式時的程式數。
以影像檔案 ./doc/imgs/00018069.jpg
為例,預測的原始影像如下。
# 預測
python tools/infer/predict_system.py \
--image_dir="./doc/imgs/00018069.jpg" \
--det_model_dir="./inference/ch_PP-OCRv3_det_infer/" \
--cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" \
--rec_model_dir="./inference/ch_PP-OCRv3_rec_infer/" \
--use_angle_cls=True
視覺化識別結果預設儲存到 ./inference_results
資料夾裡面。
在圖象中視覺化出了檢測框和識別結果,在上面的notebook中也列印出了具體的識別檔案以及檔案讀取路徑資訊。
如果希望儲存裁剪後的識別結果,可以將save_crop_res引數設定為True,最終結果儲存在output
目錄下,其中部分裁剪後影像如下所示。儲存的結果可以用於後續的識別模型標註與訓練。
python tools/infer/predict_system.py \
--image_dir="./doc/imgs/00018069.jpg" \
--det_model_dir="./inference/ch_PP-OCRv3_det_infer/" \
--cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" \
--rec_model_dir="./inference/ch_PP-OCRv3_rec_infer/" \
--use_angle_cls=True \
--save_crop_res=True
參考引用
PP-OCRv3文字檢測識別系統
PaddleOCR Github
PP-OCRv2預測部署實戰 程式碼中 v2 改 v3