当前位置: 首页 > news >正文

实时吸烟检测系统:基于深度学习与YOLO模型的完整实现

引言

在公共场所吸烟不仅有害吸烟者的健康,也会影响到周围的人。为了更好地管理和监控公共场所的吸烟行为,本文介绍了一种基于深度学习的吸烟检测系统。该系统包含一个用户界面,利用YOLO(You Only Look Once)v8/v7/v6/v5模型进行吸烟检测,并提供了完整的实现步骤和代码。

系统架构
  1. 数据收集和预处理
  2. 模型训练
  3. 系统实现
  4. 用户界面设计
数据收集和预处理
数据集

为了训练一个高精度的吸烟检测模型,我们需要一个包含大量吸烟和非吸烟图片的数据集。可以使用以下途径收集数据:

  • 公开数据集:如Kaggle上的相关数据集。
  • 自定义数据集:通过互联网、监控摄像头等途径收集图片。
数据标注

使用工具如LabelImg对数据进行标注。标注内容包括吸烟者的位置(bounding box)和标签(吸烟/非吸烟)。

 
# 训练数据集文件结构示例
dataset/├── images/│   ├── train/│   └── val/└── labels/├── train/└── val/

模型训练

YOLO模型有多个版本,本文选取YOLOv8作为示范,其他版本可以通过相似方法实现。

环境配置

安装YOLOv8所需的依赖库:

pip install ultralytics

模型训练代码

使用YOLOv8进行模型训练,假设数据已经按照YOLO的格式进行预处理和标注。

from ultralytics import YOLO# 加载预训练的YOLOv8模型
model = YOLO('yolov8.yaml')# 配置训练参数
model.train(data='path/to/dataset.yaml', epochs=50, imgsz=640, batch=16)# 保存训练后的模型
model.save('best.pt')

系统实现
吸烟检测

利用训练好的模型进行吸烟检测,并实现视频流的实时检测。

 
import cv2
from ultralytics import YOLO# 加载训练好的模型
model = YOLO('best.pt')# 打开视频流
cap = cv2.VideoCapture('path/to/video.mp4')while cap.isOpened():ret, frame = cap.read()if not ret:break# 检测吸烟行为results = model(frame)for result in results:bbox = result['bbox']label = result['label']confidence = result['confidence']# 画框和标签cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2)cv2.putText(frame, f'{label} {confidence:.2f}', (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)# 显示视频cv2.imshow('Smoke Detection', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

用户界面设计

用户界面采用PyQt5实现,提供视频播放和吸烟检测结果显示。

安装PyQt5
pip install PyQt5

界面代码
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QFileDialog
from PyQt5.QtGui import QPixmap, QImage
import cv2
from ultralytics import YOLOclass SmokeDetectionUI(QWidget):def __init__(self):super().__init__()self.initUI()self.model = YOLO('best.pt')def initUI(self):self.setWindowTitle('Smoke Detection System')self.layout = QVBoxLayout()self.label = QLabel(self)self.layout.addWidget(self.label)self.button = QPushButton('Open Video', self)self.button.clicked.connect(self.open_video)self.layout.addWidget(self.button)self.setLayout(self.layout)def open_video(self):options = QFileDialog.Options()video_path, _ = QFileDialog.getOpenFileName(self, "Open Video", "", "All Files (*);;MP4 Files (*.mp4)", options=options)if video_path:self.detect_smoke(video_path)def detect_smoke(self, video_path):cap = cv2.VideoCapture(video_path)while cap.isOpened():ret, frame = cap.read()if not ret:breakresults = self.model(frame)for result in results:bbox = result['bbox']label = result['label']confidence = result['confidence']cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2)cv2.putText(frame, f'{label} {confidence:.2f}', (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)# 将frame转换为QImageheight, width, channel = frame.shapebytesPerLine = 3 * widthqImg = QImage(frame.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped()self.label.setPixmap(QPixmap.fromImage(qImg))cv2.waitKey(1)cap.release()if __name__ == '__main__':app = QApplication(sys.argv)ex = SmokeDetectionUI()ex.show()sys.exit(app.exec_())
结论与声明

本文介绍了一个基于深度学习的吸烟检测系统,详细描述了从数据收集和标注、模型训练、系统实现到用户界面设计的全过程。通过结合YOLO模型和PyQt5,我们可以实现一个实时、精确的吸烟检测系统,为公共场所的吸烟行为管理提供有力支持。

声明:本文只是诠释一个较为简单的系统项目思路看,如有想获得远程部署+源代码+UI界面的可以联系作者。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux--多线程
  • Langchain[3]:Langchain架构演进与功能扩展:流式事件处理、事件过滤机制、回调传播策略及装饰器应用
  • Python爬虫实战:地震数据的自动化抓取与分析
  • Java--Collection集合
  • Maven学习—如何在IDEA中配置Maven?又如何创建Maven工程?(详细攻略)
  • 调用第三方接口-OkHttpClient
  • 什么是寄存器
  • TCP Socket编程示例
  • c++模板初识
  • 【MySQL】根据binlog日志获取回滚sql的一个开发思路
  • 2024.7.19 作业
  • docker 操作
  • PHP宠物店萌宠小程序系统源码
  • 【EI检索】第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)
  • 掌握构建艺术:在Gradle中配置自定义的源代码管理(SCM)
  • CSS实用技巧
  • Django 博客开发教程 8 - 博客文章详情页
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • exif信息对照
  • Fabric架构演变之路
  • iOS | NSProxy
  • JSDuck 与 AngularJS 融合技巧
  • V4L2视频输入框架概述
  • vue2.0项目引入element-ui
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 前端之React实战:创建跨平台的项目架构
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 数据仓库的几种建模方法
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #define用法
  • #pragma预处理命令
  • ${ }的特别功能
  • (26)4.7 字符函数和字符串函数
  • (二)hibernate配置管理
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十二)Flink Table API
  • ***利用Ms05002溢出找“肉鸡
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net core Redis 使用有序集合实现延迟队列
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET运行机制
  • .Net中间语言BeforeFieldInit
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @NestedConfigurationProperty 注解用法
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [].slice.call()将类数组转化为真正的数组
  • [000-01-022].第03节:RabbitMQ环境搭建
  • [001-03-007].第07节:Redis中的事务
  • [20170728]oracle保留字.txt