【YOLOv8系列】(五)毕设实战:YOLOv8+Pyqt5实现智能车牌检测与识别系统

目录

一.数据集获取

1.数据集下载及规则

2. 数据集处理

二.模型训练

1.模型训练

2.模型预测 

三.ui界面设计

四.功能实现

1.图片检测

2.文件夹检测

3.视频检测

4.车牌识别

五.总结


智能车牌检测与识别系统结合了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 recognitionicon-default.png?t=N7T8https://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构建一个智能车牌检测与识别系统。通过数据预处理、模型加载和用户界面设计,我们实现了一个完整的应用程序。希望这篇文章对你有所帮助!

如果以上内容对您有帮助,可以三连打赏订阅本专栏哦, 谢谢~

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

到点就困告

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值