在下面的教程中,我們將了解如何使用 Python 編程語言識別車牌。我們將在本項目中使用 OpenCV 來識別車牌,並使用 pythonpython從車牌中提取字符和數字。在本教程結束之前,我們將構建一個自動識別車牌的 Python 程序。
了解自動車牌識別系統
自動車牌識別系統有各種形狀和尺寸:
- 在可預測車牌類型的測量照明情況下執行的 ANPR 可以利用圖像處理的基本技術。
- 更先進的 ANPR 系統使用專用的物體檢測器,如 HOG +線性 SVM、固態硬盤、YOLO 和 fast R-CNN 來定位圖像中的車牌。
- 最先進的 ANPR 軟件使用遞歸神經網絡(RNNs)和長短期記憶網絡(LSTMs),以幫助更好地從車牌本身識別文本。
- 更先進的 ANPR 系統利用專門的神經網絡結構,在圖像被 OCR 之前對其進行預處理和清潔,從而提高了 ANPR 的準確性。
使自動車牌識別更加複雜的事實可能需要實時操作。
例如,讓我們考慮安裝在收費公路上的 ANPR 系統。它必須能夠檢測經過的每輛車的車牌,對車牌上的字符進行 OCR,然後將這些數據存儲在數據庫中,這樣車主就可以為通行費付費。
很少有複合因素使 ANPR 極具挑戰性,包括找到一組我們可以利用的數據,以便為 ANPR 訓練定製模型。用於訓練最先進模型的大型、健壯的 ANPR 數據集受到嚴密保護,並且很少(如果有的話)公開發布:
- 這些數據集包括與車輛、駕駛員和位置相關的敏感識別細節。
- ANPR 的數據集是乏味的策劃,需要難以置信的時間投資和工作人員的時間來解釋。
- ANPR 與地方和聯邦政府的合同往往極其合理。往往不是訓練好的模型有價值;但是,不是指定公司策劃的數據集。
- 出於同樣的原因,我們將觀察到 ANPR 工業收購不是為了他們的 ANPR 系統,而是為了數據本身。
項目的先決條件
我們將使用 Python OpenCV 庫。這是一個機器學習的開源庫,為計算機視覺提供了一個通用的基礎設施。我們還將在項目中使用侏儒怪。宇宙魔方是一個宇宙魔方-OCR 引擎,用於讀取圖像類型並提取圖像中可用的細節。
安裝
藉助以下語法,我們可以使用 pip 安裝程序安裝 OpenCV 庫:
語法:
$ pip install opencv-python
為了安裝pytesserpact發動機,將遵循相同的程序。其語法如下所示:
語法:
$ pip install pytesseract
OpenCV 的特點
- 在下面的 Python 項目中,我們將利用 OpenCV 的以下特性來識別輸入圖像中的車牌:
- 高斯模糊:這裡,我們將使用高斯核進行圖像平滑。這種技術對於去除高斯噪聲非常有效。 OpenCV 為該任務提供了一個名為Gaussian bulr()的函數。
- 形態變換:這些是基於圖像形狀的運算,在二值圖像上進行處理。基本的形態學操作包括打開、關閉、侵蝕、擴張等等。 OpenCV 中提供的一些功能如下:
- cv2.erode()
- cv2 . exploit()
- cv2 .形態學()
- Sobel: 這裡,我們將根據圖像計算導數。這個特徵對於基於計算機視覺的各種任務來說是重要的。在這些導數的幫助下,我們可以計算梯度,梯度的較高變化表示圖像中值得注意的變化。 OpenCV 提供索貝爾()函數來計算索貝爾算子。
- 等高線:等高線是由所有強度相同的連續點組成的曲線。這些曲線對於物體的識別非常有用。 OpenCV 為該功能提供了查找輪廓()功能。
理解 Python 代碼
既然我們已經討論了項目的理論部分,讓我們進入編碼部分。為了更好的理解和清晰,我們將項目的整個源代碼分成了不同的步驟。
步驟 1:導入所需的模塊
首先,我們要導入 OpenCV 和pytessarct以及 matplotlib、glob 和 OS 。
檔案:test . py
# importing the required modules
import pytesseract
import matplotlib.pyplot as plt
import cv2
import glob
import os
注意:文件的名稱必須是車牌圖像中的準確數字。例如,如果車牌號碼是“FTY348U”,那麼圖像文件的名稱將是“FTY348U.jpg”。
步驟 2:在車牌上使用鑲嵌引擎執行 OCR
對於下一步,我們必須在車牌的鑲嵌引擎的幫助下執行 OCR。在下面的代碼片段中可以觀察到同樣的情況。
檔案:test . py
# specifying the path to the number plate images folder as shown below
file_path = os.getcwd() + "/license_plates/**/*.jpg"
NP_list = []
predicted_NP = []
for file_path in glob.glob(file_path, recursive = True):
NP_file = file_path.split("/")[-1]
number_plate, _ = os.path.splitext(NP_file)
'''
Here we will append the actual number plate to a list
'''
NP_list.append(number_plate)
'''
Reading each number plate image file using openCV
'''
NP_img = cv2.imread(file_path)
'''
We will then pass each number plate image file
to the Tesseract OCR engine utilizing the Python library
wrapper for it. We get back predicted_res for
number plate. We append the predicted_res in a
list and compare it with the original number plate
'''
predicted_res = pytesseract.image_to_string(NP_img, lang ='eng',
config ='--oem 3 --psm 6 -c tessedit_char_whitelist = ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
filter_predicted_res = "".join(predicted_res.split()).replace(":", "").replace("-", "")
predicted_NP.append(filter_predicted_res)
說明:
在上面的代碼片段中,我們已經使用操作系統模塊指定了車牌圖像文件的路徑。我們還將兩個空列表定義為 NP_list 和 predicted_NP 。然後,我們使用 append() 功能將實際的車牌號添加到列表中。然後我們使用 OpenCV 模塊讀取每個車牌圖像文件,並將它們存儲在 NP_img 變量中。然後,我們在 Python 庫包裝器的幫助下,將每個車牌圖像文件傳遞給 Tesseract OCR 引擎。然後我們得到了車牌號的 predicted_res ,並將它添加到一個列表中,並與真品進行比較。
現在,因為我們已經預測了板塊,但是我們不知道預測。因此,為了查看數據和預測,我們將執行一點可視化,如下所示。我們還將在沒有任何核心函數幫助的情況下估計預測的準確性。
檔案:test . py
print("Original Number Plate", "\t", "Predicted Number Plate", "\t", "Accuracy")
print("--------------------", "\t", "-----------------------", "\t", "--------")
def estimate_predicted_accuracy(ori_list, pre_list):
for ori_plate, pre_plate in zip(ori_list, pre_list):
acc = "0 %"
number_matches = 0
if ori_plate == pre_plate:
acc = "100 %"
else:
if len(ori_plate) == len(pre_plate):
for o, p in zip(ori_plate, pre_plate):
if o == p:
number_matches += 1
acc = str(round((number_matches / len(ori_plate)), 2) * 100)
acc += "%"
print(ori_plate, "\t", pre_plate, "\t", acc)
estimate_predicted_accuracy(NP_list, predicted_NP)
輸出:
Original Number Plate Predicted Number Plate Accuracy
-------------------- ----------------------- --------
DL3CAM0857 DL3CAM0857 100 %
MD06NYW MDOGNNS 40 %
TN21TC706 TN21TC706 100 %
TN63DB5481 TN63DB5481 100 %
UP14DR4070 UP14DR4070 100 %
W5KHN WSKHN 80 %
說明:
在上面的代碼片段中,我們定義了一個計算預測精度的函數。在該函數中,我們使用 for-loop 來遍歷原始車牌和預測車牌的列表,並檢查它們是否匹配。為了獲得更好更合適的結果,我們還根據數字的長度檢查了準確性。
我們可以觀察到,Tesseract OCR 引擎大多以 100%的準確率正確預測所有的車牌。宇宙魔方 OCR 引擎對車牌的預測不正確,我們將對這些車牌文件應用圖像處理技術,並將它們再次傳遞給宇宙魔方 OCR。我們可以通過應用圖像處理技術來提高鑲嵌引擎對錯誤預測的車牌的準確率。
步驟 3:圖像處理技術
讓我們考慮下面的代碼片段來理解圖像處理技術。
檔案:test . py
import matplotlib.image as mpimg
for img in os.listdir("D://Python//License_Plate"):
test_NP = mpimg.imread("W5KHN.jpg")
plt.imshow(test_NP)
plt.axis('off')
plt.title('W5KHN license plate')
plt.show()
輸出:
說明:
在上面的代碼片段中,我們從 matplotlib 庫中導入了圖像模塊,並使用 for-loop 從指定的文件夾中提取圖像。然後,我們使用 imread() 功能讀取提取的圖像。然後我們使用 matplotlib 庫中的繪圖模塊為用戶顯示圖像。
- 圖像調整大小:我們可以藉助調整的大小,在水平和垂直方向將圖像文件的大小調整為 2 倍。
- 轉換為灰度:然後,我們可以將調整後的圖像文件轉換為灰度,以優化檢測並大幅減少圖像中可用的顏色數量,這將使我們能夠輕鬆檢測車牌。
- 圖像去噪:我們可以使用高斯模糊技術對圖像去噪。它使圖像的邊緣更加清晰和平滑,使字符更易讀。
讓我們考慮下面的例子來理解同樣的事情。
檔案:test . py
# image resizing
resize_test_NP = cv2.resize(
test_NP, None, fx = 2, fy = 2,
interpolation = cv2.INTER_CUBIC)
# converting image to grayscale
grayscale_resize_test_NP = cv2.cvtColor(
resize_test_NP, cv2.COLOR_BGR2GRAY)
# denoising the image
gaussian_blur_NP = cv2.GaussianBlur(
grayscale_resize_test_NP, (5, 5), 0)
說明:
在上面的代碼片段中,我們有一些 OpenCV 模塊的工具來調整圖像的大小,將其轉換為灰度,並對圖像進行去噪。
一旦完成以上步驟,我們就可以將轉換後的車牌文件傳遞給 Tesseract OCR 引擎,並查看預測結果。
在下面的代碼片段中可以觀察到同樣的情況。
檔案:anby . py
new_pre_res_W5KHN = pytesseract.image_to_string(gaussian_blur_NP, lang ='eng')
filter_new_pre_res_W5KHN = "".join(new_pre_res_W5KHN.split()).replace(":", "").replace("-", "")
print(filter_new_pre_res_W5KHN)
輸出:
W5KHN
說明:
在上面的代碼片段中,我們將最終處理的圖像傳遞給 Tesseract OCR 引擎,以從車牌中提取號碼。
同樣,我們可以對所有其他車牌進行這種圖像處理,但準確率不是 100%。這樣,車牌識別模型就準備好了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/283087.html