百度飛槳(PaddlePaddle) - PP-OCRv3 文字檢測識別系統 Paddle Inference 模型推理

VipSoft發表於2023-05-19

Paddle Inference 模型推理流程
分別介紹文字檢測、方向分類器和文字識別3個模型,基於Paddle Inference的推理過程。

image

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

image

使用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()

image

單獨執行識別

可以指定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()

image

使用原始碼推理

下載原始碼,並解壓:https://gitee.com/paddlepaddle/PaddleOCR/tree/release/2.6
image

安裝依賴包

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()

image

準備推理模型

下載模型:https://paddleocr.bj.bcebos.com/PP-OCRv2/chinese/ch_PP-OCRv3_det_infer.tar
解壓放至:inference 目錄
image
如果您希望匯出自己訓練得到的模型,使用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 進到程式碼目錄如圖
image
使用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

輸出
image

方向分類器模型推理

//TODO 現在還不知道這玩意具體是用來幹嘛的。
將角度不正確的文書處理成正常方向的
https://www.paddlepaddle.org.cn/modelsDetail?modelId=17
image
下載模型: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
image

文字識別

https://www.paddlepaddle.org.cn/modelsDetail?modelId=17
image
下載模型: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

image
文字識別的具體程式碼:PaddleOCR-release-2.6\tools\infer\predict_rec.py

系統串聯預測推理

在執行PP-OCR的系統推理時,需要透過引數image_dir指定單張影像或者影像集合的路徑、引數det_model_dir, cls_model_dirrec_model_dir 分別指定檢測、方向分類和識別的 inference 模型路徑。引數 use_angle_cls 用於控制是否啟用方向分類模型。use_mp 表示是否使用多程式。total_process_num 表示在使用多程式時的程式數。
以影像檔案 ./doc/imgs/00018069.jpg 為例,預測的原始影像如下。
image

# 預測 
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

image
視覺化識別結果預設儲存到 ./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

image

參考引用

PP-OCRv3文字檢測識別系統
PaddleOCR Github
PP-OCRv2預測部署實戰 程式碼中 v2 改 v3

相關文章