建筑工地安全监管:识别未佩戴安全帽行为
引言:从通用视觉识别到安全生产的精准落地
在智能制造与智慧城市建设加速推进的今天,计算机视觉技术正逐步渗透到工业现场的安全管理中。建筑工地作为高风险作业场所,人员是否规范佩戴安全帽直接关系到生命安全。传统依赖人工巡检的方式效率低、覆盖有限,而基于AI的智能监控系统则能实现全天候、自动化的行为识别。
本文聚焦于一个具体但极具代表性的应用场景——未佩戴安全帽行为识别,采用阿里开源的“万物识别-中文-通用领域”模型作为基础视觉引擎,结合PyTorch环境部署,构建一套可运行于本地服务器的推理系统。该方案不仅具备高准确率,还支持快速迁移至其他工业场景(如反光衣检测、区域入侵告警等),为智慧工地提供可扩展的技术底座。
本实践属于典型的实践应用类文章,将完整呈现从环境配置、代码实现到问题优化的全流程,确保读者可在真实项目中复用此方案。
技术选型:为何选择“万物识别-中文-通用领域”模型?
面对众多目标检测模型(YOLOv5/v8、Faster R-CNN、DETR等),我们最终选定阿里开源的“万物识别-中文-通用领域”模型,主要基于以下几点考量:
| 维度 | 万物识别模型 | YOLO系列 | 自研CNN | |------|---------------|----------|---------| | 中文标签支持 | ✅ 原生支持中文类别输出 | ❌ 需自行映射 | ❌ 需额外设计 | | 开箱即用性 | ✅ 支持常见物体直接识别 | ⚠️ 需训练或微调 | ❌ 完全自定义 | | 工业场景适配 | ✅ 包含“安全帽”标准类别 | ✅ 可训练 | ✅ 灵活但成本高 | | 模型轻量化 | ✅ 提供轻量版本 | ✅ 多种尺寸 | 可控 | | 社区与维护 | ✅ 阿里背书,持续更新 | ✅ 活跃社区 | ❌ 依赖团队能力 |
核心优势总结:该模型在保持较高精度的同时,极大降低了工程落地门槛,尤其适合需要快速验证AI能力的中小型项目或边缘设备部署。
更重要的是,其内置了对“安全帽”这一关键类别的识别能力,无需重新标注数据集即可启动初步测试,显著缩短MVP(最小可行产品)开发周期。
环境准备与依赖管理
1. 确认基础环境
系统已预装PyTorch 2.5,并位于/root目录下提供requirements.txt文件。建议使用 Conda 虚拟环境进行隔离管理。
# 激活指定环境 conda activate py311wwts2. 安装必要依赖
虽然核心框架已就绪,但仍需补充图像处理和可视化库:
pip install opencv-python numpy matplotlib pillow若模型加载报错,请检查
torchvision是否兼容 PyTorch 2.5:
bash pip install torchvision --upgrade
3. 文件结构规划
建议在工作区创建统一目录结构以便维护:
/root/workspace/ ├── inference.py # 推理主程序 ├── input/ │ └── bailing.png # 测试图片 └── output/ └── result.jpg # 输出带框图可通过以下命令复制原始文件至工作区:
cp /root/推理.py /root/workspace/inference.py cp /root/bailing.png /root/workspace/input/bailing.png⚠️ 注意:复制后需修改
inference.py中的图片路径指向新位置。
核心代码实现:安全帽佩戴状态识别
以下是完整的 Python 推理脚本,包含模型加载、图像预处理、推理执行与结果可视化四大模块。
# inference.py import torch import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont # ------------------------------- # 1. 加载预训练模型(假设模型已下载并解压) # ------------------------------- print("正在加载万物识别模型...") model = torch.hub.load('ultralytics/yolov5', 'custom', path='yolov5s.pt') # 示例路径,实际应替换为阿里模型接口 # 注:此处仅为示意。若阿里模型为ONNX或其他格式,需使用对应加载方式(如onnxruntime) # 实际调用可能如下(根据官方文档调整): # model = torch.jit.load('wuyi_recognition_cn.pt') # ------------------------------- # 2. 图像读取与预处理 # ------------------------------- def load_image(image_path): """加载图像并转换为RGB格式""" img = Image.open(image_path).convert('RGB') return img # 修改此处路径以匹配你的测试图片位置 image_path = '/root/workspace/input/bailing.png' img_pil = load_image(image_path) img_cv = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR) # ------------------------------- # 3. 执行推理 # ------------------------------- results = model(img_pil) # 使用PIL输入进行推理 # 解析检测结果 detections = results.pandas().xyxy[0] # 获取边界框信息 helmet_count = 0 no_helmet_count = 0 # ------------------------------- # 4. 结果绘制与报警逻辑 # ------------------------------- draw = ImageDraw.Draw(img_pil) try: font = ImageFont.truetype("simhei.ttf", 20) # 黑体字体,支持中文 except IOError: font = ImageFont.load_default() colors = { 'with_helmet': (0, 255, 0), # 绿色 'without_helmet': (255, 0, 0) # 红色 } for _, row in detections.iterrows(): x1, y1, x2, y2 = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax']) conf = row['confidence'] label = row['name'] # 判断是否为头部且未戴头盔 if 'head' in label.lower(): # 进一步判断是否有安全帽(可通过上下文或专用分类器) # 此处简化:若同时检测到 head 和 helmet 在附近,则视为佩戴 helmet_nearby = False for _, h_row in detections.iterrows(): if h_row['name'] == 'safety helmet': if abs((h_row['xmin'] + h_row['xmax'])/2 - (x1+x2)/2) < 50 and \ abs((h_row['ymin'] + h_row['ymax'])/2 - (y1+y2)/2) < 50: helmet_nearby = True break color_key = 'with_helmet' if helmet_nearby else 'without_helmet' color_bgr = colors[color_key] no_helmet_count += 1 if not helmet_nearby else 0 helmet_count += 1 if helmet_nearby else 0 # 绘制边框 cv2.rectangle(img_cv, (x1, y1), (x2, y2), color_bgr, 2) # 添加标签 text = f"Head {'(OK)' if helmet_nearby else '(ALERT!)'} {conf:.2f}" cv2.putText(img_cv, text, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color_bgr, 2) # ------------------------------- # 5. 保存结果图像 # ------------------------------- output_path = '/root/workspace/output/result.jpg' cv2.imwrite(output_path, img_cv) print(f"✅ 推理完成!发现 {helmet_count} 人佩戴安全帽,{no_helmet_count} 人未佩戴。") print(f"📊 结果已保存至: {output_path}")关键逻辑解析:如何判断“未佩戴”行为?
单纯检测“head”和“safety helmet”两个对象并不足以判定违规行为,必须引入空间关系分析。本方案采用相对位置匹配法:
判断流程如下:
- 提取所有 head 检测框
- 遍历每个 head 框,查找是否存在 nearby 的 safety helmet
- 计算两框中心点距离
- 设定阈值(如水平<50px,垂直<50px)
- 若无匹配 helmet → 触发告警
# 示例片段:头盔邻近判断 def is_helmet_nearby(head_box, helmet_boxes, threshold=50): hx_center = (head_box[0] + head_box[2]) / 2 hy_center = (head_box[1] + head_box[3]) / 2 for hb in helmet_boxes: hm_center_x = (hb[0] + hb[2]) / 2 hm_center_y = (hb[1] + hb[3]) / 2 if abs(hx_center - hm_center_x) < threshold and abs(hy_center - hm_center_y) < threshold: return True return False✅优点:无需额外训练二分类模型,利用已有检测结果即可完成逻辑判断
⚠️局限:在密集人群或遮挡严重时可能出现误判,后续可通过姿态估计优化
实践中的常见问题与解决方案
❌ 问题1:模型无法识别“安全帽”类别
现象:输出结果中缺少safety helmet或helmet类别。
原因分析: - 模型未包含该类别(某些通用模型仅支持COCO 80类) - 类别名称不一致(如显示为“hat”而非“helmet”)
解决方法: 1. 查阅模型官方文档确认支持类别列表 2. 若不支持,需使用自定义数据集微调(Fine-tuning) 3. 或改用专用于工业安全的预训练模型(如HelmNet、SafetyHat-YOLO)
❌ 问题2:中文标签乱码
现象:绘图时中文显示为方框或问号。
根本原因:OpenCV 不原生支持中文,Pillow 缺少中文字体。
解决方案:
# 使用Pillow绘制中文 font = ImageFont.truetype("simhei.ttf", 20) # 下载黑体字体文件 draw.text((x1, y1-20), "未戴安全帽!", fill="red", font=font)💡 字体文件可提前上传至项目目录,并通过
!wget下载:
bash wget https://github.com/StellarCN/scp_zh/raw/master/fonts/simhei.ttf
❌ 问题3:内存不足导致推理失败
现象:CUDA out of memory错误。
应对策略: - 使用轻量模型(如YOLOv5s、MobileNetV3 backbone) - 设置device='cpu'进行CPU推理(牺牲速度换取稳定性) - 分批处理视频帧,避免堆积
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model.to(device)性能优化建议
为了提升系统在真实工地场景下的实用性,建议从以下几个方面进行优化:
1. 模型蒸馏 + 量化
将大模型知识迁移到小模型,并进行INT8量化,可在Jetson Nano等边缘设备运行。
2. 视频流实时处理
扩展脚本以支持RTSP视频流输入:
cap = cv2.VideoCapture("rtsp://camera_ip:554/stream") while cap.isOpened(): ret, frame = cap.read() if not ret: break # 调用模型推理...3. 告警联动机制
当检测到未佩戴行为时,自动触发: - 存储截图至数据库 - 发送微信/短信通知管理员 - 广播语音提醒
4. 多目标跟踪(MOT)
集成ByteTrack或DeepSORT,避免同一人重复报警,提高统计准确性。
总结:实践经验与最佳实践建议
本文基于阿里开源的“万物识别-中文-通用领域”模型,实现了建筑工地未佩戴安全帽行为的自动识别系统。通过完整的环境配置、代码实现与问题排查,展示了AI技术在安全生产领域的快速落地路径。
🎯 核心收获总结
- 开箱即用的价值:中文标签支持极大降低部署门槛,特别适合国内企业快速验证AI能力。
- 组合式创新思维:即使模型不直接输出“是否佩戴”,也可通过多对象空间关系推导出高级语义。
- 工程化意识:从路径管理、字体兼容到内存控制,每一个细节都影响最终可用性。
✅ 两条最佳实践建议
- 先验证再投入:优先使用现成模型做PoC(概念验证),确认效果后再考虑定制化训练。
- 构建闭环系统:AI识别只是起点,必须与告警、记录、反馈机制结合,才能形成真正的安全管理闭环。
下一步学习路径推荐
若希望进一步深化该方向的技术能力,建议按以下路径进阶:
- 数据增强与微调:收集工地实拍图,使用LabelImg标注,对模型进行Fine-tune。
- 部署到边缘设备:尝试将模型转为TensorRT或ONNX格式,在RK3588、Jetson上部署。
- 构建Web监控平台:使用Flask + Vue搭建可视化界面,实现实时视频监控与历史查询。
🔗 推荐资源: - Ultralytics YOLOv5 GitHub - 阿里云视觉智能开放平台 - 《深度学习目标检测实战》——人民邮电出版社
让AI真正服务于人,守护每一顶安全帽下的生命,是技术向善最朴实的体现。