智慧工地检测系统是一种利用计算机视觉和人工智能技术进行智能化监控和管理的系统。该系统基于YOLOv5目标检测算法和PYQT5图形用户界面库,实现对工地场景中的人、物体等目标进行实时监测和识别,并提供相应的告警和管理功能。
在传统的工地管理中,往往需要大量的人力投入进行巡视和监控,以确保工地的安全和秩序。然而,这种方式存在一些问题,如监控范围有限、监控效率低下、易发生漏检等。为了提高工地监控的智能化水平和效率,基于计算机视觉和人工智能的智慧工地检测系统应运而生。
YOLOv5是一种基于深度学习的目标检测算法,它能够高效地在图像中检测出多个目标,并给出它们的位置和类别信息。相比于传统的目标检测算法,YOLOv5具有更高的准确性和实时性能。
PYQT5是一个Python的GUI编程工具包,它提供了丰富的图形界面组件和功能,可以用于开发直观友好的用户界面。在智慧工地检测系统中,使用PYQT5可以方便地构建系统的用户界面,使用户能够直观地查看监测结果、进行系统配置和管理。
基于YOLOV5+PYQT5的智慧工地检测系统利用摄像头捕获工地现场的实时视频流,通过目标检测算法对视频进行分析和处理。系统可以识别和检测工人是否佩戴安全帽、穿戴防护服等符合安全规定的行为。一旦检测到违规行为,系统会及时发出警报,提醒相关人员采取措施,以避免潜在的安全事故发生。
基于YOLOv5和PyQt5的智慧工地检测系统可以提供实时的目标检测和监控功能,用于工地安全管理和事故预防。然而,这个系统也面临一些挑战和动机。
(1) 挑战:
1. 数据集获取:构建一个高效的智慧工地检测系统需要大量的标注图像数据,以训练目标检测模型。但是由于工地的多样性和复杂性,获取和标注大规模的工地图像数据可能是一项艰巨的任务。
2. 复杂的场景:建筑工地、矿山等自然环境复杂多变,人员众多,可能存在遮挡、光照变化、背景干扰等问题,这会对目标检测算法的准确性和稳定性提出挑战。
3. 实时性要求:智慧工地检测系统需要实时地监测工地中的安全问题,并及时做出反应。因此,算法和系统需要在保证准确性的同时具备高效的实时处理能力。
4.硬件和资源限制:为了实现实时目标检测和监测,系统需要具备足够的计算资源和适当的硬件设备。在大规模工地环境中部署系统时,面临着成本和技术限制。
5.系统集成:将YOLOv5和PyQt5集成到一个完整的智慧工地检测系统中可能需要进行深入的开发和调试工作。这涉及到将目标检测算法与界面设计和用户交互相结合,确保系统的稳定性和功能完整性。
(2) 动机
1.工地安全管理:智慧工地检测系统可以帮助监测工地中的潜在安全隐患,如未佩戴安全帽、危险区域入侵等,并及时发出警报或采取相应的预防措施,以减少事故发生的可能性,从而提高工地的安全性和管理水平。
2.工作效率提升:传统的工地巡检需要大量的人力资源和时间,而智慧工地检测系统可以自动进行目标检测和监测,减少了人工巡检的工作量。系统可以实时提供工地状态和安全情况的反馈,帮助管理人员及时发现问题并采取相应的措施,从而提高工作效率和管理效果。
3.数据分析和统计:智慧工地检测系统可以收集和分析工地中的数据,如人员密度、作业活动、安全违规情况等,为工地管理者提供有价值的信息和统计报告,以优化工地管理和决策制定。
4.远程监控和管理:智慧工地检测系统可以实现远程监控和管理功能,使工地管理人员能够通过互联网远程访问和控制系统。这样,他们可以随时随地监测工地状态,及时了解工地情况,并进行必要的管理和调度,提高对工地的实时监控和管理能力。
综上所述,基于YOLOv5和PyQt5的智慧工地检测系统具有实时性、准确性和高效性的要求,旨在提升工地安全管理和工作效率,并为数据分析和统计提供支持。然而,这些目标也需要克服数据集获取、复杂的场景和实时性要求等挑战。
(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", path="runs/train/exp3/weights/helmet_head_person_s.pt",
source="local") # 加载安全帽检测模型
self.weight = "det_helmet"
if select_weight == '反光背心检测':
self.model = torch.hub.load("./", "custom", path="runs/train/reflect_clothes.pt",
source="local") # 加载反光背心检测模型
self.weight = "det_reflect_clothes"
if select_weight == '火灾检测':
self.model = torch.hub.load("./", "custom", path="runs/train/det_fire.pt",
source="local") # 加载火情检测模型
self.weight = "det_fire"
(2)图片检测
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_path
(3)视频检测
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(target=self.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月份所写文章《人员识别与安全帽检测》的一个小小的动手实现过程,也算是学以致用吧。