基於 Python 的車牌識別

在下面的教程中,我們將了解如何使用 Python 編程語言識別車牌。我們將在本項目中使用 OpenCV 來識別車牌,並使用 pythonpython從車牌中提取字符和數字。在本教程結束之前,我們將構建一個自動識別車牌的 Python 程序。

了解自動車牌識別系統

自動車牌識別系統有各種形狀和尺寸:

  1. 在可預測車牌類型的測量照明情況下執行的 ANPR 可以利用圖像處理的基本技術。
  2. 更先進的 ANPR 系統使用專用的物體檢測器,如 HOG +線性 SVM、固態硬盤、YOLO 和 fast R-CNN 來定位圖像中的車牌。
  3. 最先進的 ANPR 軟件使用遞歸神經網絡(RNNs)和長短期記憶網絡(LSTMs),以幫助更好地從車牌本身識別文本。
  4. 更先進的 ANPR 系統利用專門的神經網絡結構,在圖像被 OCR 之前對其進行預處理和清潔,從而提高了 ANPR 的準確性。

使自動車牌識別更加複雜的事實可能需要實時操作。

例如,讓我們考慮安裝在收費公路上的 ANPR 系統。它必須能夠檢測經過的每輛車的車牌,對車牌上的字符進行 OCR,然後將這些數據存儲在數據庫中,這樣車主就可以為通行費付費。

很少有複合因素使 ANPR 極具挑戰性,包括找到一組我們可以利用的數據,以便為 ANPR 訓練定製模型。用於訓練最先進模型的大型、健壯的 ANPR 數據集受到嚴密保護,並且很少(如果有的話)公開發佈:

  1. 這些數據集包括與車輛、駕駛員和位置相關的敏感識別細節。
  2. ANPR 的數據集是乏味的策劃,需要難以置信的時間投資和工作人員的時間來解釋。
  3. ANPR 與地方和聯邦政府的合同往往極其合理。往往不是訓練好的模型有價值;但是,不是指定公司策劃的數據集。
  4. 出於同樣的原因,我們將觀察到 ANPR 工業收購不是為了他們的 ANPR 系統,而是為了數據本身。

項目的先決條件

我們將使用 Python OpenCV 庫。這是一個機器學習的開源庫,為計算機視覺提供了一個通用的基礎設施。我們還將在項目中使用侏儒怪。宇宙魔方是一個宇宙魔方-OCR 引擎,用於讀取圖像類型並提取圖像中可用的細節。

安裝

藉助以下語法,我們可以使用 pip 安裝程序安裝 OpenCV 庫:

語法:


$ pip install opencv-python

為了安裝pytesserpact發動機,將遵循相同的程序。其語法如下所示:

語法:


$ pip install pytesseract

OpenCV 的特點

  1. 在下面的 Python 項目中,我們將利用 OpenCV 的以下特性來識別輸入圖像中的車牌:
  2. 高斯模糊:這裡,我們將使用高斯核進行圖像平滑。這種技術對於去除高斯噪聲非常有效。 OpenCV 為該任務提供了一個名為Gaussian bulr()的函數。
  3. 形態變換:這些是基於圖像形狀的運算,在二值圖像上進行處理。基本的形態學操作包括打開、關閉、侵蝕、擴張等等。 OpenCV 中提供的一些功能如下:
    1. cv2.erode()
    2. cv2 . exploit()
    3. cv2 .形態學()
  4. Sobel: 這裡,我們將根據圖像計算導數。這個特徵對於基於計算機視覺的各種任務來說是重要的。在這些導數的幫助下,我們可以計算梯度,梯度的較高變化表示圖像中值得注意的變化。 OpenCV 提供索貝爾()函數來計算索貝爾算子。
  5. 等高線:等高線是由所有強度相同的連續點組成的曲線。這些曲線對於物體的識別非常有用。 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 庫中的繪圖模塊為用戶顯示圖像。

  1. 圖像調整大小:我們可以藉助調整的大小,在水平和垂直方向將圖像文件的大小調整為 2 倍。
  2. 轉換為灰度:然後,我們可以將調整後的圖像文件轉換為灰度,以優化檢測並大幅減少圖像中可用的顏色數量,這將使我們能夠輕鬆檢測車牌。
  3. 圖像去噪:我們可以使用高斯模糊技術對圖像去噪。它使圖像的邊緣更加清晰和平滑,使字符更易讀。

讓我們考慮下面的例子來理解同樣的事情。

檔案: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-hk/n/283087.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 08:06
下一篇 2024-12-22 08:07

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29

發表回復

登錄後才能評論