基于YOLOv5与PyQt5的智慧工地安全帽检测与危险区域入侵告警系统

发布时间:2026/9/1 0:20:38
基于YOLOv5与PyQt5的智慧工地安全帽检测与危险区域入侵告警系统 简介本资源是一套面向计算机相关专业在校学生、教师及工程技术人员的智慧工地安全智能监管系统实战项目聚焦施工场景下的安全帽佩戴识别与危险区域入侵告警两大核心需求适用于毕业设计、课程设计、大作业及初期项目立项演示。压缩包共2000个文件含406张标注图像jpg、743份PASCAL VOC格式标注xml、743份文本说明txt、49个Python源码py及配置文件yaml完整涵盖YOLOv5模型训练与PyQt5 GUI开发全流程包体大小236.04MB。已有4147人学习下载资源经实测可稳定运行附带详细部署说明文档与自定义危险区域绘制功能支持按钮名称修改与实时告警触发。用户可直接复现端到端检测系统深入理解目标检测模型部署、GUI交互逻辑设计及工业场景落地关键环节。 工地上的安全帽检测我最早是拿OpenCV加HOG特征硬怼的效果嘛勉强能用但一到晚上、逆光、遮挡稍微多一点误报率直接起飞。后来换成YOLOv5再用PyQt5把推理结果包成一个桌面程序配合危险区域入侵告警整个系统的实用性和可交付程度才真正拉满。这套“智慧工地项目-基于YOLOv5和PyQt5的安全帽佩戴检测系统及危险区域入侵检测告警系统源码”本质上就是完整走通了从数据集制作、模型训练、GUI开发到部署交付全流程。适合正在做毕业设计、工地安防项目投标演示或者想把目标检测落地成桌面工具的同学参考源码里带了数据集、训练好的模型和部署说明比网上那些只有半截代码的分享实在得多。1. 项目整体拆解需求背景与系统架构1.1 工地安全管理的真实痛点工地安全管理的核心痛点就两条第一人是否按规定佩戴了安全帽第二人是否进入了不该进的危险区域。前者靠保安盯监控一个保安同时看十几路画面盯久了注意力必然下降后者靠物理围栏和警示牌但总有工人图省事翻越或者从缺口钻进去。这套项目解决的正是这两个问题用目标检测模型替代人眼盯屏幕用视频分析替代物理围栏的被动防护。检测到未戴安全帽或人员入侵危险区域时系统立即弹窗告警、语音提醒、写入日志能够把“事后追责”变成“事中干预”。从实际落地角度看这类系统最常见的应用场景是工地出入口、塔吊下方、基坑边缘、配电房周边等区域。1.2 系统整体框架与模块划分整个系统从结构上可以划分为五个核心模块视频输入模块支持本地视频文件回放和摄像头实时流接入摄像头通过RTSP协议取流。目标检测推理模块基于YOLOv5模型对视频帧中的行人进行识别并输出边界框、类别和置信度。安全帽佩戴判定模块对检测到的人员目标进一步分析其头部区域是否带有安全帽类别目标。危险区域入侵判定模块预先在画面中标注危险区域多边形通过判断人员边界框底部中心点是否落在该区域内来触发告警。GUI展示与告警模块基于PyQt5实现负责视频画面显示、检测结果叠加绘制、告警状态展示、日志记录与语音提醒。1.3 技术选型为什么是YOLOv5 PyQt5目标检测框架选择YOLOv5不用我多说社区生态成熟、部署资料多、训练和推理速度均衡特别是对小目标检测效果和显存占用控制都做得不错适合在普通办公电脑甚至边缘设备上跑。PyQt5则是Python桌面GUI开发的事实标准之一和YOLOv5同属Python生态集成成本低信号槽机制天然适合处理视频帧刷新、告警事件这类异步消息。很多人在做类似项目时喜欢把Web前端Vue/React和后端Flask/FastAPI拆开做但实际在工地这种局域网环境下一套桌面程序往往更实用。不需要装Node环境、不需要配Nginx一台Windows工控机上装好Python环境和依赖库就能跑现场维护人员的学习成本也低得多。2. 安全帽佩戴检测YOLOv5模型训练全流程2.1 数据集准备与标注这个项目自带的数据集里包含安全帽helmet和行人/头部head等类别的标注。如果自己扩充数据需要注意几个关键点图片分辨率不能太低建议不小于640x640否则小尺寸的安全帽目标在缩放后特征会丢失。标注框要贴合目标边缘尤其是安全帽这种小目标标注框稍微大一圈在计算IoU时就会明显影响mAP。需要覆盖不同角度、不同光照、不同颜色安全帽的样本。红色、黄色、蓝色、白色安全帽都尽量收集否则模型容易对特定颜色过拟合。标注工具建议用LabelImg或Labelme导出YOLO格式txt文件每行类别id x_center y_center width height均为归一化坐标。注意类别id要从0开始编号且要和data.yaml文件中的类别顺序严格对应。2.2 模型训练关键参数与实操训练时项目默认使用YOLOv5s作为主干模型这个选择很务实。YOLOv5m虽然精度更高但推理速度会明显下降在只有CPU或者低端GPU的工地上v5s往往是最合适的选择。核心训练参数如下img-size640这是检测精度和速度的平衡点。batch-size16如果显存不够降到8或4同时可以开启梯度累积。epochs100对于安全帽这类类别少且特征明显的任务100轮基本收敛。如果发现验证集损失还在下降可以适当延长到150轮。预训练权重使用YOLOv5s.pt作为初始权重在COCO预训练基础上做迁移学习收敛速度远快于从头训练。训练命令参考python train.py --img 640 --batch 16 --epochs 100 --data dataset/data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name helmet_run这里有个容易踩的坑data.yaml中的nc类别数量和names类别名称列表必须写对。很多人训练时报错“AssertionError: class numbers must match”基本都是这两个字段和标注文件对不上导致的。2.3 模型评估与导出训练完成后先用val.py验证模型在测试集上的表现主要看三个指标mAP0.5、mAP0.5:0.95、Precision/Recall。对安全帽检测来说mAP0.5能达到85%以上基本就够用了。模型导出为TorchScript或ONNX格式可以脱离原始训练环境运行。导出命令model.model[-1].export True torch.onnx.export(model, im, best.onnx, opset_version12)实际部署时建议导出TorchScript格式PyTorch原生支持不用额外装ONNX Runtime减少依赖冲突。3. PyQt5桌面端从模型输出到可视化告警3.1 GUI整体布局设计PyQt5界面参考了典型监控客户端的布局方式左侧为视频流显示区域右侧为检测信息面板底部为告警日志栏。检测信息面板展示当前帧人数、已戴安全帽人数、未戴安全帽人数、区域内人数以及告警状态。这个布局的好处是信息层级清晰现场操作人员扫一眼就能掌握当前安全态势。重点说下画面显示的实现。OpenCV读取的帧是BGR格式的而Qt中QLabel显示图片需要RGB格式的QImage这里必须做一次转换rgb_image cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2RGB) h, w, ch rgb_image.shape bytes_per_line ch * w q_image QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888) self.label_video.setPixmap(QPixmap.fromImage(q_image))3.2 实时检测线程与主界面解耦这是整个GUI开发里最重要的一环。如果直接在Qt主线程里跑模型推理界面必然卡死视频画面会一帧一帧地掉严重影响使用体验。正确做法是单独开一个工作线程负责取流和推理推理完成后通过信号把结果发回主线程刷新界面。几个关键实现要点工作线程内部用while True循环持续读帧配合time.sleep控制帧率。推理结果通过pyqtSignal发送参数类型需要提前声明好。推荐发送一个字典{frame: q_image, detections: list, alert: bool}。线程退出要用标志位控制不要直接terminate()否则容易造成资源泄漏或Qt崩溃。模型加载只做一次放在__init__中完成不要在每一帧都调用torch.load()。3.3 告警联动弹窗、语音、日志告警模块的设计决定了系统能否真正用在工地上。我在做这个项目时告警分为三个层次第一层是界面告警。检测到未戴安全帽或区域入侵时视频画面上的目标框变红同时在右侧信息面板显示红色告警条。第二层是语音提醒。通过PyQt5的QSound或playsound库播放预先录制好的提示音“请佩戴安全帽”“警告您已进入危险区域”。语音提醒比弹窗更直观工人在远处也能听到。实测中语音提醒的威慑效果明显好于纯视觉弹窗。第三层是日志记录。告警事件写入本地CSV文件记录时间、摄像头编号、告警类型、置信度等信息。这一步很重要方便事后追溯和生成安全报表。4. 危险区域入侵检测方案对比与坐标判断实现4.1 红外对射、电子围栏与视频检测的对比危险区域防护方案常见的有三种红外对射传感器、电子围栏、视频检测。红外对射便宜但容易受天气和动物干扰且无法记录现场画面。电子围栏物理拦截效果好但施工成本高、维护麻烦。视频检测的优势是零额外硬件投入复用现有监控摄像头就能实现并且可以和人员检测、安全帽检测联动形成完整的行为分析链路。这个项目采用的是视频检测方案本质上就是“行人检测 坐标空间判断”两个步骤的组合。4.2 区域坐标标注与入侵判定算法危险区域在代码中的表示方式是多边形顶点坐标列表。在GUI中用户可以通过鼠标点击画面来标注危险区域标注结果保存为JSON文件里面记录每个区域的多边形顶点坐标。人员是否入侵的判断逻辑是取人员检测框底部中心点坐标判断该点是否落在危险区域多边形内部。为什么取底部中心点而不是检测框中心因为人站立时检测框底部中心点更接近人脚的实际位置如果检测框中心会出现人站在区域外但上半身“伸入”区域内部导致的误报。点是否在多边形内的判断使用射线法def point_in_polygon(point, polygon): x, y point n len(polygon) inside False p1x, p1y polygon[0] for i in range(1, n 1): p2x, p2y polygon[i % n] if min(p1y, p2y) y max(p1y, p2y) and x max(p1x, p2x): if p1y ! p2y: xinters (y - p1y) * (p2x - p1x) / (p2y - p1y) p1x if p1x p2x or x xinters: inside not inside p1x, p1y p2x, p2y return inside这个方法几十行代码就能实现不需要引入shapely等库在Python环境里直接跑。实测在640x640分辨率下每帧判断几十个人物目标的多边形包含关系耗时几乎可以忽略。4.3 与安全帽检测的联动逻辑单看“未戴安全帽”和“区域入侵”是两个独立事件但联动起来价值更大。比如检测到人员进入危险区域且未戴安全帽告警等级直接升级为“严重告警”语音提示语也要对应变化。这个逻辑在代码里非常容易实现只需要在告警判断函数里同时检查两个条件。联动还能降低误报率。试想一个场景画面边缘出现一个工作人员被局部截断检测框只框住了上半身此时头部区域判定不可靠如果强行判定未戴安全帽就会误报。合理做法是当检测框宽度或高度小于设定阈值时跳过安全帽判定。实际项目中这类边界情况比想象中多提早处理能省大量调优时间。5. 训练环境搭建与部署避坑实录5.1 环境配置常见坑YOLOv5官方要求的Python版本是3.8及以上但实际测试中Python 3.10以上偶尔会出现torch.utils.cpp_extension相关的编译报错最稳妥的还是用Python 3.8或3.9。PyQt5安装很简单pip install PyQt5即可。但要注意在部分Linux环境下还需要额外安装libgl1和libegl1否则程序启动会报Qt Platform Plugin xcb错误。Windows下相对省心但PyQt5的版本建议锁定在5.15系列不要用5.12这种老版本否则在高分屏下的显示效果会明显发虚。依赖安装推荐直接使用项目自带的requirements.txtpip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple5.2 训练效果不佳时的排查思路很多人在训练安全帽模型时遇到检测精度不高的问题我整理了排查顺序先看训练日志中loss曲线。如果box_loss和cls_loss下降缓慢或不下降优先怀疑数据集标注质量比如框偏移、类别标错。再看验证集图片的实际预测效果。如果安全帽目标经常被漏检考虑增加安全帽小目标样本数量。如果误报率高把置信度阈值从默认的0.25提高到0.4或0.5工地区域误报的代价往往比漏报的代价更可控。如果正负样本极度不均衡比如未戴安全帽样本很少可以在train.py中调整类别权重或者用mosaic和mixup数据增强增加样本多样性。5.3 模型导出与GPU/CPU推理性能对比模型训练用的GPU建议显存不低于6GB。如果没有GPU用CPU训练也可以但训练时间会大幅增加建议减小模型规模到YOLOv5n并降低输入分辨率到416。推理性能实测数据供参考部署环境模型版本输入分辨率推理速度NVIDIA GTX 1660 TiYOLOv5s640x640约8ms/帧NVIDIA RTX 3060YOLOv5s640x640约5ms/帧Intel i5-10400 CPUYOLOv5s640x640约120ms/帧Intel i5-10400 CPUYOLOv5n416x416约45ms/帧CPU推理如果不做任何优化跑v5s实际帧率只有8帧左右勉强能看。如果现场是普通电脑建议把线程中设置推理间隔时间或者降低画面刷新频率保证界面不卡顿。6. 数据集与源码结构说明6.1 源码目录结构解析项目源码压缩包打开后核心目录结构如下├── dataset/ # 数据集 │ ├── images/ # 训练和验证图片 │ ├── labels/ # YOLO格式标注文件 │ └── data.yaml # 数据集配置文件 ├── models/ # YOLOv5模型定义 ├── weights/ # 训练好的模型权重 │ └── best.pt # 最优模型权重 ├── utils/ # 工具函数 ├── gui/ │ ├── main_window.py # PyQt5主窗口 │ ├── detection_thread.py # 检测线程 │ ├── region_editor.py # 危险区域标注工具 │ └── alert_manager.py # 告警管理 ├── configs/ │ └── config.yaml # 项目配置文件 ├── requirements.txt # 依赖库列表 └── README.md # 部署说明这种目录划分是相对规范的。数据集、模型权重、GUI代码、配置文件分离后续换数据集或换模型时不需要改动GUI逻辑代码。6.2 数据增强策略项目自带数据集里的图片数量如果不够大数据增强就是提升模型泛化能力的关键。YOLOv5内置了丰富的增强策略在超参数文件hyp.scratch-low.yaml中可以调整hsv_h、hsv_s、hsv_v分别控制色调、饱和度、亮度的随机扰动幅度。工地上不同时间段的阳光色温差别很大适当调大HSV扰动可以增强模型对光照变化的适应性。fliplr: 0.5表示水平翻转概率可以提高模型对左右方向的鲁棒性。mosaic: 1.0是YOLOv5最强的增强手段多张图拼接训练对小目标检测特别友好。建议在训练时优先保证mosaic开启关闭mixup工地场景中mixup生成的融合图像容易干扰小目标特征学习。7. 常见问题与排查技巧速查表问题现象可能原因解决方案导入PyQt5时报错“could not load Qt platform plugin xcb”Linux环境缺少图形库安装libgl1、libegl1、libxkbcommon等依赖视频画面卡顿严重检测在主线程执行将推理逻辑迁移到QThread工作线程模型检测不到小目标安全帽训练时输入分辨率过低或小目标样本少提高img-size到640增加小目标样本未戴安全帽误报率高置信度阈值过低将conf-thres提高到0.4-0.5训练时报错类别数量不匹配data.yaml中nc或names配置错误检查data.yaml与标注文件的类别一致性运行时提示找不到best.pt模型权重路径配置错误修改config.yaml中的模型路径语音播放卡顿playsound阻塞主线程用QThread独立播放或改用QSound打开摄像头失败RTSP地址不可达用VLC或ffmpeg验证视频流是否正常推理速度过慢使用了过大的模型或未启用GPU切换YOLOv5n模型或用NVIDIA GPU运行界面中文显示乱码字体不支持和编码问题统一使用UTF-8编码并设置中文字体最后再分享一个实际项目里的小技巧告警截图的自动保存。在告警触发时同步保存一张带检测框的截图按日期和告警类型分目录存储。这个功能代码量不大但对后期安全审查和领导汇报特别有用别人还在翻日志的时候你已经能直接把现场截图甩到项目群里了。如果后续想扩展的话可以在这个框架上加人脸识别、区域人数统计、工装穿戴检测、甚至接入工地闸机联动底层的YOLOv5检测和PyQt5界面框架都不用动扩展性是很强的。本文还有配套的精品资源点击获取