赞
踩
目录
智能车牌检测与识别系统结合了YOLOv8目标检测算法和PyQt5的图形用户界面,旨在实现对车辆图像中车牌的自动检测和识别。本文将详细介绍如何使用YOLOv8模型进行目标检测,并结合PyQt5实现用户友好的交互界面,搭建一个完整的智能车牌识别系统。
本系列其他文章
【YOLOv8系列】(一)YOLOv8介绍:实时目标检测的最新突破-CSDN博客
【YOLOv8系列】(二)YOLOv8环境配置,手把手嘴对嘴保姆教学-CSDN博客
【YOLOv8系列】(三)YOLOv8应用实践:从识别到分类再到分割的全方位视觉解决方案-CSDN博客
【YOLOv8系列】(四)YOLOv8使用自己的数据集进行模型训练,成就感满满-CSDN博客
采用的是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']
数据集的坐标标签等信息可以通过上述图片的命名规则读取出来,再写入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博客
- #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) # 训练模型
当模型训练完成,我们使用以下命令行预测
yolo task=detect mode=predict model=best.pt source=YOLODataset/images/val
结果如下所示:
可以看到可以成功识别到车牌并且置信度在90%左右,效果相当不错!!!
使用Qt designer进行ui界面设计,具体pycharm配置过程可以参考我这篇文章
PyCharm专业版配置PyQt5/QtDesigner/PyUic完整教程_pyuic5支持什么版本python-CSDN博客
大致界面如下所示:
包含tabelwidget、label、pushbutton、lineedit、groupbox等控件
我们需要实现的功能包括图片、视频检测以及最终的车牌文字识别
- def detectImage(self, imagePath):
- frame = cv2.imread(imagePath)
- results = self.model(frame)
- self.displayResults(frame, results)
效果如下所示:
图片检测
- 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)
效果如下所示:
文件夹检测
- 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()
效果如下所示:
视频检测
使用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构建一个智能车牌检测与识别系统。通过数据预处理、模型加载和用户界面设计,我们实现了一个完整的应用程序。希望这篇文章对你有所帮助!
如果以上内容对您有帮助,可以三连打赏订阅本专栏哦, 谢谢~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。