目录
智能车牌检测与识别系统结合了YOLOv8目标检测算法和PyQt5的图形用户界面,旨在实现对车辆图像中车牌的自动检测和识别。本文将详细介绍如何使用YOLOv8模型进行目标检测,并结合PyQt5实现用户友好的交互界面,搭建一个完整的智能车牌识别系统。
本系列其他文章
【YOLOv8系列】(一)YOLOv8介绍:实时目标检测的最新突破-CSDN博客
【YOLOv8系列】(二)YOLOv8环境配置,手把手嘴对嘴保姆教学-CSDN博客
【YOLOv8系列】(三)YOLOv8应用实践:从识别到分类再到分割的全方位视觉解决方案-CSDN博客
【YOLOv8系列】(四)YOLOv8使用自己的数据集进行模型训练,成就感满满-CSDN博客
一.数据集获取
1.数据集下载及规则
采用的是CCPD车牌数据集,以下为GitHub项目地址。
GitHub - detectRecog/CCPD: [ECCV 2018] CCPD: a diverse and well-annotated dataset for license plate detection and recognitionhttps://github.com/detectRecog/CCPDCCPD牌数据集是采集人员在合肥停车场采集、手工标注得来,采集时间在早7:30到晚10:00之间。且拍摄车牌照片的环境复杂多变,包括雨天、雪天、倾斜、模糊等。CCPD数据集包含将近30万张图片、图片尺寸为720x1160x3,共包含8种类型图片。
在CCPD数据集中,每张图片仅包含一张车牌,车牌的车牌省份主要为皖。CCPD中的每幅图像都包含大量的标注信息,但是CCPD数据集没有专门的标注文件,每张图像的文件名就是该图像对应的数据标注。
规则如下:
图片命名:“025-95_113-154&383_386&473-386&473_177&454_154&383_363&402-0_0_22_27_27_33_16-37-15.jpg”
每个名称可以拆分为七个字段。这些字段的解释如下:
面积:025——车牌面积与整个画面面积的面积比
倾斜度:95_113——水平倾斜度和垂直倾斜度
边界框坐标:154&383_386&473——左上顶点和右下顶点的坐标
四个顶点位置:386&473_177&454_154&383_363&402——整个图像中车牌的四个顶点的精确(x, y)坐标。这些坐标从右下角的顶点开始。
车牌号:CCPD 中的每张图片只有一个 车牌。每个 车牌编号由一个汉字、一个字母和五个字母或数字组成。有效的中文车牌由七个字符组成:省(1 个字符)、市(1 个字符)、字母+数字(5 个字符)。“0_0_22_27_27_33_16”是每个字符的索引。这三个数组定义如下。每个数组的最后一个字符是字母 O,而不是数字 0。我们用O作为“无汉字”的标志,因为中文车牌字符中没有O。
provinces = ["皖", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "京", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "桂", "琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新", "警", "学", "O"] alphabets = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'O'] ads = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'O']
2. 数据集处理
数据集的坐标标签等信息可以通过上述图片的命名规则读取出来,再写入txt文件中即可。代码如下:
import shutil
import cv2
import os
def convert(input_path, ouput_path):
for filename in os.listdir(input_path)
list_1 = filename.split("-", 3) # 第一次分割,以减号'-'做分割
coordinates = list1[2]
list_2 = filename.split(".", 1)
suffix = list2[1]
if suffix == 'txt':
continue
lt, rb = coordinates.split("_", 1) # 第二次分割,以下划线'_'做分割
lx, ly = lt.split("&", 1)
rx, ry = rb.split("&", 1)
width = int(rx) - int(lx)
height = int(ry) - int(ly) # bounding box的宽和高
cx = float(lx) + width / 2
cy = float(ly) + height / 2 # bounding box中心点
img = cv2.imread(input_path + filename)
if img is None: # 自动删除失效图片(下载过程有的图片会存在无法读取的情况)
print(input_path+ filename)
os.remove(input_path+ filename)
continue
width = width / img.shape[1]
height = height / img.shape[0]
cx = cx / img.shape[1]
cy = cy / img.shape[0]
txt_name = filename.split(".", 1)
txt_file = output_path + txt_name[0] + ".txt"
# 绿牌是第0类,蓝牌是第1类
with open(txt_file, "w") as f:
f.write(str(0) + " " + str(cx) + " " + str(cy) + " " + str(width) + " " + str(height))
if __name__ == '__main__':
# 图片存储地址
train_Dir = r"xxx"
valid_Dir = r"xxx"
test_Dir = r"xxx"
# txt存储地址
train_txt_path = r"xxx"
val_txt_path = r"xxx"
test_txt_path = r"xxx"
convert(train_Dir, train_txt_path)
convert(valid_Dir, val_txt_path)
convert(test_Dir, test_txt_path)
运行之后,按照以下结构保存PlateDataset
其中 data.ymal内容如下所示
二.模型训练
这一过程我就不多加叙述,详细可以看本专栏第四篇文章
【YOLOv8系列】(四)YOLOv8使用自己的数据集进行模型训练,成就感满满-CSDN博客
1.模型训练
#coding:utf-8
from ultralytics import YOLO
# 加载预训练模型
model = YOLO("yolov8n.pt")
# Use the model
if __name__ == '__main__':
# Use the model
results = model.train(data='/PlateData/data.yaml', epochs=300, batch=4) # 训练模型
2.模型预测
当模型训练完成,我们使用以下命令行预测
yolo task=detect mode=predict model=best.pt source=YOLODataset/images/val
结果如下所示:
可以看到可以成功识别到车牌并且置信度在90%左右,效果相当不错!!!
三.ui界面设计
使用Qt designer进行ui界面设计,具体pycharm配置过程可以参考我这篇文章
PyCharm专业版配置PyQt5/QtDesigner/PyUic完整教程_pyuic5支持什么版本python-CSDN博客
大致界面如下所示:
包含tabelwidget、label、pushbutton、lineedit、groupbox等控件
四.功能实现
我们需要实现的功能包括图片、视频检测以及最终的车牌文字识别
1.图片检测
def detectImage(self, imagePath):
frame = cv2.imread(imagePath)
results = self.model(frame)
self.displayResults(frame, results)
效果如下所示:
图片检测
2.文件夹检测
def detect_folder(self):
image_extensions = ('.png', '.jpg', '.jpeg', '.gif', '.bmp', '.tiff')
image_paths = [os.path.join(self.source, f) for f in os.listdir(self.source) if
f.lower().endswith(image_extensions)]
for image_path in image_paths:
image = cv2.imread(image_path)
results = self.model(frame)
self.displayResults(frame, results)
效果如下所示:
文件夹检测
3.视频检测
def detectVideo(self):
ret, frame = self.cap.read()
if ret:
results = self.model(frame)
self.displayResults(frame, results)
else:
self.timer.stop()
self.cap.release()
效果如下所示:
视频检测
4.车牌识别
使用paddleocr进行文字识别
pip install paddlepaddle
pip install paddleocr
定义车牌文字识别函数
def ocr(img):
cls_model_dir = 'ch_ppocr_mobile_v2.0_cls_infer'
rec_model_dir = 'pch_PP-OCRv4_rec_infer'
ocr = PaddleOCR(use_angle_cls=False, lang="ch", det=False, cls_model_dir=cls_model_dir,
rec_model_dir=rec_model_dir)
result = ocr.ocr(img, cls=True)
return result
五.总结
本文展示了如何结合YOLOv8与PyQt5构建一个智能车牌检测与识别系统。通过数据预处理、模型加载和用户界面设计,我们实现了一个完整的应用程序。希望这篇文章对你有所帮助!
如果以上内容对您有帮助,可以三连打赏订阅本专栏哦, 谢谢~