繼上一篇進行簡單的實作後,今天就要將EasyOCR套入之前做好的模型當中去進行辨識,那話不多說,我們開始吧!
predict_and_plot_with_ocr
的副程式,用途同樣是對輸入進的圖片進行處理,加上EasyOCR對邊界框內的文字進行辨識。import easyocr
import cv2
import matplotlib.pyplot as plt
from ultralytics import YOLO
def predict_and_plot_with_ocr(path_test_car):
# 使用模型對測試的圖片做預測
results = model.predict(path_test_car, device='cpu')
# 使用cv2讀取圖片
image = cv2.imread(path_test_car)
# 將影像從BGR轉為RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 設定辨識的語言
reader = easyocr.Reader(['en'])
# 從結果提取出邊界框和標籤
for result in results:
for box in result.boxes:
# 獲取邊界框的座標
x1, y1, x2, y2 = map(int, box.xyxy[0])
# 獲取邊界框的信心分數
confidence = box.conf[0]
# 在圖片上繪製邊界框
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
#在圖片周圍繪製信心分數
cv2.putText(image, f'{confidence*100:.2f}%', (x1, y1 - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
# 裁剪圖片的邊界框用來辨識OCR
roi = gray_image[y1:y2, x1:x2]
# 對裁剪的範圍進行OCR辨識
text = reader.readtext(roi)
if len(text) > 0:
text = text[0][1]
cv2.putText(image, text, (x1, y1 - 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 123, 255), 2)
print(f'Detected text: {text}')
# 使用matploblib繪製出影像
plt.imshow(image)
plt.axis('off')
plt.show()
predict_and_plot_with_ocr(r'c:/Users/sywu0/Documents/projects/Car_License/Modle/test/images/Cars203.png')
會得出下圖辨識出的結果以及準確率,可以看到圖片的文字有順利的辨識出來,而且準確率還不錯。
不過也有辨識錯誤的時候,如下圖的圖片所示,OCR將S辨識成5的狀況,但這張圖片的清晰度較不清楚。
筆者也試著採用測試集外的圖片,筆者也很好奇模型是否能抓取不同國家的車牌,於是從網路上抓了一張台灣的車牌來測試,如下圖。
可見模型有正確的將車牌的位置給框選出來,且EasyOCR也有正確的將數字及英文都有正確的辨識,但是在車牌中間的-
並沒有正確辨識出來,這是有點可惜的部分。
經過以上的測試後,這次實作的車牌辨識也順利告了一個段落,接著會用一篇來說說這個車牌辨識還有哪些可以改善的地方,那我們下篇見。