产品咨询:19113907060(耿女士)
联系我们
产品咨询

工地智能监控:安全帽识别 AI算法从训练到落地

作者:万物纵横
发布时间:2026-03-03 09:55
阅读量:

一、整体方案思路


安全帽识别本质是目标检测任务(识别图片/视频中人头区域是否佩戴安全帽),完整流程分为:


1. 数据准备(采集、标注、预处理)


2. 模型选择与训练(基于成熟框架快速调参)


3. 模型优化(轻量化、精度调优)


4. 落地部署(边缘设备/云端)


5. 系统集成(对接监控硬件、告警系统)


二、各阶段实操落地


1. 数据准备(核心基础)


(1)数据采集


数据源:工地实拍视频帧(不同光线、角度、施工场景)、公开安全帽数据集(如HelmetV2、SafetyHelmet-Dataset)


数据量要求:至少1000张标注样本(建议2000+,覆盖不同场景)


数据格式:JPG/PNG图片,分辨率建议1080P以内(平衡精度和速度)


(2)数据标注


标注工具:LabelImg(轻量免费)、LabelMe、LabelStudio(支持团队协作)


标注规则:


类别定义:helmet(佩戴安全帽)、no_helmet(未佩戴安全帽)


标注框:精准框住人头区域(而非全身)


标注格式:PASCAL VOC(XML)或YOLO(TXT)(推荐YOLO格式,训练效率更高)


(3)数据预处理


import os
import cv2
import numpy as np
from sklearn.model_selection import train_test_split

# 1. 数据增强(提升模型泛化能力)
def augment_image(image, bboxes):
   """
   简单数据增强:随机翻转、亮度调整
   image: 输入图片
   bboxes: 标注框 [x1, y1, x2, y2, class]
   """
   # 随机水平翻转
   if np.random.rand() > 0.5:
       image = cv2.flip(image, 1)
       h, w = image.shape[:2]
       # 调整标注框坐标
       for bbox in bboxes:
           x1, y1, x2, y2, cls = bbox
           new_x1 = w - x2
           new_x2 = w - x1
           bbox[0], bbox[2] = new_x1, new_x2
   
   # 随机亮度调整
   if np.random.rand() > 0.5:
       alpha = np.random.uniform(0.7, 1.3)  # 亮度系数
       image = cv2.convertScaleAbs(image, alpha=alpha, beta=0)
   
   return image, bboxes

# 2. 数据集划分(训练集/验证集 9:1)
def split_dataset(img_dir, label_dir, save_dir):
   os.makedirs(os.path.join(save_dir, 'train/images'), exist_ok=True)
   os.makedirs(os.path.join(save_dir, 'train/labels'), exist_ok=True)
   os.makedirs(os.path.join(save_dir, 'val/images'), exist_ok=True)
   os.makedirs(os.path.join(save_dir, 'val/labels'), exist_ok=True)
   
   # 获取所有图片文件名
   img_files = [f for f in os.listdir(img_dir) if f.endswith(('.jpg', '.png'))]
   train_files, val_files = train_test_split(img_files, test_size=0.1, random_state=42)
   
   # 复制文件到对应目录
   def copy_files(files, split):
       for f in files:
           # 复制图片
           src_img = os.path.join(img_dir, f)
           dst_img = os.path.join(save_dir, split, 'images', f)
           cv2.imwrite(dst_img, cv2.imread(src_img))
           
           # 复制标注文件
           label_file = f.replace('.jpg', '.txt').replace('.png', '.txt')
           src_label = os.path.join(label_dir, label_file)
           dst_label = os.path.join(save_dir, split, 'labels', label_file)
           with open(src_label, 'r') as fr, open(dst_label, 'w') as fw:
               fw.write(fr.read())
   
   copy_files(train_files, 'train')
   copy_files(val_files, 'val')
   print(f"数据集划分完成:训练集{len(train_files)}张,验证集{len(val_files)}张")

# 调用示例
# split_dataset('data/raw/images', 'data/raw/labels', 'data/processed')


2. 模型选择与训练


(1)模型选型(兼顾精度和速度)


模型

特点

适用场景

YOLOv8n/s

轻量、速度快、精度适中

边缘设备(摄像头/NVR

YOLOv8m/l

精度高、速度稍慢

云端/高性能服务器

YOLOv5

部署生态成熟、资料多

快速落地验证


推荐优先使用YOLOv8(Ultralytics官方维护,开箱即用)。


(2)模型训练(基于YOLOv8)


前置条件:


# 安装依赖
pip install ultralytics opencv-python pillow numpy


训练代码:


from ultralytics import YOLO

# 1. 加载预训练模型(基于COCO数据集的预训练权重,加速收敛)
model = YOLO('yolov8n.pt')  # 轻量版,边缘部署优先;yolov8s.pt为标准版

# 2. 配置数据集yaml文件(示例:helmet.yaml)
"""
# helmet.yaml内容
path: ./data/processed  # 数据集根目录
train: train/images     # 训练集图片路径
val: val/images         # 验证集图片路径

# 类别
names:
 0: helmet
 1: no_helmet
"""

# 3. 开始训练
results = model.train(
   data='helmet.yaml',  # 数据集配置文件
   epochs=100,          # 训练轮数(根据验证集精度调整)
   batch=16,            # 批次大小(根据GPU显存调整,1080Ti建议16-32)
   imgsz=640,           # 输入图片尺寸
   lr0=0.01,            # 初始学习率
   device=0,            # GPU编号(CPU用cpu)
   patience=20,         # 早停策略(20轮精度不提升则停止)
   save=True,           # 保存最佳模型
   project='runs/helmet',# 结果保存目录
   name='helmet_detect' # 实验名称
)

# 4. 模型验证
metrics = model.val()  # 输出mAP、Precision、Recall等指标
print(f"验证集mAP50: {metrics.box.map50:.2f}")  # 目标:mAP50>0.9

# 5. 模型导出(保存为pt格式,后续用于部署)
model.export(format='onnx')  # 导出ONNX格式,适配边缘推理框架


3. 模型优化(落地关键)


工地场景多为边缘设备(如摄像头、工控机),需优化模型速度和体积:


1. 模型轻量化:


使用YOLOv8n(体积仅6MB,推理速度<10ms/帧)


量化:将FP32模型转为INT8(体积减少75%,速度提升2-3倍)


# YOLOv8量化示例
model = YOLO('runs/helmet/helmet_detect/weights/best.pt')
model.export(format='onnx', int8=True)  # 导出INT8量化的ONNX模型


2. 推理优化:


使用OpenVINO/TensorRT加速推理(适配Intel/英伟达边缘设备)


降低输入分辨率(如640→480,速度提升,精度损失<5%)


4. 落地部署(两种主流方案)


方案1:边缘部署(推荐,低延迟)


部署到工地摄像头/工控机,实时分析视频流:


import cv2
from ultralytics import YOLO

# 加载训练好的模型
model = YOLO('runs/helmet/helmet_detect/weights/best.pt')

# 打开摄像头/视频流(工地摄像头通常为RTSP协议)
cap = cv2.VideoCapture("rtsp://admin:123456@192.168.1.100:554/stream1")  # 替换为实际RTSP地址

# 告警阈值(连续n帧检测到未佩戴安全帽则触发告警)
ALARM_THRESHOLD = 3
no_helmet_count = 0

while cap.isOpened():
   ret, frame = cap.read()
   if not ret:
       break
   
   # 模型推理(设置conf=0.5过滤低置信度结果)
   results = model(frame, conf=0.5, imgsz=640)
   
   # 解析结果并绘制标注
   annotated_frame = results[0].plot()
   
   # 检测是否有未佩戴安全帽的情况
   detections = results[0].boxes
   no_helmet_detected = any([model.names[int(cls)] == 'no_helmet' for cls in detections.cls])
   
   # 告警逻辑
   if no_helmet_detected:
       no_helmet_count += 1
       if no_helmet_count >= ALARM_THRESHOLD:
           # 触发告警(可对接声光报警器、短信通知、平台推送等)
           cv2.putText(annotated_frame, "ALARM: NO HELMET!", (50, 50),
                       cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
           # 这里可添加告警接口调用代码(如调用短信API、MQTT推送等)
   else:
       no_helmet_count = 0
   
   # 显示实时画面
   cv2.imshow('Helmet Detection', annotated_frame)
   
   # 按q退出
   if cv2.waitKey(1) & 0xFF == ord('q'):
       break

cap.release()
cv2.destroyAllWindows()


方案2:云端部署(适合集中管理)


1. 边缘摄像头将视频帧推送到云端服务器;


2. 云端部署模型推理服务(如FastAPI+YOLOv8);


3. 推理结果存储到数据库,前端可视化展示。


# 云端推理API示例(FastAPI)
from fastapi import FastAPI, UploadFile, File
from ultralytics import YOLO
import cv2
import numpy as np

app = FastAPI(title="Helmet Detection API")
model = YOLO('runs/helmet/helmet_detect/weights/best.pt')

@app.post("/detect")
async def detect_helmet(file: UploadFile = File(...)):
   # 读取上传的图片
   contents = await file.read()
   nparr = np.frombuffer(contents, np.uint8)
   frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
   
   # 模型推理
   results = model(frame, conf=0.5)
   
   # 解析结果
   detections = []
   for box in results[0].boxes:
       cls = model.names[int(box.cls)]
       conf = float(box.conf)
       x1, y1, x2, y2 = map(int, box.xyxy[0])
       detections.append({
           "class": cls,
           "confidence": conf,
           "bbox": [x1, y1, x2, y2]
       })
   
   # 判断是否有未佩戴安全帽的情况
   has_no_helmet = any([d['class'] == 'no_helmet' for d in detections])
   
   return {
       "detections": detections,
       "alarm": has_no_helmet,
       "message": "No helmet detected!" if has_no_helmet else "All helmets are worn correctly."
   }

# 启动命令:uvicorn app:app --host 0.0.0.0 --port 8000


5. 系统集成与落地注意事项


1. 硬件适配:


边缘设备:推荐NVIDIA Jetson Nano/Xavier(GPU加速)、Intel酷睿工控机(OpenVINO加速)


摄像头:选择支持RTSP、低码率、夜间补光的工业摄像头


2. 告警系统:


本地告警:声光报警器(通过GPIO/串口控制)


远程告警:短信/电话通知(对接阿里云/腾讯云短信API)、平台推送(对接工地管理平台)


3. 稳定性保障:


加入异常处理(摄像头断连自动重连、模型推理超时重试)


定期更新数据集(补充新场景数据,迭代模型)


部署监控脚本(监控推理服务CPU/GPU使用率、告警日志)


总结


1. 核心流程:安全帽识别落地的关键是「数据为王+模型轻量化+边缘部署」,优先用YOLOv8轻量版快速验证,再根据场景优化精度和速度;


2. 落地重点:边缘部署可降低延迟和网络依赖,是工地场景的最优选择,需适配工业摄像头和边缘硬件;


3. 工程化关键:完善告警逻辑、异常处理和数据迭代机制,保障系统7×24小时稳定运行。

- END -
分享:
留言 留言 试用申请
产品咨询 产品咨询 产品咨询
19113907060(耿女士)
技术咨询 技术咨询 技术咨询
18982151213(刘先生)
微信在线客服 微信在线客服 在线客服
返回官网顶部 返回官网顶部 回到顶部
关闭窗口
产品订购
  • *

  • *

  • *

  • *

  • *