ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【免费】基于YOLO26的实时工地安全帽(头盔)佩戴目标检测系统(FastAPI+Vue3) 计算机视觉课程设计 机器学习毕业设计 YOLO 智慧工地 目标检测 锋哥原创出品,必属精品

2026/10/7 15:31:15 拓冰建站 浏览量
【免费】基于YOLO26的实时工地安全帽(头盔)佩戴目标检测系统(FastAPI+Vue3) 计算机视觉课程设计 机器学习毕业设计 YOLO 智慧工地 目标检测 锋哥原创出品,必属精品 大家好我是Java1234_小锋老师分享一套锋哥原创的基于YOLO26的实时工地安全帽(头盔)佩戴目标检测系统(FastAPIVue3)。项目介绍建筑施工现场人员密集、机械交叉作业多头部伤害在物体打击和坠落事故中占有较高比例。安全帽能够降低冲击伤害但仅依靠班前教育和人工巡检难以及时发现未佩戴人员。视频监控已经覆盖出入口、脚手架和加工区如果检测仍停留在事后回放现场处置就会滞后。把目标检测算法接到业务系统中使每一帧画面都能给出人员是否佩戴安全帽的结论是工地安全管理信息化的一项实际需求。本文设计并实现了基于YOLO26的实时工地安全帽佩戴目标检测系统。系统采用前后端分离结构。表示层使用Vue3、Vue Router、Pinia和Element Plus组织页面并用ECharts展示统计结果。接口层使用Python语言和FastAPI框架提供REST接口与WebSocket实时通道使用JWT维持登录状态。算法层调用Ultralytics中的YOLO26n权重完成人员、佩戴安全帽和未佩戴标记的检测再按人员框与头部区域把安全帽归属到具体人员。数据层使用MySQL 8库名为db_helmet业务表统一以t_开头保存用户、模型、检测记录、人员判定、告警、安全规范和日志。系统面向管理员和普通用户。普通用户可以注册、登录、维护个人资料和头像、修改密码并完成图片识别、视频识别和摄像头实时检测。管理员额外负责用户管理、模型管理、告警规则和日志审计。未佩戴人员按置信度匹配高、中、低三级规则并生成告警处理结果写回数据库。首页和统计分析页按日期汇总检测次数、佩戴人数和未处理告警。界面中的日期显示为2026-10-02这种形式日期时间显示为2026-10-02 17:25:17这种形式。测试围绕登录注册、三种检测方式、佩戴判定、告警处理和统计查询展开。结果表明系统能够完成从图像输入、模型推理、佩戴判定到告警闭环的主要流程适合作为工地安全帽佩戴检查的辅助手段也可作为目标检测与Web系统结合的本科毕业设计实现。源码下载链接: https://pan.baidu.com/s/1rR9vipZC-Br-BQe6qk_ZkA?pwd1234提取码: 1234系统展示核心代码根据人员佩戴结果生成未佩戴告警。 from datetime import datetime, timedelta from sqlalchemy.orm import Session from app.models.alarm import Alarm, AlarmRule from app.models.detect import PersonResult from app.service.helmet_service import NO_WEAR_LABEL def _list_rules(db: Session) - list[AlarmRule]: 查找启用中的未佩戴安全帽规则按置信度阈值从高到低排列。 rules ( db.query(AlarmRule) .filter(AlarmRule.enabled 1, AlarmRule.class_name NO_WEAR_LABEL) .order_by(AlarmRule.conf_threshold.desc()) .all() ) if rules: return rules fallback db.query(AlarmRule).filter(AlarmRule.enabled 1, AlarmRule.class_id 5).first() return [fallback] if fallback else [] def _match_rule(rules: list[AlarmRule], score: float) - AlarmRule | None: 按置信度匹配可触发的最高等级。置信度越高命中的告警等级越高。 for rule in rules: if score float(rule.conf_threshold): return rule return None def create_wear_alarms( db: Session, record_id: int, persons: list[PersonResult], dedup_seconds: int 0, ) - list[Alarm]: 对未佩戴人员按告警规则写入告警。 已佩戴只保留判定记录不产生告警。 置信度达到高等级阈值记为高达到中等级阈值记为中只达到低等级阈值记为低。 Args: db: 数据库会话 record_id: 检测记录ID persons: 已写入的人员判定 dedup_seconds: 实时检测去重间隔0 表示不去重 rules _list_rules(db) if not rules: return [] created: list[Alarm] [] for person in persons: if person.wear_status ! 未佩戴: continue conf float(person.confidence or 0) related_conf float(person.helmet_confidence or 0) score max(conf, related_conf) rule _match_rule(rules, score) if rule is None: continue if dedup_seconds 0: since datetime.now() - timedelta(secondsdedup_seconds) exists ( db.query(Alarm) .filter(Alarm.class_name NO_WEAR_LABEL, Alarm.alarm_time since, Alarm.status 未处理) .first() ) if exists: continue alarm Alarm( record_idrecord_id, person_result_idperson.id, class_nameNO_WEAR_LABEL, confidencescore, alarm_levelrule.alarm_level, alarm_timedatetime.now(), status未处理, ) db.add(alarm) created.append(alarm) if created: db.flush() return createdtemplate div classpage-card v-ifrecord h3 classpage-title记录详情/h3 el-descriptions :column3 border el-descriptions-item label文件{{ record.source_name }}/el-descriptions-item el-descriptions-item label类型{{ record.detect_type_text }}/el-descriptions-item el-descriptions-item label时间{{ record.detect_time }}/el-descriptions-item el-descriptions-item label人数{{ record.person_count }}/el-descriptions-item el-descriptions-item label已佩戴{{ record.wear_count }}/el-descriptions-item el-descriptions-item label未佩戴{{ record.no_wear_count }}/el-descriptions-item /el-descriptions img v-ifrecord.result_url record.detect_type ! video :srcrecord.result_url classresult alt结果图 / video v-ifrecord.result_url record.detect_type video :srcrecord.result_url controls classresult / h4人员佩戴判定/h4 el-table :datapersons stylewidth: 100% el-table-column propperson_index label人员 min-width80 / el-table-column propwear_status label状态 min-width100 / el-table-column propconfidence label人员置信度 min-width120 / el-table-column prophelmet_class_name label关联目标 min-width140 / el-table-column prophelmet_confidence label目标置信度 min-width120 / /el-table /div /template script setup import { onMounted, ref } from vue import { useRoute } from vue-router import { recordDetailApi } from /api/record const route useRoute() const record ref(null) const persons ref([]) onMounted(async () { const res await recordDetailApi(route.params.id) record.value res.data.record persons.value res.data.persons || [] }) /script style scoped .result { width: 100%; max-height: 460px; object-fit: contain; margin: 16px 0; background: #111; border-radius: 10px; } h4 { color: #102a43; } /style