基于深度学习YOLOv8+Pyqt5的抽烟吸烟检测识别系统设计

文末获取完整源码+数据集+源码说明+配置跑通说明+远程操作跑通程序等

在这里插入图片描述
在这里插入图片描述


功能效果展示

基于深度学YOLOv8+PyQt5的抽烟吸烟检测识别系统(完整源码+跑通说明文件)

在这里插入图片描述
在这里插入图片描述


各文件说明

在这里插入图片描述


配置跑通说明

在这里插入图片描述

在这里插入图片描述


模型评价指标

精确度(Precision):这个指标告诉你,系统检测到的对象中,有多少是真正存在的。就像你在一个果园里找苹果,精确度就是你能正确找到的苹果数占你找到的所有“苹果”的比例。

召回率(Recall):这个指标衡量的是,所有真实存在的对象中,有多少被系统正确检测到了。继续果园的例子,召回率就是所有真实苹果中,你找到的苹果所占的比例。

F1分数(F1 Score):这是一个综合考虑精确度和召回率的指标。如果一个系统既有很高的精确度也有很高的召回率,那么它的F1分数就会很高。这就像是你既找到了很多苹果,又确保了几乎所有的苹果都被你找到了。

平均精度(Average Precision, AP):这个指标衡量的是,在不同的置信度阈值下,精确度和召回率的平均表现。置信度可以理解为系统对检测到的对象存在的把握程度。AP越高,表示系统在不同置信度下的表现越稳定。

mAP(Mean Average Precision):这是在多个类别上计算AP后的平均值。如果一个系统需要检测多种类型的对象,比如猫、狗、鸟等,mAP就是这些类别AP值的平均,它提供了一个整体的性能评价。

速度(Speed):虽然不是直接的评价指标,但速度对于实时对象检测系统非常重要。YOLO系列的一个优点就是它的速度非常快,可以在视频流中实时检测对象,而不会有明显的延迟。

模型大小(Model Size):这个指标衡量的是模型的文件大小。在资源有限的设备上,如手机或嵌入式系统,模型大小是一个重要的考虑因素。

泛化能力(Generalization):这个指标衡量的是模型在未见过的数据上的表现。一个好的对象检测系统应该能够在多种环境和条件下都能稳定地工作。

这些指标通常在研究论文或技术报告中被用来比较不同的对象检测系统。在实际应用中,根据具体需求,可能会更关注某些指标。例如,对于需要实时反馈的应用,速度可能比精确度更重要。而对于安全监控系统,精确度和召回率可能更为关键。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在现代社会,公共场所的禁烟政策越来越严格,以减少二手烟对非吸烟者的影响。然而,监管和执行这些政策仍然面临挑战。本文提出了一种基于YOLOv8(You Only Look Once version 8)的抽烟检测系统,该系统结合了深度学习技术和PyQt5图形用户界面框架,旨在实时监测并识别公共场所中的吸烟行为。该系统的设计考虑了实时性、准确性和用户友好性,为提高公共场所的空气质量和遵守禁烟规定提供了技术支持。

抽烟检测系统的设计和实现

系统设计
数据集准备
为了训练YOLOv8模型,首先需要收集和标注一个包含各种吸烟行为的图像数据集。这个数据集应该包含不同背景、多种吸烟姿势、以及各种类型的香烟。图像标注需要明确指出吸烟者的位置和吸烟动作,以便模型学习识别吸烟行为。

模型训练
使用准备好的数据集,对YOLOv8模型进行训练。在训练过程中,需要调整学习率、批大小、训练周期等超参数,以优化检测效果。同时,可以采用数据增强技术,如随机裁剪、旋转、颜色变换等,以增强模型对不同场景的适应能力。

系统实现
系统的核心是YOLOv8模型,它负责从输入的实时视频流中检测吸烟行为。系统还包括一个基于PyQt5的用户界面,用于显示检测结果和发出警报。当模型检测到吸烟行为时,系统会通过声音或视觉信号提醒管理人员。

实时检测
为了实现实时检测,系统需要能够在低延迟的情况下处理视频流。这要求模型不仅要准确,还要高效。在实际部署中,可能需要在边缘设备上进行模型推理,以减少对中心服务器的依赖。

结果与讨论
在测试集上,YOLOv8模型展现出了较高的吸烟行为检测准确率。在不同的环境和光照条件下,模型都能稳定地识别吸烟者。然而,模型在处理遮挡严重或吸烟者与背景颜色相近的情况下仍有改进空间。

结论
本文提出的基于YOLOv8和PyQt5的抽烟检测系统,能够有效地辅助公共场所的禁烟管理。通过实时监测和提醒,该系统有助于提高禁烟规定的执行力度,保护非吸烟者免受二手烟的危害。未来的工作将集中在进一步提高模型的鲁棒性,以及探索更高效的模型部署和集成方案。


部分PyQt5可视化代码

# -*- 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.ui.tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.Fixed)
        self.ui.tableWidget.verticalHeader().setDefaultSectionSize(40)
        self.ui.tableWidget.setColumnWidth(0, 80)  # 设置列宽
        self.ui.tableWidget.setColumnWidth(1, 200)
        self.ui.tableWidget.setColumnWidth(2, 150)
        self.ui.tableWidget.setColumnWidth(3, 90)
        self.ui.tableWidget.setColumnWidth(4, 230)
        # self.ui.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)  # 表格铺满
        # self.ui.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Interactive)
        # self.ui.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)  # 设置表格不可编辑
        self.ui.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)  # 设置表格整行选中
        self.ui.tableWidget.verticalHeader().setVisible(False)  # 隐藏列标题
        self.ui.tableWidget.setAlternatingRowColors(True)  # 表格背景交替

        # 设置主页背景图片border-image: url(:/icons/ui_imgs/icons/camera.png)
        # self.setStyleSheet("#MainWindow{background-image:url(:/bgs/ui_imgs/bg3.jpg)}")

    def open_img(self):
        if self.cap:
            # 打开图片前关闭摄像头
            self.video_stop()
            self.is_camera_open = False
            self.ui.CaplineEdit.setText('摄像头未开启')
            self.cap = None

        # 弹出的窗口名称:'打开图片'
        # 默认打开的目录:'./'
        # 只能打开.jpg与.gif结尾的图片文件
        # file_path, _ = QFileDialog.getOpenFileName(self.ui.centralwidget, '打开图片', './', "Image files (*.jpg *.gif)")
        file_path, _ = QFileDialog.getOpenFileName(None, '打开图片', './', "Image files (*.jpg *.jepg *.png)")
        if not file_path:
            return

        self.ui.comboBox.setDisabled(False)
        self.org_path = file_path
        self.org_img = tools.img_cvread(self.org_path)

        # 目标检测
        t1 = time.time()
        self.results = self.model(self.org_path)[0]
        t2 = time.time()
        take_time_str = '{:.3f} s'.format(t2 - t1)
        self.ui.time_lb.setText(take_time_str)

        location_list = self.results.boxes.xyxy.tolist()
        self.location_list = [list(map(int, e)) for e in location_list]
        cls_list = self.results.boxes.cls.tolist()
        self.cls_list = [int(i) for i in cls_list]
        self.conf_list = self.results.boxes.conf.tolist()
        self.conf_list = ['%.2f %%' % (each*100) for each in self.conf_list]

        # now_img = self.cv_img.copy()
        # for loacation, type_id, conf in zip(self.location_list, self.cls_list, self.conf_list):
        #     type_id = int(type_id)
        #     color = self.colors(int(type_id), True)
        #     # cv2.rectangle(now_img, (int(x1), int(y1)), (int(x2), int(y2)), colors(int(type_id), True), 3)
        #     now_img = tools.drawRectBox(now_img, loacation, Config.CH_names[type_id], self.fontC, color)
        now_img = self.results.plot()
        self.draw_img = now_img
        # 获取缩放后的图片尺寸
        self.img_width, self.img_height = self.get_resize_size(now_img)
        resize_cvimg = cv2.resize(now_img,(self.img_width, self.img_height))
        pix_img = tools.cvimg_to_qpiximg(resize_cvimg)
        self.ui.label_show.setPixmap(pix_img)
        self.ui.label_show.setAlignment(Qt.AlignCenter)
        # 设置路径显示
        self.ui.PiclineEdit.setText(self.org_path)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

点击下方小卡片,那边对话框发送“资源”两个字

获取完整源码+数据集+源码说明+配置跑通说明+远程操作跑通程序等

【使用教程】 一、环境配置 1、建议下载anaconda和pycharm 在anaconda中配置好环境,然后直接导入到pycharm中,在pycharm中运行项目 anaconda和pycharm安装及环境配置参考网上博客,有很多博主介绍 2、在anacodna中安装requirements.txt中的软件包 命令为:pip install -r requirements.txt 或者改成清华源后再执行以上命令,这样安装要快一些 软件包都安装成功后才算成功 3、安装好软件包后,把anaconda中对应的python导入到pycharm中即可(不难,参考网上博客) 二、环境配置好后,开始训练(也可以训练自己数据集) 1、数据集准备 需要准备yolo格式的目标检测数据集,如果不清楚yolo数据集格式,或者有其他数据训练需求,请看博主yolo格式各种数据集集合链接:https://blog.csdn.net/DeepLearning_/article/details/127276492 里面涵盖了上百种yolo数据集,且在不断更新,基本都是实际项目使用。来自于网上收集、实际场景采集制作等,自己使用labelimg标注工具标注的。数据集质量绝对有保证! 本项目所使用的数据集,见csdn该资源下载页面中的介绍栏,里面有对应的下载链接,下载后可直接使用。 2、数据准备好,开始修改配置文件 参考代码中data文件夹下的banana_ripe.yaml,可以自己新建一个不同名称的yaml文件 train:训练集的图片路径 val:验证集的图片路径 names: 0: very-ripe 类别1 1: immature 类别2 2: mid-ripe 类别3 格式按照banana_ripe.yaml照葫芦画瓢就行,不需要过多参考网上的 3、修改train_dual.py中的配置参数,开始训练模型 方式一: 修改点: a.--weights参数,填入'yolov9-s.pt',博主训练的是yolov9-s,根据自己需求可自定义 b.--cfg参数,填入 models/detect/yolov9-c.yaml c.--data参数,填入data/banana_ripe.yaml,可自定义自己的yaml路径 d.--hyp参数,填入hyp.scratch-high.yaml e.--epochs参数,填入100或者200都行,根据自己的数据集可改 f.--batch-size参数,根据自己的电脑性能(显存大小)自定义修改 g.--device参数,一张显卡的话,就填0。没显卡,使用cpu训练,就填cpu h.--close-mosaic参数,填入15 以上修改好,直接pycharm中运行train_dual.py开始训练 方式二: 命令行方式,在pycharm中的终端窗口输入如下命令,可根据自己情况修改参数 官方示例:python train_dual.py --workers 8 --device 0 --batch 16 --data data/coco.yaml --img 640 --cfg models/detect/yolov9-c.yaml --weights '' --name yolov9-c --hyp hyp.scratch-high.yaml --min-items 0 --epochs 500 --close-mosaic 15 训练完会在runs/train文件下生成对应的训练文件及模型,后续测试可以拿来用。 三、测试 1、训练完,测试 修改detect_dual.py中的参数 --weights,改成上面训练得到的best.pt对应的路径 --source,需要测试的数据图片存放的位置,代码中的test_imgs --conf-thres,置信度阈值,自定义修改 --iou-thres,iou阈值,自定义修改 其他默认即可 pycharm中运行detect_dual.py 在runs/detect文件夹下存放检测结果图片或者视频 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。
### 在 PyQt 中使用 YOLO 实现摄像头实时检测 为了在 PyQt 应用程序中集成 YOLO 进行摄像头实时检测,可以按照如下方法构建应用程序结构: 创建主窗口类继承自 `QMainWindow` 并设置布局,在其中加入用于显示图像的标签控件 (`QLabel`) 和启动/停止按钮 (`QPushButton`)。 ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtCore import QThread, pyqtSignal import cv2 import time class MainWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('Camera Detection with YOLO') self.setGeometry(100, 100, 800, 600) # 创建一个标签来展示视频帧 self.label = QLabel(self) self.label.resize(640, 480) # 添加按钮控制摄像机开关 startButton = QPushButton('Start Camera', self) stopButton = QPushButton('Stop Camera', self) startButton.move(660, 50) stopButton.move(660, 90) startButton.clicked.connect(self.startCapture) stopButton.clicked.connect(self.stopCapture) app = QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_()) ``` 定义一个新的线程子类处理相机捕获逻辑并执行目标识别算法。此线程负责读取每一帧画面并通过信号机制发送给主线程更新 UI 显示[^1]。 ```python class CaptureThread(QThread): changePixmap = pyqtSignal(QImage) def run(self): cap = cv2.VideoCapture(0) # 打开默认摄像头 while True: ret, frame = cap.read() # 获取一帧数据 if not ret: break rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 转换颜色空间以便于 Qt 处理 h, w, ch = rgbImage.shape bytesPerLine = ch * w convertToQtFormat = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888) p = convertToQtFormat.scaled(640, 480, aspectRatioMode=True) # 缩放图片适应界面尺寸 self.changePixmap.emit(p) # 发射信号通知 GUI 更新 time.sleep(0.03) # 控制刷新频率防止过载 def stop(self): self.terminate() ``` 连接上述提到的新建线程中的 `changePixmap` 信号到槽函数以接收来自工作线程的数据流,并将其绘制出来。 ```python def setImage(self, image): self.label.setPixmap(QPixmap.fromImage(image)) # 将之前定义的方法绑定至对应的事件响应上 capture_thread = CaptureThread(mainWin) capture_thread.changePixmap.connect(setImage) @pyqtSlot() def startCapture(): capture_thread.start() @pyqtSlot() def stopCapture(): capture_thread.stop() ``` 最后一步是在初始化阶段实例化这个新的线程对象并将它的 `changePixmap` 信号链接到前面所写的 `setImage()` 方法上去完成整个流程的设计。 通过这种方式可以在不阻塞图形用户接口的情况下流畅地运行计算机视觉任务如物体侦测等操作。对于更复杂的模型比如 YOLO,则需引入相应的库文件(例如 ultralytics 或 yolov5 官方仓库),并对获取到的画面应用这些预训练好的神经网络来进行预测分析[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

叶绿体不忘呼吸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值