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