当前位置:   article > 正文

【YOLOv8系列】(五)毕设实战:YOLOv8+Pyqt5实现智能车牌检测与识别系统_python怎么使用yolov8识别图片

python怎么使用yolov8识别图片

目录

一.数据集获取

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。

    1. provinces = ["皖", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "京", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "桂", "琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新", "警", "学", "O"]
    2. alphabets = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
    3. 'X', 'Y', 'Z', 'O']
    4. ads = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
    5. 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'O']

2. 数据集处理

数据集的坐标标签等信息可以通过上述图片的命名规则读取出来,再写入txt文件中即可。代码如下:

  1. import shutil
  2. import cv2
  3. import os
  4. def convert(input_path, ouput_path):
  5. for filename in os.listdir(input_path)
  6. list_1 = filename.split("-", 3) # 第一次分割,以减号'-'做分割
  7. coordinates = list1[2]
  8. list_2 = filename.split(".", 1)
  9. suffix = list2[1]
  10. if suffix == 'txt':
  11. continue
  12. lt, rb = coordinates.split("_", 1) # 第二次分割,以下划线'_'做分割
  13. lx, ly = lt.split("&", 1)
  14. rx, ry = rb.split("&", 1)
  15. width = int(rx) - int(lx)
  16. height = int(ry) - int(ly) # bounding box的宽和高
  17. cx = float(lx) + width / 2
  18. cy = float(ly) + height / 2 # bounding box中心点
  19. img = cv2.imread(input_path + filename)
  20. if img is None: # 自动删除失效图片(下载过程有的图片会存在无法读取的情况)
  21. print(input_path+ filename)
  22. os.remove(input_path+ filename)
  23. continue
  24. width = width / img.shape[1]
  25. height = height / img.shape[0]
  26. cx = cx / img.shape[1]
  27. cy = cy / img.shape[0]
  28. txt_name = filename.split(".", 1)
  29. txt_file = output_path + txt_name[0] + ".txt"
  30. # 绿牌是第0类,蓝牌是第1
  31. with open(txt_file, "w") as f:
  32. f.write(str(0) + " " + str(cx) + " " + str(cy) + " " + str(width) + " " + str(height))
  33. if __name__ == '__main__':
  34. # 图片存储地址
  35. train_Dir = r"xxx"
  36. valid_Dir = r"xxx"
  37. test_Dir = r"xxx"
  38. # txt存储地址
  39. train_txt_path = r"xxx"
  40. val_txt_path = r"xxx"
  41. test_txt_path = r"xxx"
  42. convert(train_Dir, train_txt_path)
  43. convert(valid_Dir, val_txt_path)
  44. convert(test_Dir, test_txt_path)

运行之后,按照以下结构保存PlateDataset

其中 data.ymal内容如下所示

二.模型训练

这一过程我就不多加叙述,详细可以看本专栏第四篇文章

【YOLOv8系列】(四)YOLOv8使用自己的数据集进行模型训练,成就感满满-CSDN博客

1.模型训练

  1. #coding:utf-8
  2. from ultralytics import YOLO
  3. # 加载预训练模型
  4. model = YOLO("yolov8n.pt")
  5. # Use the model
  6. if __name__ == '__main__':
  7. # Use the model
  8. 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.图片检测

  1. def detectImage(self, imagePath):
  2. frame = cv2.imread(imagePath)
  3. results = self.model(frame)
  4. self.displayResults(frame, results)

效果如下所示:

图片检测

2.文件夹检测

  1. def detect_folder(self):
  2. image_extensions = ('.png', '.jpg', '.jpeg', '.gif', '.bmp', '.tiff')
  3. image_paths = [os.path.join(self.source, f) for f in os.listdir(self.source) if
  4. f.lower().endswith(image_extensions)]
  5. for image_path in image_paths:
  6. image = cv2.imread(image_path)
  7. results = self.model(frame)
  8. self.displayResults(frame, results)

效果如下所示:

文件夹检测

3.视频检测

  1. def detectVideo(self):
  2. ret, frame = self.cap.read()
  3. if ret:
  4. results = self.model(frame)
  5. self.displayResults(frame, results)
  6. else:
  7. self.timer.stop()
  8. self.cap.release()

效果如下所示:

视频检测

4.车牌识别

使用paddleocr进行文字识别

  1. pip install paddlepaddle
  2. pip install paddleocr

定义车牌文字识别函数 

  1. def ocr(img):
  2. cls_model_dir = 'ch_ppocr_mobile_v2.0_cls_infer'
  3. rec_model_dir = 'pch_PP-OCRv4_rec_infer'
  4. ocr = PaddleOCR(use_angle_cls=False, lang="ch", det=False, cls_model_dir=cls_model_dir,
  5. rec_model_dir=rec_model_dir)
  6. result = ocr.ocr(img, cls=True)
  7. return result

五.总结

本文展示了如何结合YOLOv8与PyQt5构建一个智能车牌检测与识别系统。通过数据预处理、模型加载和用户界面设计,我们实现了一个完整的应用程序。希望这篇文章对你有所帮助!

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/897628
推荐阅读
相关标签
  

闽ICP备14008679号