前言

每年毕设季,很多计算机、人工智能相关专业的同学都会在选题和落地阶段踩坑:想做计算机视觉方向却找不到完整可运行的项目,网上零散的开源代码要么环境依赖混乱跑不通,要么只有算法模型没有可视化界面,达不到毕设答辩的要求。本文分享一个完整可落地的摩托车头盔佩戴检测系统,基于YOLOv8实现目标检测,搭配PyQt5开发桌面交互界面,支持图片、视频、摄像头实时检测与结果保存,非常适合用作本科毕业设计或课程设计项目。

一、项目概述与技术栈

本系统是一款面向交通监管场景的桌面端智能检测工具,依托深度学习目标检测技术,可自动识别图像与视频中的摩托车、骑手头盔佩戴状态,输出检测框、类别、置信度与位置坐标,辅助完成非机动车头盔佩戴合规性检测。

核心功能

  • 单张图片头盔佩戴检测与结果可视化

  • 本地视频逐帧检测与实时预览

  • 摄像头实时流检测,适配实时监控场景

  • 批量图片自动检测与结果批量保存

  • 检测目标信息详情展示与数据导出

完整技术栈

技术分类

技术选型

版本说明

开发语言

Python

3.9

目标检测框架

Ultralytics YOLOv8

8.0.199

深度学习框架

PyTorch

2.2.1

GUI界面框架

PyQt5

5.15.2

图像处理库

OpenCV

4.8.1.78

数据标注工具

LabelImg

1.8.6

数值计算库

NumPy

1.26.1

项目优势

  1. 检测精度高:头盔佩戴类mAP@0.5可达84.3%,小目标检测效果优于YOLOv5

  2. 交互友好:PyQt5开发的桌面界面,操作直观,支持结果表格化展示

  3. 功能完整:覆盖图片/视频/摄像头/批量检测全场景,支持结果保存

  4. 二次开发便捷:代码结构清晰,可快速替换数据集适配其他目标检测场景

二、系统整体架构与核心流程

系统采用分层架构设计,自下而上分为数据层、模型推理层、交互应用层三层,各模块职责清晰、低耦合,便于后续功能扩展与维护。

  1. 数据层:负责数据集构建、标注格式转换、数据增强与数据集划分,为模型训练提供高质量数据支撑;同时负责输入图像、视频的读取与预处理。

  2. 模型推理层:系统核心层,基于YOLOv8算法构建检测模型,融合CBAM注意力机制优化小目标检测效果,完成特征提取、目标分类与边界框回归,输出检测结果。

  3. 交互应用层:基于PyQt5实现桌面可视化界面,负责接收用户操作指令、调用检测模型、渲染检测结果、展示目标详情与数据表格,同时提供结果保存功能。

核心检测执行流程

用户触发检测指令后,系统按以下流水线执行:

  1. 读取输入源(图片/视频帧/摄像头画面)并进行尺寸归一化预处理

  2. 调用训练好的YOLOv8模型执行前向推理,输出原始预测结果

  3. 执行非极大值抑制(NMS)去除冗余检测框,过滤低置信度结果

  4. 解析检测目标的类别、置信度、坐标信息

  5. 在原图上绘制检测框与类别标签,同时将详情写入界面表格

  6. 支持用户选择查看单个目标详情与保存检测结果

三、核心功能实现(附核心代码)

3.1 YOLOv8检测模块核心实现

检测模块基于Ultralytics库封装,支持单图、视频帧、批量图片等多种输入格式,统一输出标准化的检测结果供界面层调用。

from ultralytics import YOLO
import cv2
import time
import numpy as np

class HelmetDetector:
    def __init__(self, model_path):
        # 加载预训练好的头盔检测模型
        self.model = YOLO(model_path, task='detect')
        # 模型预热,降低首次推理延迟
        self.model(np.zeros((640, 640, 3)))
    
    def detect_image(self, img_path):
        """
        单张图片检测
        :param img_path: 图片路径
        :return: 检测结果对象、带检测框的图像、耗时
        """
        start_time = time.time()
        # 执行模型推理
        results = self.model(img_path)[0]
        cost_time = time.time() - start_time
        
        # 绘制检测结果图
        result_img = results.plot()
        return results, result_img, cost_time
    
    def parse_results(self, results):
        """
        解析检测结果,提取坐标、类别、置信度
        :param results: 模型推理结果
        :return: 坐标列表、类别列表、置信度列表
        """
        # 提取边界框坐标,转换为整数
        xyxy_list = [list(map(int, box)) for box in results.boxes.xyxy.tolist()]
        # 提取类别索引
        cls_list = [int(cls) for cls in results.boxes.cls.tolist()]
        # 提取置信度,格式化为百分比
        conf_list = ['%.2f %%' % (conf * 100) for conf in results.boxes.conf.tolist()]
        return xyxy_list, cls_list, conf_list

3.2 PyQt5主界面核心逻辑

主界面采用信号与槽机制绑定用户操作,使用定时器实现视频与摄像头流的逐帧刷新,通过自定义线程处理视频保存等耗时任务,避免界面卡顿。

from PyQt5.QtWidgets import QMainWindow, QFileDialog
from PyQt5.QtCore import QTimer, Qt
import cv2
from detector import HelmetDetector
from ui_main import Ui_MainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 加载UI布局
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        
        # 初始化检测模型
        self.detector = HelmetDetector("./weights/best.pt")
        # 显示区域尺寸
        self.show_width = 770
        self.show_height = 480
        
        # 视频/摄像头定时器
        self.frame_timer = QTimer()
        self.frame_timer.timeout.connect(self.update_frame)
        
        # 绑定按钮事件
        self.bind_signals()
    
    def bind_signals(self):
        """绑定所有控件信号与槽函数"""
        self.ui.btn_image.clicked.connect(self.open_image_detect)
        self.ui.btn_video.clicked.connect(self.open_video_detect)
        self.ui.btn_camera.clicked.connect(self.toggle_camera)
        self.ui.btn_save.clicked.connect(self.save_result)
    
    def open_image_detect(self):
        """单张图片检测槽函数"""
        file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "./", "Images (*.jpg *.png)")
        if not file_path:
            return
        
        # 执行检测
        results, result_img, cost_time = self.detector.detect_image(file_path)
        xyxy_list, cls_list, conf_list = self.detector.parse_results(results)
        
        # 缩放图片适配显示区域
        resized_img = self.resize_image(result_img)
        # 转换为Qt可显示格式并渲染
        self.ui.label_show.setPixmap(cvimg_to_qpixmap(resized_img))
        # 更新检测信息
        self.ui.label_time.setText(f"{cost_time:.3f} s")
        self.ui.label_count.setText(str(len(cls_list)))
        # 更新结果表格
        self.update_table(xyxy_list, cls_list, conf_list, file_path)

四、系统界面与功能展示

系统主界面采用左右布局,左侧为检测结果预览区,右侧为操作控制与信息展示区,整体风格简洁直观,符合桌面软件使用习惯。

核心功能操作

  1. 图片检测:点击图片检测按钮选择本地图片,自动执行检测并在左侧显示带框结果,右侧展示检测耗时、目标总数,下拉框可切换查看单个目标的详细坐标与置信度,底部表格同步所有检测目标数据。

  2. 视频检测:选择本地视频文件后,系统逐帧读取并实时检测,画面流畅无卡顿,支持随时查看当前帧的检测详情。

  3. 摄像头实时检测:一键调用本地摄像头,实现实时头盔佩戴检测,适配现场监控、临时抽检等场景。

  4. 批量检测与保存:支持选择图片文件夹批量检测,自动保存所有检测结果图片到本地,无需手动逐张操作。

对应的系统全功能操作演示、部署步骤实拍视频,我也同步更新在了 B 站账号 兵慌码乱,想看动态运行效果、跟着视频一步步部署的同学,可以自行搜索查看。

五、本地部署与运行步骤

环境要求

  • 操作系统:Windows 10/11(推荐)、Linux、macOS

  • Python版本:3.8 ~ 3.10

  • 可选:NVIDIA显卡 + CUDA环境,可大幅提升训练与推理速度

分步部署流程

  1. 创建并激活虚拟环境

conda create -n helmet_det python=3.9
conda activate helmet_det
  1. 安装项目依赖

pip install torch==2.2.1 torchvision==0.17.1
pip install ultralytics==8.0.199
pip install PyQt5==5.15.2 opencv-python==4.8.1.78
pip install numpy pandas matplotlib
  1. 准备模型权重 将训练好的best.pt权重文件放入weights目录,或直接使用官方YOLOv8权重自行训练。

  2. 启动系统

python main.py

启动后即可打开桌面界面,选择图片/视频/摄像头进行检测。

六、项目总结与扩展方向

项目总结

本系统完整实现了从数据集构建、模型训练到桌面可视化界面开发的全流程,基于YOLOv8算法优化了小目标检测效果,头盔佩戴检测mAP@0.5达到84.3%,相比YOLOv5有显著提升;PyQt5界面功能完整、操作直观,覆盖了绝大多数检测使用场景,整体完成度高,非常适合作为计算机视觉方向的毕设或课程设计项目。

扩展方向

  1. 算法优化:引入视觉Transformer模块进一步提升小目标与模糊目标检测精度,轻量化模型适配边缘设备部署

  2. 功能扩展:增加车牌识别模块,关联未佩戴头盔的车辆信息;加入违规记录数据库,实现数据统计与溯源

  3. 部署升级:打包为可执行文件,适配无Python环境的电脑使用;开发Web端版本,支持多端访问

  4. 场景拓展:适配更多非机动车类型,扩展为完整的非机动车交通违规检测系统

文末总结

完整的全量源码、配套资料已整理完毕,开箱即用,适合直接用作毕设或课程设计;对应的项目实操演示视频,可在 B 站搜索 兵慌码乱 查看。需要完整版本的同学,可以留意我的主页简介信息。

更多推荐