基于YOLOV5和PYQT5的智慧工地检测系统

📅 2026/7/10 13:19:23
基于YOLOV5和PYQT5的智慧工地检测系统
一.背景智慧工地检测系统是一种利用计算机视觉和人工智能技术进行智能化监控和管理的系统。该系统基于YOLOv5目标检测算法和PYQT5图形用户界面库实现对工地场景中的人、物体等目标进行实时监测和识别并提供相应的告警和管理功能。在传统的工地管理中往往需要大量的人力投入进行巡视和监控以确保工地的安全和秩序。然而这种方式存在一些问题如监控范围有限、监控效率低下、易发生漏检等。为了提高工地监控的智能化水平和效率基于计算机视觉和人工智能的智慧工地检测系统应运而生。YOLOv5是一种基于深度学习的目标检测算法它能够高效地在图像中检测出多个目标并给出它们的位置和类别信息。相比于传统的目标检测算法YOLOv5具有更高的准确性和实时性能。PYQT5是一个Python的GUI编程工具包它提供了丰富的图形界面组件和功能可以用于开发直观友好的用户界面。在智慧工地检测系统中使用PYQT5可以方便地构建系统的用户界面使用户能够直观地查看监测结果、进行系统配置和管理。基于YOLOV5PYQT5的智慧工地检测系统利用摄像头捕获工地现场的实时视频流通过目标检测算法对视频进行分析和处理。系统可以识别和检测工人是否佩戴安全帽、穿戴防护服等符合安全规定的行为。一旦检测到违规行为系统会及时发出警报提醒相关人员采取措施以避免潜在的安全事故发生。二、挑战和动机基于YOLOv5和PyQt5的智慧工地检测系统可以提供实时的目标检测和监控功能用于工地安全管理和事故预防。然而这个系统也面临一些挑战和动机。(1) 挑战1. 数据集获取构建一个高效的智慧工地检测系统需要大量的标注图像数据以训练目标检测模型。但是由于工地的多样性和复杂性获取和标注大规模的工地图像数据可能是一项艰巨的任务。2. 复杂的场景建筑工地、矿山等自然环境复杂多变人员众多可能存在遮挡、光照变化、背景干扰等问题这会对目标检测算法的准确性和稳定性提出挑战。3. 实时性要求智慧工地检测系统需要实时地监测工地中的安全问题并及时做出反应。因此算法和系统需要在保证准确性的同时具备高效的实时处理能力。4.硬件和资源限制为了实现实时目标检测和监测系统需要具备足够的计算资源和适当的硬件设备。在大规模工地环境中部署系统时面临着成本和技术限制。5.系统集成将YOLOv5和PyQt5集成到一个完整的智慧工地检测系统中可能需要进行深入的开发和调试工作。这涉及到将目标检测算法与界面设计和用户交互相结合确保系统的稳定性和功能完整性。(2) 动机1.工地安全管理智慧工地检测系统可以帮助监测工地中的潜在安全隐患如未佩戴安全帽、危险区域入侵等并及时发出警报或采取相应的预防措施以减少事故发生的可能性从而提高工地的安全性和管理水平。2.工作效率提升传统的工地巡检需要大量的人力资源和时间而智慧工地检测系统可以自动进行目标检测和监测减少了人工巡检的工作量。系统可以实时提供工地状态和安全情况的反馈帮助管理人员及时发现问题并采取相应的措施从而提高工作效率和管理效果。3.数据分析和统计智慧工地检测系统可以收集和分析工地中的数据如人员密度、作业活动、安全违规情况等为工地管理者提供有价值的信息和统计报告以优化工地管理和决策制定。4.远程监控和管理智慧工地检测系统可以实现远程监控和管理功能使工地管理人员能够通过互联网远程访问和控制系统。这样他们可以随时随地监测工地状态及时了解工地情况并进行必要的管理和调度提高对工地的实时监控和管理能力。综上所述基于YOLOv5和PyQt5的智慧工地检测系统具有实时性、准确性和高效性的要求旨在提升工地安全管理和工作效率并为数据分析和统计提供支持。然而这些目标也需要克服数据集获取、复杂的场景和实时性要求等挑战。三、界面和功能1pyqt5构建界面2功能介绍1.运行该系统实时显示北京时间。2.用户可以选择安全帽检测、火情检测和反光背心检测三种模型。3.用户可以调节置信度和iou。置信度表示预测结果的可靠程度iou用于衡量目标检测、语义分割和实例分割等任务中预测结果与真实标注之间的重叠程度。4.提示器区域用来显示报警时间、报警类型、人数等信息。5.用户可以选择图片检测、视频检测和摄像头检测三种方式。在界面左边显示原始图片或视频右边显示检测结果。6.检测完成后用户可以点击右上角的“下载”按钮保存检测图片或者点击下方的“报警数据下载”按钮保存数据信息。四、主要代码1切换检测模型def selectionChanged(self, index): select_weight self.comboBox.itemText(index) print(selected weight:, select_weight) if select_weight 安全帽检测: self.model torch.hub.load(./, custom, pathruns/train/exp3/weights/helmet_head_person_s.pt, sourcelocal) # 加载安全帽检测模型 self.weight det_helmet if select_weight 反光背心检测: self.model torch.hub.load(./, custom, pathruns/train/reflect_clothes.pt, sourcelocal) # 加载反光背心检测模型 self.weight det_reflect_clothes if select_weight 火灾检测: self.model torch.hub.load(./, custom, pathruns/train/det_fire.pt, sourcelocal) # 加载火情检测模型 self.weight det_fire2图片检测def image_pred(self, file_path): results self.model(file_path) # 加载模型检测 # print(model信息, self.model) image results.render()[0] # 调用检测结果 self.judge(results) return convert2QImage(image) # 转换图片格式 def open_image(self): print(点击了检测图片) self.textBrowser.clear() # 清除textBrowser文本框的文字 self.timer.stop() # 停止计时 file_path QFileDialog.getOpenFileName(self, directory./data/images, filter*.jpg;*.png;*.jpeg) # 选择图片 if file_path[0]: file_path file_path[0] self.input.setPixmap(QPixmap(file_path)) # 显示原始图片 qimage self.image_pred(file_path) # 调用图片检测 self.input.setPixmap(QPixmap(file_path)) self.output.setPixmap(QPixmap.fromImage(qimage)) # 显示检测结果图片 self.result_image_path file_path3视频检测def video_pred(self): ret, frame self.video.read() if not ret: # 未读取视频停止计时使用计时器在pyqt5中实时更新视频图片 self.timer.stop() else: frame cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 转换每一帧图像的格式 self.input.setPixmap(QPixmap.fromImage(convert2QImage(frame))) # 播放原始视频 self.results self.model(frame) # 加载检测模型 image self.results.render()[0] # qimage self.video_pred(frame) self.output.setPixmap(QPixmap.fromImage(convert2QImage(image))) # 播放检测后视频 return self.judge(self.results) # 判断检测结果 def open_video(self): print(点击了视频检测) file_path QFileDialog.getOpenFileName(self, directory./data, filter*.mp4) # 选择视频 if file_path[0]: file_path file_path[0] self.video cv2.VideoCapture(file_path) # 加载视频 self.timer.start() # 计时器开始计时4摄像头检测def open_camera(self): print(点击了摄像头检测) self.video cv2.VideoCapture(0) # 调用笔记本摄像头在实际项目里通过调用不同区域的联网摄像头来实时检测工地 self.timer.start()5判断报警类型def judge(self, result): alarm None person_count 0 helmet_count 0 preds result.pandas().xyxy[0] # 获取当前时间 self.current_time datetime.now() formatted_datetime self.current_time.strftime(%Y-%m-%d %H:%M:%S) # print(formatted_datetime) labels preds.values # 安全帽检测报警 if self.weight det_helmet: for label in labels: # print(lab:, label) if label[6] person: person_count 1 if label[6] helmet: helmet_count 1 print(person:, person_count) print(helmet:, helmet_count) self.textBrowser.append(f人数为{person_count}) self.textBrowser.append(f头盔个数为{helmet_count}) if helmet_count person_count: print(没佩戴头盔) alarm 没佩戴头盔 # 反光背心检测报警 label为1 if self.weight det_reflect_clothes: for label in labels: if label[6] ! reflective_clothes: print(检测到没穿戴反光背心) alarm 没穿戴反光背心 # 明火检测报警 if self.weight det_fire: for label in labels: if label[6] fire: print(检测到火焰) alarm 检测到火焰 # 提示板显示 self.textBrowser.append(formatted_datetime) self.textBrowser.append(f警告{alarm}) # 记录报警 if alarm is not None: return self.record(alarm)ps:其实在反光背心检测中也可以添加检测人数的功能但由于该反光背心检测模型不是笔者训练的所以并未标注person。6记录报警时间和类型def record(self, type): # 记录报警时间和类型 with open(Attendance.csv, r) as f: myDatalist f.readlines() # 读取文件中所有的行 List [] for line in myDatalist: entry line.split(,) List.append(entry[0]) current_time datetime.now() # 获取当前时间 dtString current_time.strftime(%Y-%m-%d %H:%M:%S) # 将日期时间格式化成字符串 f.writelines(f{type},{dtString}) # 写入报警类型和时间 f.write(\n) alarm_thread threading.Thread(targetself.sound_alarm) #警报声响 alarm_thread.start()7 下载数据def Download_data(self): source_file_path Attendance.csv # 记录表 save_path, _ QFileDialog.getSaveFileName(self, Save File, , CSV Files (*.csv)) if save_path: try: shutil.copyfile(source_file_path, save_path) print(File downloaded successfully!) self.textBrowser.append(报警数据下载成功) except Exception as e: print(Error while downloading file:, str(e)) else: print(No save path selected.)8信号、槽函数绑定def bind_slots(self): # 信号、槽函数绑定 self.det_image.clicked.connect(self.open_image) #图片检测 self.det_video.clicked.connect(self.open_video) #视频检测 self.det_camera.clicked.connect(self.open_camera) #摄像头检测 self.comboBox.currentIndexChanged.connect(self.selectionChanged) #模型选择 self.dL_data.clicked.connect(self.Download_data) #下载数据 self.download.clicked.connect(self.Download_image) #保存图片 self.slider.valueChanged.connect(self.Conf_change) #调节置信度 self.Iou_Slider.valueChanged.connect(self.Conf_change) #调节iou self.timer.timeout.connect(self.video_pred) #视频处理五、实验效果1模型选择接下来分别采用图片检测、摄像头检测和视频检测这三种方式检测上述三种场景模型的识别检测效果。2图片检测1.安全帽检测2.反光背心检测3.火焰检测3摄像头检测这里调用笔记本摄像头完成测试任务。1.安全帽检测ps:这里没有检测到人数是因为这张图片在24号测试的当时还未添加人数功能。要打马赛克笔者也懒得更新了2.反光背心检测4视频检测为节约时间这里只放置火焰检测的实验视频。火焰检测通过视频系统可以有效检测到火焰并实现了报警功能但发现有明显的延迟卡顿这是受到计算机显卡性能我用的小米笔记本CPU训练120张图片跑出6小时的战绩、I/O延迟和并发处理等问题的影响。有条件的小伙伴可以用高性能的显卡或者优化yolo算法模型减少延迟。5报警数据下载报警数据如下六、小结基于YOLOV5和PyQt5的智慧工地检测系统结合了目标检测算法和界面设计旨在实现对工地环境的智能监测和检测。本系统大体上实现了不同场景模型下的识别检测功能但仍然存在着许多缺陷。比如在报警数据记录的处理上过于简单可以增加检测到的人数、检测地点等在安全帽检测时由于安全帽体积小易被遮挡系统容易误报另外在视频检测时由于计算机设备显卡性能不足导致检测处理速度较慢视频帧卡顿和延迟。在测试中也存在一些不足没有考虑到实际环境的复杂性在检测图片和视频时应进行图像预处理提高识别率和系统处理速率。本篇实验来源于我的计算机视觉课程大作业也是5月份所写文章《人员识别与安全帽检测》的一个小小的动手实现过程也算是学以致用吧。