yolov5明厨亮灶检测系统,厨师帽-口罩检测,带pyqt界面-可检测图片和视频,支持中文标签,检测接口已封装好并优化,代码可读性强!

news2024/11/24 7:29:55

明厨亮灶检测系统是一个专门用于餐饮业厨房安全监管的智能系统。该系统结合了先进的计算机视觉技术,尤其是使用YOLOv5模型进行厨师帽和口罩的实时检测,并通过PyQt5构建了一个用户友好的图形界面。该系统不仅能够检测图片和视频中的目标,而且支持中文标签,方便国内用户的使用。以下是对此项目的详细介绍。

项目背景

随着食品安全和卫生标准的不断提高,餐饮业对厨房工作人员的着装要求也越来越严格。佩戴厨师帽和口罩不仅是基本的职业规范,更是防止食品污染的重要措施。因此,开发一套能够自动检测厨房工作人员是否佩戴厨师帽和口罩的系统,对于提高食品安全标准具有重要意义。

项目目标

  • 实时检测:通过YOLOv5模型实时检测视频流或图片中的厨师帽和口罩。
  • 中文标签支持:系统支持中文标签,便于国内用户理解和使用。
  • 用户界面:使用PyQt5构建图形用户界面,提供友好的操作体验。
  • 多功能:支持图片和视频检测,满足不同场景下的需求。

关键功能

  1. 厨师帽和口罩检测:利用YOLOv5模型实时检测图像中的厨师帽和口罩。
  2. 中文标签显示:检测结果以中文标签形式显示,便于用户理解。
  3. 图片检测:支持从本地上传图片进行检测。
  4. 视频检测:支持实时视频流或本地视频文件的检测。
  5. 结果可视化:在检测结果上绘制边界框和标签,直观展示检测对象的位置和类别。
  6. 用户界面:通过PyQt5构建的图形界面,用户可以方便地操作和查看检测结果。

技术栈

  • 目标检测模型:YOLOv5
  • 图形用户界面:PyQt5
  • 图像处理:OpenCV
  • 编程语言:Python

关键代码示例

1. 安装依赖

确保安装了所有必要的库:

1pip install opencv-python torch torchvision pyqt5 numpy
2pip install ultralytics  # 用于YOLOv5的最新版本
2. 导入库
1import sys
2import cv2
3import numpy as np
4import torch
5from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QFileDialog
6from PyQt5.QtCore import QTimer
7from PyQt5.QtGui import QImage, QPixmap
8from ultralytics import YOLO  # 使用YOLOv5的最新版本
3. 初始化YOLOv5模型

假设YOLOv5模型的权重文件位于weights/yolov5.pt

1device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
2yolo_model = YOLO('weights/yolov5.pt').to(device)
4. 创建GUI

创建一个简单的GUI来显示视频流和检测结果。

1class KitchenSafetyWindow(QMainWindow):
2    def __init__(self):
3        super().__init__()
4        self.initUI()
5
6    def initUI(self):
7        self.setWindowTitle('明厨亮灶检测系统')
8        self.setGeometry(100, 100, 800, 600)
9        
10        layout = QVBoxLayout()
11        self.label = QLabel(self)
12        layout.addWidget(self.label)
13        
14        button = QPushButton('打开图片', self)
15        button.clicked.connect(self.open_image)
16        layout.addWidget(button)
17        
18        button = QPushButton('打开视频', self)
19        button.clicked.connect(self.open_video)
20        layout.addWidget(button)
21        
22        container = QWidget()
23        container.setLayout(layout)
24        self.setCentralWidget(container)
25    
26    def open_image(self):
27        options = QFileDialog.Options()
28        file_name, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Images (*.png *.jpg *.jpeg);;All Files (*)", options=options)
29        if file_name:
30            self.detect_image(file_name)
31    
32    def detect_image(self, image_path):
33        img = cv2.imread(image_path)
34        results = yolo_model(img)
35        self.draw_boxes(img, results)
36        self.display_results(img)
37    
38    def open_video(self):
39        options = QFileDialog.Options()
40        file_name, _ = QFileDialog.getOpenFileName(self, "选择视频", "", "Videos (*.mp4 *.avi);;All Files (*)", options=options)
41        if file_name:
42            self.detect_video(file_name)
43    
44    def detect_video(self, video_path):
45        self.capture = cv2.VideoCapture(video_path)
46        self.timer = QTimer()
47        self.timer.timeout.connect(self.update_frame)
48        self.timer.start(20)  # 每50毫秒更新一次画面
49    
50    def update_frame(self):
51        ret, frame = self.capture.read()
52        if ret:
53            results = yolo_model(frame)
54            self.draw_boxes(frame, results)
55            self.display_results(frame)
56    
57    def draw_boxes(self, frame, results):
58        for result in results:
59            boxes = result.boxes.cpu().numpy()
60            for box in boxes:
61                x1, y1, x2, y2 = [int(i) for i in box[:4]]
62                label = box[5]
63                cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2)
64                cv2.putText(frame, f"{label}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36, 255, 12), 2)
65    
66    def display_results(self, frame):
67        height, width, channel = frame.shape
68        bytesPerLine = 3 * width
69        qImg = QImage(frame.data, width, height, bytesPerLine, QImage.Format_BGR888)
70        pixmap = QPixmap.fromImage(qImg)
71        self.label.setPixmap(pixmap)
72
73if __name__ == '__main__':
74    app = QApplication(sys.argv)
75    window = KitchenSafetyWindow()
76    window.show()
77    sys.exit(app.exec_())

应用场景

  • 餐饮业厨房:实时监控厨房工作人员是否正确佩戴厨师帽和口罩,保障食品安全。
  • 食品安全检查:帮助监管部门进行食品安全检查,提高检查效率。
  • 培训教育:用于培训厨房工作人员正确的着装规范,提高职业素养。

结论

明厨亮灶检测系统通过结合YOLOv5模型和PyQt5界面,提供了一个功能齐全且易于使用的工具,能够实时检测厨师帽和口罩,支持中文标签,并且适用于图片和视频检测。该系统不仅能够帮助餐饮业提高食品安全标准,还能提升厨房工作人员的职业形象。随着技术的不断发展和完善,这样的系统将在食品安全和卫生管理中发挥更加重要的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2127779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何看待 IBM 中国研发部裁员?

文章目录 引言背景趋势与影响人才发展对 IT 人才市场的影响IT 从业者积极应对全球化挑战 产业发展IT 产业的应对策略提升核心竞争力 结语 引言 近日,IBM 中国宣布撤出在华两大研发中心,引发了 IT 行业对于跨国公司在华研发战略的广泛讨论。这一决定不仅…

共享打印机无法连多种错误代码原因分析及解决方法

日常办公和生活中,打印机是不可或缺的重要设备。然而,在添加共享或使用共享打印机过程中,经常会遇各种问题。然后我们在添加共享打印机遇到最多的向种错误:0x0000011b、0x000004005、0x000006d9、0x00000040等等,然后这…

ggplot2 缩小的/一般长度的、带箭头的坐标轴 | R语言

1. 效果图 左侧为DimPlot2()效果图。 右侧为DimPlot()效果图,原图。 2. 代码 axis.line element_line(arrow arrow(type "open", length unit(0.3, "cm"))), 其中: type"open"表示是开放箭头,type“closed” 表示是…

云手机哪一款好用?手游专用云手机一览!VMOS云手机

云手机,顾名思义,是一台运行在云端服务器上的虚拟手机。它具备传统手机的所有功能,但无需实际设备支持运算和存储。所有的计算、存储以及应用运行都由云端服务器承担。用户只需通过浏览器或客户端访问云手机的操作界面,就可以像操…

挖耳勺可以和别人共用吗?口碑好的可视耳勺!

人体分泌的耳垢会有细菌,如果与别人共用挖耳勺很有可能会交叉感染,所以一般建议自己有专用的挖耳勺。小编可以给大家分享一款超好用又能实现一人一用的挖耳勺--可视挖耳勺,它有着高清内窥镜可以进入耳道实时查看情况,并且耳勺头采…

用Postman调试是英文导致系统语言变成英文,SQL语句查询不出来对应的字段,出现SAP系统里面调试是有值的,但是外部调用是没有值的!

用Postman调试是英文导致系统语言变成英文,SQL语句查询不出来对应的字段,出现SAP系统里面调试是有值的,但是外部调用是没有值的!后面调试了非常久,一直以为是有特殊字符导致的,后面处理了特殊字符之后还是不…

学生宿舍安全用电的重要性

一、宿舍用电安全的重要性 宿舍是学生学习和生活的场所,也是人员密集的地方。一旦发生用电安全事故,不仅会造成财产损失,还会危及学生的生命安全。因此,宿舍用电安全是学校和学生必须高度重视的问题。 二、宿舍用电安全注意事项 1…

QGIS 如何连接空间库,并实时编辑空间表?编辑后库表如何刷新,保证是最新数据?

文章目录 一、什么是 qgis?二、qgis 如何连接数据库三、实时编辑空间表四、编辑后库表如何刷新,保证是最新数据?五、总结 一、什么是 qgis? QGIS(原称Quantum GIS)是一个用户界面友好的开源桌面端软件&…

python安装包的三种区别

python安装包的三种区别: Download Windows x86 web-based installer Download Windows x86 executable installerDownload Windows x86 embeddable zip fileDownload Windows x86-64 web-based installerDownload Windows x86-64 executable installerDownload W…

【C++】入门基础(上)

Hi,好久不见! 目录 1、C入门小基础 1.1 祖师爷--Bjarne Stroustrup(本贾尼斯特劳斯特卢普) 1.2 C参考文献 1.3 书籍推荐 2、C的第一个程序 3、命名空间 3.1 namespace的价值 3.2 namespace的定义 3.3 命名空间的使…

乐学英语四六级学习系统小程序的开发---附源码78055

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.1.1经济可行性 2.1.2技术可行性 2.1.3社会可行性 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 …

Java 如何检查两个给定的线段是否相交(How to check if two given line segments intersect)

给定两条线段(p1, q1)和(p2, q2),判断给定的线段是否相交。 在讨论解决方案之前,让我们先定义方向的概念。平面中有序点三元组的方向可以是 –逆时针 –顺时针 –共线 下图显示了(a,b,c) 的不同可能方…

linux下使用Mail命令发送邮件的配置、快速实现以及sed命令的一些补充:行结合模式匹配取内容及sed命令显示配置文件中的有效内容

一、linux下使用Mail命令发送邮件的配置及快速实现 之前在服务器上增加了一些日志统计shell脚本并且每周进行一次日志分析统计自动在周一早上发到我的邮箱,最近服务器进行了迁移收缩,又得做点重复的事情,首先是让服务器支持邮件发送。 1&am…

Java语言程序设计基础篇_编程练习题*18.19 (思瑞平斯基三角形)

题目:*18.19 (思瑞平斯基三角形) 修改程序清单18-9, 开发一个程序让用户使用 “” 和 "-” 按钮将当前阶数增1或减1,如图 18 -12a 所示。初始阶数为0。如果当前阶数为0,就忽略按钮。 代码示例 编程练习题18_19SierpinskiTriangle.java…

WEBSERVICE报错逻辑端口不存在问题

例如如下的报错 打开你的SOA 修改这个位置的代码

JavaScript ES6特性(var let const、function=>、增强表达赋值、类与对象)

一、var let const 1、var var明明定义在for里面的但是外部能够访问这个变量,说明var可以跨域访问。 2、let let明明定义在for里面的但是外部不能够访问这个变量,说明let不可以跨域访问。 3、const const foo = {}; // 为 foo 添加一个属性,可以成功 foo.prop = 123; fo…

【mechine learning-六-supervise learning之线性回归模型】

监督学习之线性回归模型 线性回归模型线性模型回归模型 如何使用线性模型实现智能化预测呢寻找数据训练模型输入、特征、目标、预测值、模型代价函数 线性模型是人工智能监督学习中最广泛的应用,所以有必要先学习一下这个基础模型,做好基石。 线性回归模…

商业体育馆的未来之选:气膜馆引领新赛道—轻空间

随着城市化进程的加快,土地资源日益紧张,商业体育馆的建设需求也日渐增多。传统建筑在用地、成本、周期等方面存在诸多限制,而气膜馆的出现,为体育场馆建设提供了一条全新的解决方案。在未来十年,气膜体育馆将成为商业…

【系统方案】ERP管理系统总体建设方案(Word)

第一部分 概述 第二部分 方案介绍 第三部分 系统业务流程 3.1 关键需求概括分析 3.1.1 销售管理方面 3.1.2 采购管理方面 3.1.3 仓库管理方面 3.1.4 财务管理方面 3.1.5 人力资源方面 3.2 关键需求具体分析 3.2.1 财务管理 3.2.1.1会计凭证解决 3.2.1.2钞票流量预算管理 3.2.1.…

C语言15--联合体与枚举

联合体(共同体)基本概念 联合体的外在形式跟结构体非常类似,但它们有一个本质的区别:结构体中的各个成员是各自独立的内存空间,而联合体中的各个成员却共用同一块内存,因此联合体也称为共用体。 联合体各成…