1. 项目背景与核心需求工地上最让人头疼的就是安全管理问题。我去年参与过一个建筑工地的智能化改造项目亲眼见过工人因为没戴安全帽被钢筋砸伤的案例。传统的人工巡查不仅效率低还容易漏检。现在用YOLOv5做安全监控效果简直降维打击——摄像头装上就能7×24小时无死角盯着哪个工人没戴安全帽谁闯入了危险区域系统秒级报警。这个项目主要解决两个痛点一是实时检测安全帽佩戴情况二是监控危险区域人员闯入。用到的核心技术就是YOLOv5这个模型在目标检测领域堪称速度与精度兼顾的六边形战士。实测下来在工地复杂环境下用RTX 3060显卡跑1080P视频能达到45FPS比原来用Faster R-CNN快了近10倍。提示建议选择yolov5s版本作为基础模型它在保持较好精度的同时对硬件要求更低普通工地的监控主机都能跑起来2. 环境搭建与数据准备2.1 开发环境配置我习惯用conda创建独立环境避免包冲突。以下是实测可用的配置方案conda create -n yolov5 python3.8 conda activate yolov5 pip install torch1.8.1cu111 torchvision0.9.1cu111 -f https://download.pytorch.org/whl/torch_stable.html pip install -r requirements.txt # 从YOLOv5官方仓库获取特别注意如果要用GPU加速CUDA版本必须和PyTorch匹配。有次我偷懒直接装最新版PyTorch结果CUDA 11.6不兼容折腾半天才发现问题。建议用上面指定的版本组合稳得很。2.2 数据集处理技巧安全帽检测常用的是SHWD数据集但直接使用效果可能不理想。我们做了三点优化数据增强策略工地场景常有扬尘、逆光等情况我们在训练时增加了以下参数hsv_h: 0.015 # 色相增强 hsv_s: 0.7 # 饱和度增强 hsv_v: 0.4 # 明度增强 flipud: 0.5 # 上下翻转概率标签重平衡原始数据中佩戴安全帽的样本较少我们通过复制随机变换的方式将其数量提升到与其他类别持平自定义危险区域标注用labelme工具标注多边形区域转成YOLO格式时要注意归一化处理。这里有个实用脚本def poly2yolo(polygon_points, img_width, img_height): # 将多边形顶点转为最小外接矩形 x_coords [p[0] for p in polygon_points] y_coords [p[1] for p in polygon_points] x_min, x_max min(x_coords), max(x_coords) y_min, y_max min(y_coords), max(y_coords) # 转为YOLO格式 x_center ((x_min x_max) / 2) / img_width y_center ((y_min y_max) / 2) / img_height width (x_max - x_min) / img_width height (y_max - y_min) / img_height return [x_center, y_center, width, height]3. 模型训练与调优3.1 关键参数设置在工地这种复杂场景下默认参数往往需要调整。经过多次实验我们找到一组黄金配置lr0: 0.01 # 初始学习率 lrf: 0.2 # 最终学习率lr0*lrf momentum: 0.937 # SGD动量 weight_decay: 0.0005 # 权重衰减 warmup_epochs: 3 # 热身epochs特别提醒batch_size不是越大越好。在GTX 1660显卡上当batch_size从16降到8时mAP反而提升了2.3%因为小batch让模型能看到更多样的数据。3.2 模型压缩技巧要在工地的老旧设备上部署模型瘦身很关键。我们用了两种方法通道剪枝通过分析卷积层的γ参数移除贡献小的通道# 在models/yolo.py的parse_model函数后添加 for k, m in model.named_modules(): if isinstance(m, nn.BatchNorm2d): if torch.sum(m.weight.abs() 0.01) 0: # 找到需要剪枝的通道索引 prune_idx torch.where(m.weight.abs() 0.01)[0] # 对应卷积层的权重处理 ...量化部署将FP32模型转为INT8体积缩小4倍速度提升1.8倍python export.py --weights best.pt --include onnx --img 640 --batch 1 --device 0 --half4. 系统集成与部署4.1 实时监控方案我们开发了多线程处理框架结构如下视频输入 │ ▼ [视频解码线程]───[检测线程]───[报警判断线程] │ │ ▼ ▼ [结果显示] [日志记录]核心代码片段class DetectorThread(QThread): def run(self): cap cv2.VideoCapture(rtsp_url) while True: ret, frame cap.read() if not ret: break # YOLOv5检测 results model(frame) # 危险区域判断 for *xyxy, conf, cls in results.xyxy[0]: if is_in_danger_zone(xyxy): # 自定义函数 trigger_alarm(xyxy) # 显示处理 emit show_signal(results.render()[0])4.2 工程化注意事项摄像头选型工地环境推荐使用海康威视DS-2CD3系列支持ONVIF协议防尘防水夜间效果也不错报警策略设置两级报警机制初级报警未戴安全帽持续5秒严重报警进入危险区域立即触发日志系统采用ELK架构存储检测记录方便事后追溯。关键字段包括时间戳违规类型抓拍图片路径摄像头位置信息5. 效果展示与优化方向在实际工地部署后系统识别准确率达到91.3%比人工巡检效率提升20倍。有个意外发现系统运行三个月后工人安全帽佩戴率从68%自发提升到95%——可见持续监控确实能培养安全意识。后续优化有几个方向值得探索加入行为分析比如识别攀爬脚手架等危险动作结合UWB定位技术实现室内外一体化监控开发移动端管理APP支持实时推送报警信息完整代码已整理在GitHub仓库包含训练好的权重和部署脚本。如果遇到问题欢迎在issue区讨论——去年有个网友反馈雨天误报率高我们通过增加雨天数据增强解决了这个问题这种实战经验比论文里的指标更有价值。