☰
基于 YOLO26 的工业场景安全帽佩戴检测系统 | 附完整源码分享
2026/10/22 7:28:46 网站建设 项目流程

基于 YOLO26 的工业场景安全帽佩戴检测系统:从模型到 Streamlit 全流程实战

关键词:YOLO26、安全帽检测、工业安全、目标检测、Streamlit、Ultralytics

一、背景

1.1 行业痛点

安全帽是工地与车间的第一道生命防线,但佩戴合规性检查长期依赖人力,存在三个老大难问题:

  1. 人工巡检有死角:安全员不可能同时盯住所有作业面,临时进场、夜班时段、交叉作业区域最容易漏管;
  2. 监控回放滞后:传统视频监控只能事后查证,违规佩戴已经发生,处罚代替不了预防;
  3. 合规台账难沉淀:谁没戴、哪个时段高发,缺乏结构化数据,安全例会只能凭印象说话。

把摄像头 + AI 视觉感知接到作业面后,用一台普通工控机就能实时识别画面中的安全帽并区分类型,为安全员、班组与企业安监提供一个可量化、可追溯的合规检查底座。本项目就是这条路线下的一个完整落点:基于YOLO26n,识别「工业安全帽 / 安全帽」两类目标,并提供一个开箱即用的 Streamlit 可视化界面。

视频演示与源码下载

https://www.bilibili.com/video/BV1VFnK6FEZe/


包含:
📦完整项目源码
📦预训练模型权重
🗂️数据集

1.2 项目运行效果

  • *Web 界面总览

  • *单张图片识别效果

  • *批量图片合规检查

1.3 项目介绍

核心创新点:

维度设计
类目设计两类安全帽分开标注(工业安全帽 / 安全帽,nc=2),适配多工种混合作业面
模型选型YOLO26n,Anchor-Free 轻量架构,CPU 单图 < 100 ms,可部署在工地 / 厂区边缘盒子
部署形态Streamlit 单页应用 + 本地 best.pt,零依赖中间件,便于离线现场部署
输入兼容图片 / 批量图片(含 zip)/ 视频 / 摄像头四种输入复用同一推理引擎
适配场景工地、生产车间、厂区出入口三类场景均已覆盖

功能概览:

  • 🪖单图检测:上传作业面画面 → 实时返回带框图 + 类别 / 置信度 / 坐标明细
  • 📚批量检测:单次最多 200 张,输出汇总表 + 合规统计 + zip 下载
  • 🎬视频检测:mp4 / avi / mov / mkv 通通可读,逐帧推理后落盘新视频
  • 📷摄像头实时检测:可对接工地 / 车间 IPC 的 RTSP 流,做实时佩戴感知

2 种目标类别:

类别描述
工业安全帽工业作业场景中佩戴的防护安全帽
安全帽通用 / 其他场景下的安全帽目标

技术栈:

层选型
模型框架Ultralytics + PyTorch
视觉算法YOLO26n(Anchor-Free,C2f Backbone,Decoupled Head + DFL)
Web 前端Streamlit + 自定义 HTML 主题(橙金配色,呼应工业安防风)
视频 / 图像OpenCV、imageio-ffmpeg
数据可视化Streamlit 原生 chart / Pandas
配置管理单一configs/project.yaml,行业话术 / UI / 推理阈值统一收口

二、设计框架

2.1 系统架构

┌──────────────────────────────────────────┐ │ Streamlit Web 前端(单页 SPA) │ │ · 安防控制台 / 单图 / 批量 / 视频 / 摄像头 │ │ · 侧栏 · 阈值 · 目标图鉴 · 模型缓存 │ └────────────────────┬─────────────────────┘ │ Python 调用 ▼ ┌──────────────────────────────────────────┐ │ 推理服务层(infer_image_path 等) │ │ · bytes / Path / frame → tensor │ │ · 推理结果 → 标注图 + DataFrame │ └────────────────────┬─────────────────────┘ │ ▼ ┌──────────────────────────────────────────┐ │ YOLO26n 推理引擎(model/best.pt) │ │ Backbone (C2f+SPPF) → Neck (FPN/PAN) │ │ → Decoupled Head(DFL + cls) │ └────────────────────┬─────────────────────┘ │ ▼ (可对接:门禁闸机 / 广播系统 / 安监看板)

2.2 YOLO26 网络结构

输入 640×640×3 │ ▼ [Backbone] Conv → C2f → Conv → C2f → Conv → C2f → Conv → C2f → SPPF 多尺度卷积 + 跨阶段特征融合,对远近不同尺寸的安全帽更稳 │ ▼ [Neck] FPN 上采样 + PAN 下采样:P3 / P4 / P5 三级金字塔 近处安全帽 → P3 层;远景小目标 → P4/P5 │ ▼ [Head] Decoupled Head(cls 头 / reg 头解耦) 回归头采用 DFL(Distribution Focal Loss) Anchor-Free,输出 (cx, cy, w, h, cls × 2) │ ▼ [NMS] iou=0.7, conf=0.30 → 最终检测框

2.3 检测流程

作业面摄像头帧 / 单张图片 │ ▼ Letterbox 640×640 + RGB │ ▼ YOLO26n forward │ ▼ Detect Head 输出 (cls × 2) │ ▼ conf 过滤 + NMS │ ▼ result.plot() 画框 + "工业安全帽 / 安全帽" │ ▼ Streamlit 双列展示 + DataFrame + 类别统计 │ ▼ (可扩展:未佩戴人头配对判定 → 违规名单 / 告警联动)

三、代码结构(核心 50 行 + 解析)

项目目录:

工业场景安全帽佩戴检测系统/ ├── app/streamlit_app.py # Web 入口 ├── configs/project.yaml # 行业话术 / UI / 训练 / 推理参数 ├── model/best.pt # 训练好的 YOLO26n 权重 ├── dataset/ # train / valid / test 数据集 ├── train/ # 训练产物(results.csv / 曲线图 / 混淆矩阵) └── scripts/ # train / validate / export 等通用脚本

最核心的 50 行——模型加载 + 单图推理 + 批量 / 视频复用同一引擎:

# === 1. 配置驱动:置信度 / iou / 批量上限全部从 project.yaml 读取 ========PROJECT_ROOT=Path(__file__).resolve().parent.parent APP_CONFIG=load_yaml(PROJECT_ROOT/"configs"/"project.yaml")DEFAULT_CONF=float(APP_CONFIG.get("inference",{}).get("conf",0.30))# === 2. 模型加载(带 streamlit 资源缓存,避免每次刷新重载)============@st.cache_resource(show_spinner=False)defload_model(model_path:str)->YOLO:returnYOLO(model_path)# === 3. 单图推理:路径 → 标注图 + 检测明细 DataFrame ===================definfer_image_path(model:YOLO,image_path:Path,conf:float)->tuple:result=model.predict(str(image_path),conf=conf,verbose=False)[0]annotated=result.plot()# BGR ndarray,已画框rows=[]ifresult.boxesisnotNone:forboxinresult.boxes:cls_id=int(box.cls.item())x1,y1,x2,y2=[float(v)forvinbox.xyxy[0].tolist()]rows.append({"class_id":cls_id,"class_name":result.names[cls_id],# "工业安全帽" / "安全帽""confidence":round(float(box.conf.item()),4),"x1":round(x1,1),"y1":round(y1,1),"x2":round(x2,1),"y2":round(y2,1),})# BGR → RGB 给 Streamlit;rows 转 DataFrame 给表格组件returnannotated[:,:,::-1],pd.DataFrame(rows)# === 4. bytes → 临时文件 → 复用同一函数 ================================defrun_image_inference(model:YOLO,image_bytes:bytes,conf:float,suffix:str=".jpg"):withtempfile.NamedTemporaryFile(delete=False,suffix=suffix)asf:f.write(image_bytes);tmp=Path(f.name)try:returninfer_image_path(model,tmp,conf)finally:tmp.unlink(missing_ok=True)

5 段解析:

  1. project.yaml + get("conf", 0.30)把置信度、iou、批量上限全部从配置读取,安全员侧针对工地 / 车间 / 厂区分别标定阈值时不用改一行代码。
  2. @st.cache_resource把YOLO(model_path)的耗时锁在第一次访问,首屏加载后单图响应稳定在百毫秒级,频繁巡检也不卡顿。
  3. result.plot()直接返回带颜色框 + 类别 + 置信度的BGR ndarray,两类安全帽对应两种颜色,一张图上多人也能一眼分清谁戴了哪种帽子。
  4. 把每个box的cls / conf / xyxy拍成dict再拼成DataFrame——后续表格、CSV 下载、类别占比统计、安全例会材料全部复用同一份结构。
  5. run_image_inference走临时文件而非 numpy 数组,是为了让 Ultralytics 内部的 EXIF / orientation 处理逻辑生效,对顶装 / 侧装摄像头不同朝向都更稳;批量、视频、摄像头三个入口复用同一套infer_image_path。

四、训练效果

模型在自建的工业安全帽数据集上训练(YOLO26n、640 输入、batch 16、200 epoch),best.pt对应指标如下:

指标数值
Precision0.977
Recall0.954
mAP@0.50.985
mAP@0.5:0.950.867

从训练曲线看,box / cls / dfl 三路 loss 快速收敛;mAP@0.5 高达0.985,两类安全帽均维持高精度高召回,类别间几乎无混淆(工业安全帽 / 安全帽外观差异明确)。值得一提的是mAP@0.5:0.95 达到 0.867——这意味着即使在严格 IoU 阈值下,模型对安全帽检测框中心位置的回归依然非常稳定,能够支撑后续"戴 / 未戴"配对判定与单人违规时长统计这类更细粒度的合规分析。

(原文此处为 PR 曲线截图 / 归一化混淆矩阵截图 / 训练曲线截图)

五、项目总结

做对了什么:

  • 两类安全帽分开标注,多工种混合作业面也能给出结构化合规数据,而非笼统的"检测到帽子";
  • 选择 YOLO26n 而非更大的 v8s/v8m,模型轻量、CPU 单图百毫秒内完成推理,可在工地 / 车间边缘盒子离线运行,不依赖云端;
  • 用一份project.yaml把"行业话术 / UI 主题色 / 训练超参 / 推理阈值 / 类别定义"全部收口,迁移到反光衣、护目镜等其他 PPE 检测只需替换数据集与重新训练。

还能怎么做:

  • 加入人头检测做"戴 / 未戴"配对判定,把"检出安全帽"升级为"检出未佩戴人员",直接输出违规名单;
  • 引入跟踪(ByteTrack / BoT-SORT)做跨帧关联,统计单人持续违规时长,过滤单帧闪烁误报;
  • 对接门禁闸机与广播系统,检出未佩戴即联动拦截提醒,形成"检出—告警—处置"闭环,这是当前工业安监最有落地价值的方向之一。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询