百度飛槳(PaddlePaddle)安裝
OCR 文字檢測(Differentiable Binarization --- DB)
OCR的技術路線
PaddleHub 預訓練模型的網路結構是 DB + CRNN, 可微的二值化模組(Differentiable Binarization,簡稱DB)
CRNN(Convolutional Recurrent Neural Network)即卷積遞迴神經網路, 是DCNN和RNN的組合
DB(Differentiable Binarization)是一種基於分割的文字檢測演算法。將二值化閾值加入訓練中學習,可以獲得更準確的檢測邊界,從而簡化後處理流程。DB演算法最終在5個資料集上達到了state-of-art的效果和效能
CRNN(Convolutional Recurrent Neural Network)即卷積遞迴神經網路,是DCNN和RNN的組合,專門用於識別影像中的序列式物件。與CTC loss配合使用,進行文字識別,可以直接從文字詞級或行級的標註中學習,不需要詳細的字元級的標註
安裝庫
Building wheel for opencv-python (pyproject.toml):https://www.cnblogs.com/vipsoft/p/17386638.html
# 安裝 PaddlePaddle
python -m pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安裝 PaddleHub Mac 電腦上終端會感覺卡死的狀態,可以新增 --verbose,檢視進度
pip install paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple --verbose
# 該Module依賴於第三方庫shapely、pyclipper,使用該Module之前,請先安裝shapely、pyclipper
pip install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pyclipper -i https://pypi.tuna.tsinghua.edu.cn/simple
定義待預測資料
將預測圖片存放在一個檔案中 picture.txt
./images/231242.jpg
./images/234730.jpg
測試輸出
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
# 將預測圖片存放在一個檔案中(picture.txt)
with open('picture.txt', 'r') as f:
test_img_path=[]
for line in f:
test_img_path.append(line.strip())
# 顯示圖片
img1 = mpimg.imread(line.strip())
plt.figure(figsize=(10, 10))
plt.imshow(img1)
plt.axis('off')
plt.show()
print(test_img_path) # => ['images/231242.jpg', 'images/234730.jpg']
載入預訓練模型
PaddleHub提供了以下文字識別模型:
移動端的超輕量模型:僅有8.1M,chinese_ocr_db_crnn_mobile
伺服器端的精度更高模型:識別精度更高,chinese_ocr_db_crnn_server。
識別文字演算法均採用CRNN(Convolutional Recurrent Neural Network)即卷積遞迴神經網路。其是DCNN和RNN的組合,專門用於識別影像中的序列式物件。與CTC loss配合使用,進行文字識別,可以直接從文字詞級或行級的標註中學習,不需要詳細的字元級的標註。該Module支援直接預測。 移動端與伺服器端主要在於骨幹網路的差異性,移動端採用MobileNetV3,伺服器端採用ResNet50_vd
import paddlehub as hub
# 載入移動端預訓練模型
# ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")
# 服務端可以載入大模型,效果更好
ocr = hub.Module(name="chinese_ocr_db_crnn_server")
預測
PaddleHub對於支援一鍵預測的module,可以呼叫module的相應預測API,完成預測功能。
module 'numpy' has no attribute 'int'.: 解方法見:https://www.cnblogs.com/vipsoft/p/17385169.html
import paddlehub as hub
import cv2
# 載入移動端預訓練模型
ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")
# 服務端可以載入大模型,效果更好 -- 【個人電腦,記憶體不夠用】
# ocr = hub.Module(name="chinese_ocr_db_crnn_server")
# 將預測圖片存放在一個檔案中(picture.txt)
test_img_path = []
with open('picture.txt', 'r') as f:
for line in f:
test_img_path.append(line.strip())
print("預測圖片 => ", test_img_path)
# 讀取測試資料夾test.txt中的照片路徑
np_images = [cv2.imread(image_path) for image_path in test_img_path]
results = ocr.recognize_text(
images=np_images, # 圖片資料,ndarray.shape 為 [H, W, C],BGR格式;
use_gpu=False, # 是否使用 GPU;若使用GPU,請先設定CUDA_VISIBLE_DEVICES環境變數
output_dir='ocr_result', # 圖片的儲存路徑,預設設為 ocr_result;
visualization=True, # 是否將識別結果儲存為圖片檔案;
box_thresh=0.5, # 檢測文字框置信度的閾值;
text_thresh=0.5) # 識別中文文字置信度的閾值;
for result in results:
data = result['data']
save_path = result['save_path']
for infomation in data:
print('text: ', infomation['text'], '\nconfidence: ', infomation['confidence'], '\ntext_box_position: ', infomation['text_box_position'])
輸出
"D:\Program Files\Python38\python.exe" D:/OpenSource/PaddlePaddle/OCR/OCRTest.py
預測圖片 => ['./images/123.jpg']
text: 中華人民共和國
confidence: 0.9990600347518921
text_box_position: [[188, 37], [472, 32], [472, 65], [188, 70]]
text: 居民身份證
confidence: 0.9996429681777954
text_box_position: [[171, 96], [492, 96], [492, 140], [171, 140]]
text: 簽發機關
confidence: 0.9993374347686768
text_box_position: [[140, 242], [217, 242], [217, 263], [140, 263]]
text: 蘇州市公安局工業園區分局
confidence: 0.9997307658195496
text_box_position: [[233, 242], [473, 242], [473, 262], [233, 262]]
text: 有效期限
百度飛槳:https://aistudio.baidu.com/aistudio/projectdetail/507159