基于深度学习的吸烟检测系统(UI界面+YOLOv10/v8/v7/v6/v5代码+训练数据集)

1. 引言

随着人们对健康的关注不断增加,吸烟已被证明是导致多种疾病的主要因素。因此,开发一种有效的吸烟检测系统显得尤为重要。基于深度学习的吸烟检测系统能够实时检测公共场所的吸烟行为,为公共健康管理提供支持。本文将详细介绍如何利用YOLO系列模型(YOLOv5/v6/v7/v8/v10)构建一个吸烟检测系统,包括UI界面的设计、模型训练、数据集准备及完整代码实现。

目录

1. 引言

2. 系统架构

3. 数据集准备

3.1 数据集来源

3.2 数据集格式

3.3 YAML配置文件

4. 模型选择与训练

4.1 环境准备

4.2 YOLOv5模型下载

4.3 模型训练

5. 用户界面设计

5.1 UI代码实现

5.2 功能说明

6. 系统性能评估

7. 总结与未来展望


2. 系统架构

本系统主要由以下几个部分组成:

  • 数据集准备:收集并标注包含吸烟行为的视频和图像数据。
  • 模型选择与训练:使用YOLO系列模型进行训练,以识别吸烟行为。
  • 用户界面(UI):使用Tkinter创建图形用户界面,方便用户上传图片或视频,查看检测结果。
  • 实时检测:使用摄像头进行实时吸烟检测。

3. 数据集准备

3.1 数据集来源

数据集可以使用公开的吸烟检测数据集,或自行拍摄和标注包含吸烟行为的图像和视频。推荐的数据集包括:

  • Smoker Dataset: 包含吸烟者和非吸烟者的图像。
  • 自定义数据集: 通过摄像头拍摄吸烟场景,使用标注工具(如LabelImg)进行标注。

3.2 数据集格式

YOLO模型要求的标注格式为文本文件,每个图像对应一个文本文件,内容格式如下:

 
class_id center_x center_y width height
  • class_id: 类别编号(吸烟者为0,非吸烟者为1)
  • center_x, center_y: 边界框中心点坐标(相对值,范围0到1)
  • width, height: 边界框宽度和高度(相对值,范围0到1)

3.3 YAML配置文件

创建一个名为smoking_dataset.yaml的文件,内容如下:

 
train: ./data/train/images
val: ./data/val/images

nc: 2
names: ['smoking', 'not_smoking']

4. 模型选择与训练

本项目将使用YOLOv5进行吸烟检测。以下是训练模型的步骤:

4.1 环境准备

确保已安装所需库:

 
pip install torch torchvision torchaudio
pip install opencv-python
pip install Pillow
pip install numpy
pip install matplotlib
pip install tqdm

4.2 YOLOv5模型下载

使用以下命令下载YOLOv5模型:

 
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
pip install -r requirements.txt

4.3 模型训练

yolov5目录下,运行以下命令进行模型训练:

 
python train.py --img 640 --batch 16 --epochs 50 --data smoking_dataset.yaml --weights yolov5s.pt

  • --img: 输入图像的尺寸
  • --batch: 每批次的样本数量
  • --epochs: 训练的轮次
  • --data: 数据集的YAML文件
  • --weights: 预训练权重文件

5. 用户界面设计

用户界面将使用Tkinter库创建,提供图像上传和实时检测功能。

5.1 UI代码实现

以下是UI界面的完整代码:

 
import tkinter as tk
from tkinter import filedialog, messagebox
import torch
import cv2
import numpy as np
from PIL import Image, ImageTk

class SmokingDetectionApp:
    def __init__(self, root, model_path):
        self.root = root
        self.root.title("吸烟检测系统")
        self.model = torch.hub.load('ultralytics/yolov5', 'custom', path=model_path)

        # 创建画布
        self.canvas = tk.Canvas(root, width=640, height=480)
        self.canvas.pack()

        # 创建按钮
        self.upload_button = tk.Button(root, text="上传图片", command=self.upload_image)
        self.upload_button.pack(side=tk.LEFT)

        self.camera_button = tk.Button(root, text="摄像头检测", command=self.detect_from_camera)
        self.camera_button.pack(side=tk.LEFT)

        # 创建结果标签
        self.result_label = tk.Label(root, text="检测结果:")
        self.result_label.pack()

    def upload_image(self):
        file_path = filedialog.askopenfilename()
        if file_path:
            img = Image.open(file_path)
            img = img.resize((640, 480))
            self.img_tk = ImageTk.PhotoImage(img)
            self.canvas.create_image(0, 0, anchor=tk.NW, image=self.img_tk)

            # YOLO模型检测
            self.perform_detection(img)

    def detect_from_camera(self):
        cap = cv2.VideoCapture(0)

        while True:
            ret, frame = cap.read()
            if not ret:
                break

            # YOLO模型检测
            results = self.model(frame)

            # 将检测结果绘制在帧上
            self.draw_boxes(frame, results)

            # 将BGR转为RGB以适应PIL图像
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            img_pil = Image.fromarray(frame)
            img_tk = ImageTk.PhotoImage(img_pil)
            self.canvas.create_image(0, 0, anchor=tk.NW, image=img_tk)

            # 更新界面
            self.root.update()

        cap.release()

    def perform_detection(self, img):
        results = self.model(np.array(img))
        detection_results = results.pandas().xyxy[0]
        self.result_label.config(text=f"检测结果:\n{detection_results}")

    def draw_boxes(self, frame, results):
        for i in range(len(results.xyxy[0])):
            x1, y1, x2, y2, conf, cls = results.xyxy[0][i]
            label = f"{self.model.names[int(cls)]} {conf:.2f}"
            cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
            cv2.putText(frame, label, (int(x1), int(y1)-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

# 启动应用
if __name__ == "__main__":
    root = tk.Tk()
    app = SmokingDetectionApp(root, model_path='best.pt')  # 请根据您的模型路径修改
    root.mainloop()

5.2 功能说明

  • 上传图片:用户可以选择本地图片进行吸烟检测,检测结果会在界面上显示。
  • 摄像头检测:使用摄像头实时检测吸烟行为,结果同样会实时显示在界面上。

6. 系统性能评估

在吸烟检测系统中,模型的检测精度和实时性是评估系统性能的重要指标。我们可以通过以下方法评估模型的效果:

  • 精度(Precision):评估模型检测到的吸烟目标中有多少是真正的吸烟行为。
  • 召回率(Recall):评估实际吸烟目标中有多少被模型成功检测出来。
  • F1值:精度和召回率的加权平均值,是综合衡量模型效果的指标。
  • 帧率(FPS):评估实时检测的帧率,确保系统能够流畅地进行实时吸烟检测。

7. 总结与未来展望

本文详细介绍了如何基于YOLO模型开发一个吸烟检测系统,系统结合了深度学习技术与图形界面,用户可以通过简单的UI界面进行吸烟检测。通过实验,我们验证了系统的高效性和准确性,为公共健康管理提供了一个有效的解决方案。

未来,随着深度学习技术的不断进步,我们可以尝试引入更多高级的网络结构,如Transformer或混合架构模型,进一步提高吸烟检测的精度。同时,结合智能监控系统、IoT设备等技术,开发更加智能化的吸烟检测系统,将成为未来公共健康管理的重要方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

深度学习实战项目

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

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

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

打赏作者

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

抵扣说明:

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

余额充值