文末获取完整源码+数据集+源码说明+配置跑通说明+配套论文+远程操作跑通程序等
效果展示
基于深度学习YOLOv8+PyQT5的电动车摩托车头盔佩戴检测系统(源码+跑通说明文件)
各文件说明
随着电动车的普及,交通安全问题日益凸显。头盔作为保护骑行者头部安全的重要装备,其佩戴情况的监测对于减少交通事故伤害具有重要意义。本文提出了一种基于YOLOv8(You Only Look Once version 8)的电动车头盔佩戴检测系统,旨在实时监测并提醒骑行者佩戴头盔。该系统利用深度学习技术,通过训练YOLOv8模型来识别电动车骑行者是否佩戴头盔,并在检测到未佩戴头盔的情况下发出警报。系统设计考虑了实时性、准确性和用户友好性,为提升电动车骑行安全提供了一种有效的技术解决方案。
电动车作为一种便捷的交通工具,在城市交通中扮演着越来越重要的角色。然而,由于缺乏必要的安全措施,电动车事故频发,尤其是头部伤害,往往导致严重后果。头盔的正确佩戴可以有效降低头部受伤的风险。因此,开发一种能够实时监测头盔佩戴情况的系统,对于提高骑行者的安全意识和减少交通事故具有重要作用。
YOLOv8是YOLO系列目标检测模型的最新版本,它在前代模型的基础上进行了优化,提高了检测速度和准确性。YOLOv8采用了多尺度特征图的融合、更精细的锚点框设计以及更有效的损失函数,使得模型在处理复杂场景时表现出色。
在许多非机动车交通事故中,未佩戴头盔是造成驾驶人受伤或死亡的主要原因,检测和惩处此类骑手对于降低道路交通事故严重性与保障人生命财产安全具有重要意义。随着深度学习和目标检测技术的发展,越来越多的基于深度学习的智能系统应用于交通识别的场景中,因此,本文研究并设计了基于深度学习的电动车头盔佩戴检测系统,该系统可以辅助交管部门对非机动车进行监管,具有一定的现实意义与实用价值。
本设计最终实现了基于YOLOv8的电动车头盔佩戴检测算法,该算法能够在实时性和准确性方面达到较高的水平。实验结果显示,YOLOv8模型将头盔佩戴类检测的均值平均精确度相较于YOLOv5提升至84.3%,精确率提升至83.5%。YOLOv8在小目标检测方面展现了明显优势,不仅提高了检测速度,也增强了检测效果,有助于提升电动车头盔佩戴检测效率,为交通系统提供更迅速、更可靠的服务。
数据集准备
本次电动车头盔佩戴数据集由MS COCO大型目标检测数据集和网络中收集的非机动车道交通情况的数据集组合而成,通过LabelImg软件对所有收集的图片进行标注,先标注为XML格式,再通过Python脚本转换为YOLO格式,并将其进行划分。处理完成的数据集一共有1164张图片用于训练,299张图片用于验证。其中检测的类别包含电动车及摩托车(two_wheeler)、佩戴头盔(helmet)和未佩戴头盔(without)三类。将处理过的数据集输入YOLO算法进行模型训练,数据集中的目标数量如图3.3左上角所示,其显示了各类别包含的样本数量;目标框的尺寸和数量如图3.3右上角所示,其展示了训练集中边界框的大小分布以及相应数量;目标框中心点相对于整幅图的位置坐标如图3.3左下角所示,其描述了边界框中心点在图像中的位置分布情况;数据集中目标相对于整幅图的高宽比例如图3.3右下角所示,其反映了训练集中目标高宽比例的分布状况。
每个类别的实例数量如图3.4所示。其中,电动车及摩托车(two_wheeler)类共有3604个,佩戴头盔(helmet)类共3087个,未佩戴头盔(without)类共1760个。具体而言,数据集中未佩戴头盔类的检测实例数量较少,导致类别不均衡,可以通过数据增强处理来改善此问题。另外,数据集中存在许多小目标,占比约为44.52%。在这种情况下,可以添加CBAM注意力机制以改进小目标检测效果。总之,在解决目标检测问题时,需要针对数据集中的具体情况进行相应的处理和优化,以提高模型的检测准确率和性能。
为了解决图3.4中的数据不均衡问题,本文选择采用数据增强方法以增加数据量。数据增强是一种预处理技术,可以通过微小的变换操作使神经网络将其视为全新的图片,从而减少过拟合并提高模型效果。本文采用了Mosaic-9数据增强方法,将9张图片随机缩放、翻转、调整色域等,然后拼接起来。在实际应用中,数据增强是一种简单有效的方法,可用于解决数据不足和数据不均衡等问题,提高模型的表现和泛化能力。如图3.5为没有采用Mosaic-9数据增强对数据集预处理的作为模型训练的输入,而如图3.6展示了Mosaic-9数据增强在本设计的数据集上预处理后作为模型训练的输入的效果图,可以看出其通过对原始的数据集进行随机切割拼接。
模型训练
使用准备好的数据集,对YOLOv8模型进行训练。训练过程中,需要调整学习率、批大小、训练周期等超参数,以获得最佳的检测效果。同时,可以采用数据增强技术,如随机裁剪、旋转、颜色变换等,以提高模型的泛化能力。
系统实现
PyQt5是一个用于创建图形用户界面(GUI)应用程序的跨平台工具集,它结合了Qt库的强大功能和Python的易用性,因此本设计选择PyQt5进行头盔佩戴检测系统桌面端可视化操作界面的开发,开发的桌面端可视化操作界面如图3.7所示。
该设计选择在深度学习模型所处的环境进行开发,首先是借助Qt Designer拖拽式放置控件进行界面设计。接着借助pyuic5工具将.ui文件转换为Python代码,以便在PyQt5应用程序中使用,经统计,共使用了11种不同类型的控件,数量最多的是QtWidgets.QLabel和QtWidgets.QLineEdit,各用了4个。最后,在PyQt5的Python代码中,加载.ui文件或转换后的Python代码,创建和管理控件实例,并编写相应的事件处理逻辑,如该设计中的图片、视频、摄像头加载和处理,检测对象的选择,检测目标置信度、位置坐标等信息的显示,以及检测结果的保存。与此同时,使用OpenCV库加载训练好的YOLO模型,并在模型推理后,对模型的输出进行解析,提取边界框、置信度和类别信息,在原始图像上绘制边界框和类别标签,并在相应输出窗口显示坐标信息等。
该电动车头盔佩戴检测系统基于PyQt5实现的逻辑如下,首先是加载UI布局文件Ui_MainWindow,并初始化应用程序的主窗口,设置按钮和下拉菜单的信号与槽,使得当用户进行操作时,程序能够响应并执行相应的函数,通过加载CSS文件来美化应用程序的界面;接着使用训练好的YOLO模型进行目标检测,检测结果包括目标的边界框、类别、置信度等信息,这些信息会显示在界面上的表格和图片预览区域。
用户可以通过“文件导入”区域的两个小图标分别选择图片检测和视频检测,检测流程如图3.8所示;通过模型推理后,具有检测框的检测结果将直接显示在左侧区域,而检测结果的信息则在“检测结果”区域输出,其中包括推理用时、目标数量、目标类型、置信度和目标坐标,而“目标选择”下拉框则可以选择要查看的目标对象,可以根据需要选择全部或者某个目标;在界面的左下方,则通过表格的形式清晰明了地输出检测的结果信息;界面右下方的“操作”区域的“保存”按钮可以将检测结果保存到本地,“退出”按钮则关闭该系统。
软件系统部分源码,其余详见文末
# -*- coding: utf-8 -*-
import time
from PyQt5.QtWidgets import QApplication , QMainWindow, QFileDialog, \
QMessageBox,QWidget,QHeaderView,QTableWidgetItem, QAbstractItemView
import sys
import os
from PIL import ImageFont
from ultralytics import YOLO
sys.path.append('UIProgram')
from UIProgram.UiMain import Ui_MainWindow
import sys
from PyQt5.QtCore import QTimer, Qt, QThread, pyqtSignal,QCoreApplication
import detect_tools as tools
import cv2
import Config
from UIProgram.QssLoader import QSSLoader
from UIProgram.precess_bar import ProgressBar
import numpy as np
# import torch
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(QMainWindow, self).__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.initMain()
self.signalconnect()
# 加载css渲染效果
style_file = 'UIProgram/style.css'
qssStyleSheet = QSSLoader.read_qss_file(style_file)
self.setStyleSheet(qssStyleSheet)
def signalconnect(self):
self.ui.PicBtn.clicked.connect(self.open_img)
self.ui.comboBox.activated.connect(self.combox_change)
self.ui.VideoBtn.clicked.connect(self.vedio_show)
self.ui.CapBtn.clicked.connect(self.camera_show)
self.ui.SaveBtn.clicked.connect(self.save_detect_video)
self.ui.ExitBtn.clicked.connect(QCoreApplication.quit)
self.ui.FilesBtn.clicked.connect(self.detact_batch_imgs)
def initMain(self):
self.show_width = 770
self.show_height = 480
self.org_path = None
self.is_camera_open = False
self.cap = None
# self.device = 0 if torch.cuda.is_available() else 'cpu'
# 加载检测模型
self.model = YOLO(Config.model_path, task='detect')
self.model(np.zeros((48, 48, 3))) #预先加载推理模型
self.fontC = ImageFont.truetype("Font/platech.ttf", 25, 0)