基于YOLOv8的摄像头吸烟检测系统:从数据集到PyQt系统搭建
基于YOLOv8的摄像头吸烟检测系统提供数据集源码pyqt系统在安防和公共环境监控领域吸烟行为的检测至关重要。今天就来跟大家分享基于YOLOv8搭建摄像头吸烟检测系统还会附上数据集源码以及PyQt系统相关内容。YOLOv8 简介YOLOYou Only Look Once系列一直是目标检测领域的佼佼者YOLOv8 更是在速度和精度上有了进一步提升。它基于之前版本的架构进行优化能够快速准确地识别图像和视频流中的目标物体。数据集准备要训练一个准确的吸烟检测模型优质的数据集是关键。下面展示一些简单的数据处理代码示例import os import shutil # 假设原始数据集路径 original_dataset_path original_smoking_dataset # 划分后的训练集、验证集、测试集路径 train_path train_smoking_dataset val_path val_smoking_dataset test_path test_smoking_dataset # 创建目录 os.makedirs(train_path, exist_okTrue) os.makedirs(val_path, exist_okTrue) os.makedirs(test_path, exist_okTrue) # 简单划分数据集假设按 8:1:1 划分 file_list os.listdir(original_dataset_path) total_files len(file_list) train_files file_list[:int(total_files * 0.8)] val_files file_list[int(total_files * 0.8):int(total_files * 0.9)] test_files file_list[int(total_files * 0.9):] # 移动文件到相应目录 for file in train_files: shutil.copy(os.path.join(original_dataset_path, file), os.path.join(train_path, file)) for file in val_files: shutil.copy(os.path.join(original_dataset_path, file), os.path.join(val_path, file)) for file in test_files: shutil.copy(os.path.join(original_dataset_path, file), os.path.join(test_path, file))这段代码主要完成了将原始数据集按比例划分为训练集、验证集和测试集并分别存储到不同目录的操作。os.makedirs用于创建目录如果目录已存在则不会报错。通过计算文件总数并按比例切片我们确定了每个子集包含的文件最后用shutil.copy将文件复制到相应位置。YOLOv8 训练使用准备好的数据集就可以开始 YOLOv8 的训练了。在终端中执行如下命令yolo detect train datasmoking_dataset.yaml modelyolov8n.pt epochs50 imgsz640这里data参数指定数据集配置文件路径model选择预训练模型这里以yolov8n.pt为例是YOLOv8的轻量级模型epochs表示训练轮数imgsz是输入图像大小。训练过程中模型会不断学习数据集中吸烟和非吸烟场景的特征。摄像头实时检测训练好模型后就可以利用摄像头进行实时检测了。下面是Python代码示例import cv2 from ultralytics import YOLO # 加载训练好的模型 model YOLO(best.pt) # 打开摄像头 cap cv2.VideoCapture(0) while cap.isOpened(): ret, frame cap.read() if not ret: break results model(frame) annotated_frame results[0].plot() cv2.imshow(Smoking Detection, annotated_frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()代码中首先通过YOLO(best.pt)加载训练好的模型best.pt是训练后保存的最佳权重文件。接着使用cv2.VideoCapture(0)打开默认摄像头。在循环中不断读取摄像头的帧将帧输入模型进行检测model(frame)返回检测结果。results[0].plot()会在原帧上绘制检测到的目标框等信息。最后通过cv2.imshow显示处理后的帧按下q键退出循环并释放摄像头资源、关闭窗口。PyQt 系统集成为了让吸烟检测系统有更友好的用户界面我们可以使用 PyQt 进行集成。以下是一个简单的 PyQt 窗口示例代码import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout from PyQt5.QtGui import QPixmap, QImage import cv2 from ultralytics import YOLO class SmokingDetectionApp(QWidget): def __init__(self): super().__init__() self.model YOLO(best.pt) self.cap cv2.VideoCapture(0) self.initUI() def initUI(self): self.setWindowTitle(吸烟检测系统) self.setGeometry(100, 100, 800, 600) self.label QLabel(self) self.label.setGeometry(0, 0, 800, 600) layout QVBoxLayout() layout.addWidget(self.label) self.setLayout(layout) self.update_frame() def update_frame(self): ret, frame self.cap.read() if ret: results self.model(frame) annotated_frame results[0].plot() height, width, channel annotated_frame.shape bytes_per_line 3 * width q_image QImage(annotated_frame.data, width, height, bytes_per_line, QImage.Format_RGB888).rgbSwapped() pixmap QPixmap.fromImage(q_image) self.label.setPixmap(pixmap) self.timer self.startTimer(30) def timerEvent(self, event): self.update_frame() if __name__ __main__: app QApplication(sys.argv) ex SmokingDetectionApp() ex.show() sys.exit(app.exec_())这个PyQt代码创建了一个简单的窗口应用。SmokingDetectionApp类继承自QWidget在初始化时加载模型并打开摄像头。initUI方法设置窗口标题、大小并添加一个QLabel用于显示视频帧。updateframe方法从摄像头读取帧进行检测并转换为QPixmap显示在QLabel上同时通过startTimer定时更新画面。timerEvent会在定时器触发时调用updateframe实现连续的视频流显示。基于YOLOv8的摄像头吸烟检测系统提供数据集源码pyqt系统通过上述步骤我们成功搭建了基于YOLOv8的摄像头吸烟检测系统从数据集处理到模型训练再到实时检测以及PyQt系统集成希望能给大家在相关项目开发上带来一些启发。这样一套完整的系统源码和数据集对于安防监控、公共场合禁烟管理等场景有着很高的实用价值感兴趣的小伙伴可以根据实际需求进一步优化和扩展。