使用Python进行车牌识别
在接下来的教程中,我们将了解如何使用Python编程语言识别车牌号码。我们将使用 OpenCV 来识别车牌号码,并使用Python的 pytesseract 来提取车牌上的字符和数字。在本教程结束时,我们将构建一个自动识别车牌号码的Python程序。
了解自动车牌识别系统
自动车牌识别系统有各种各样的形状和大小:
- 在受控的光照条件下,可以使用简单的图像处理技术来识别特定类型的车牌。
- 更高级的车牌识别系统使用专用的目标检测器,如HOG +线性SVM、SSDs、YOLO和Faster R-CNN来定位图像中的车牌。
- 最先进的车牌识别软件使用递归神经网络(RNN)和长短期记忆网络(LSTM)来更好地识别车牌上的文本。
- 更高级的车牌识别系统利用专门的神经网络架构对图像进行预处理和清理,然后进行光学字符识别(OCR),从而提高车牌识别的准确性。
自动车牌识别更复杂的事实可能需要实时操作。
例如,让我们考虑一个安装在收费公路上的车牌识别系统。它必须能够检测每辆经过的车辆的车牌,识别车牌上的字符,然后将这些数据存储在数据库中,以便对车辆的所有者进行收费。
一些复杂因素使车牌识别变得非常具有挑战性,包括寻找我们可以用来训练自定义车牌识别模型的数据集。用于训练最先进模型的大型、健壮的车牌识别数据集通常是受到严密保护的,并且几乎从不公开发布:
- 这些数据集包含与车辆、驾驶员和位置相关的敏感识别细节。
- 车牌数据集的整理是繁琐的,需要巨大的时间投入和员工时间解释。
- 车牌识别的合同与地方和联邦政府的合同往往是非常合理的。通常不是训练好的模型有价值,而是所指定公司整理的数据集。
- 出于同样的原因,我们将看到车牌识别行业被收购的原因不是因为他们的车牌识别系统,而是因为数据本身。
项目前提条件
我们将使用Python的 OpenCV 库。它是一个开源的机器学习库,提供了计算机视觉的公共基础设施。我们还将使用 Pytesseract 进行该项目。 Pytesseract 是一个Tesseract-OCR引擎,用于读取图像类型和提取图像中可用的细节。
安装
我们可以使用pip安装程序以以下语法安装 OpenCV 库:
语法:
$ pip install opencv-python
为了安装 Pytesseract 引擎,将按照相同的步骤进行操作。以下是相同步骤的语法:
语法:
$ pip install pytesseract
OpenCV特性
- 在以下Python项目中,我们将利用以下OpenCV特性来识别输入图像中的车牌:
- 高斯模糊: 我们将使用高斯核对图像进行平滑处理。这种技术对于去除高斯噪音非常有效。OpenCV提供了一个名为GaussianBlur()的函数来执行此任务。
- 形态变换: 这些操作是基于图像形状的操作,适用于二进制图像。最基本的形态学操作包括开运算、闭运算、腐蚀、膨胀等。OpenCV提供的一些函数如下:
1. cv2.erode()
2. cv2.dilate()
3. cv2.morphologyEx() - 索贝尔: 这里我们将计算图像的导数。这个特性在基于计算机视觉的各种任务中非常重要。借助这些导数,我们可以计算梯度,而梯度的较大变化表示图像中的显著变化。OpenCV提供了一个Sobel()函数来计算Sobel算子。
- 轮廓: 轮廓是由相同强度的所有连续点组成的曲线。这些曲线对于对象的识别非常有用。OpenCV提供了findContours()函数来实现此特性。
理解Python代码
由于我们已经覆盖了项目的理论部分,让我们进入编码部分。我们将整个项目的源代码分为不同的步骤,以便更好地理解和清晰性。
步骤1:导入所需模块
首先,我们必须导入OpenCV和pytessaract,以及matplotlib、glob和OS。
文件:anpr.py
# importing the required modules
import pytesseract
import matplotlib.pyplot as plt
import cv2
import glob
import os
注意:文件名必须与车牌的精确数字相同。例如,如果车牌号码为“FTY348U”,则图像文件的名称将是“FTY348U.jpg”。
步骤2:使用Tesseract引擎对车牌进行OCR识别
在下一步中,我们将使用Tesseract引擎对车牌进行OCR识别。以下是代码片段中的观察结果。
文件:anpr.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)
解释:
在上面的代码片段中,我们使用 OS 模块指定了车牌图片文件的路径。我们还定义了两个空列表 NP_list 和 predicted_NP 。然后,我们使用 append() 函数将实际车牌添加到列表中。然后,我们使用OpenCV模块读取每个车牌图片文件并将它们存储在 NP_img 变量中。然后,我们使用Python库封装器将每个车牌图片文件传递给Tesseract OCR引擎。然后,我们得到车牌的 predicted_res ,将其添加到列表中并与真实的车牌进行比较。
现在,由于我们已经预测出了车牌,但是我们不知道这个预测结果。所以,为了查看数据和预测结果,我们将进行一些可视化操作,如下所示。我们还将在没有任何核心功能的帮助下估计预测的准确度。
文件:anpr.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循环 来遍历原始车牌列表和预测的车牌列表,并检查它们是否匹配。我们还根据车牌号码的长度来检查准确率,以获得更好和适当的结果。
我们可以观察到,Tesseract OCR引擎基本上以100%的准确率预测所有车牌。但是,Tesseract OCR引擎在一些车牌上的预测错误,我们将对这些车牌文件应用图像处理技术,并再次将它们传递给Tesseract OCR。我们可以通过应用图像处理技术提高Tesseract引擎对预测错误的车牌的准确率。
步骤3:图像处理技术
让我们来看下面的代码段,以了解图像处理技术。
文件:anpr.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库中导入了image模块,并使用for循环从指定的文件夹中提取了图像。然后,我们使用imread()函数读取提取的图像。接下来,我们使用了matplotlib库的plot模块来显示图像给用户。
- 图像调整大小: 我们可以使用resize来将图像文件在水平和垂直方向上都放大2倍。
- 转换为灰度图: 然后,我们可以将调整大小的图像文件转换为灰度图,以优化检测并大幅减少图像中可用颜色的数量,这将使我们能够轻松地检测到车牌。
- 去噪图像: 我们可以使用高斯模糊技术对图像进行去噪处理。它使图像的边缘更清晰、更平滑,使字符更易读。
让我们考虑以下示例以了解更多信息。
文件:anpr.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引擎,并查看预测结果。
以下代码片段中也可以观察到相同的内容。
文件:anpy.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%。因此,车牌识别模型已经准备好。