这是一套基于 YOLOv8 的实时工地安全检测系统核心功能摄像头实时识别人员、检测是否佩戴安全帽 反光衣对违规人员独立跟踪、计时报警、统计人数全程 GPU 加速运行。效果演示安全帽反光衣识别我会分模块、逐段、通俗化给你讲清楚每一行代码的作用。关注私领源码和model.pt文件一、整体架构总览双模型分工YOLOv8n专门检测人员 跟踪人员 ID区分不同人自定义训练模型检测安全帽、反光衣核心逻辑找到人 → 看这个人身上有没有安全帽 反光衣 → 合规标绿色、违规标红色 → 违规计时 → 达到阈值报警 → 实时统计数据运行环境Python OpenCV Ultralytics YOLO GPU 加速二、逐部分代码解析1. 导入依赖库python运行from ultralytics import YOLO import cv2 import time import numpy as np from collections import defaultdictYOLO目标检测核心库加载模型、推理、跟踪cv2OpenCV处理摄像头画面、绘图、显示窗口time计时用于违规超时报警defaultdict智能字典存储每个人员独立的跟踪状态2. 配置参数可直接修改调优python运行# 配置参数 FRAME_SKIP 1 # 跳帧检测1不跳帧2每2帧检测1次提升流畅度 RESIZE_WIDTH 640 # 画面宽度 RESIZE_HEIGHT 480 # 画面高度 WARNING_TIME 2 # 违规持续2秒记1次警告 MAX_WARNING_COUNT 3 # 累计3次警告触发最终报警 CONFIDENCE 0.45 # 置信度阈值大于45%才认为检测有效 # ✅ 作用统一管理可调参数不用改核心代码就能优化效果。3. 主程序入口 加载模型python运行if __name__ __main__: # 加载模型GPU 加速 model_person YOLO(r路径\yolov8n.pt).to(cuda) model_helmet_vest YOLO(r路径\best.pt).to(cuda)model_person官方 YOLOv8n 模型只检测人classes[0]model_helmet_vest你自己训练的模型检测安全帽、反光衣.to(cuda)强制使用 GPU大幅提升运行速度4. 初始化摄像头python运行# 打开摄像头 cap cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, RESIZE_WIDTH) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, RESIZE_HEIGHT)0调用电脑默认摄像头设置分辨率统一画面大小保证检测稳定5. 人员跟踪状态字典核心多人独立管理python运行# 多人独立跟踪状态 track_info defaultdict(lambda: { violate_start: None, # 违规开始时间 warn_count: 0, # 警告次数 is_violating: False # 是否正在违规 }) total_alert_count 0 # 总报警次数 frame_count 0 # 帧计数器✅关键作用这是系统能区分不同人、单独计时报警的核心。每个人有独立的 ID违规时间、警告次数互不干扰。6. 主循环实时检测核心python运行while True: ret, frame cap.read() if not ret: break无限循环读取摄像头画面retFalse代表摄像头断开退出循环7. 跳帧优化保证流畅不卡顿python运行# 间隔帧检测提升流畅度 frame_count 1 if frame_count % FRAME_SKIP ! 0: cv2.imshow(窗口名, frame) if 按Q键: break continue不检测的帧直接显示画面不做 AI 计算算力低的电脑可以改FRAME_SKIP2速度翻倍8. 绘制危险区域python运行# 绘制危险区域 cv2.rectangle(frame, (0, 0), (w, h), (0, 0, 255), 2) cv2.putText(frame, DANGER ZONE, ...)全屏红色边框 文字提示当前是监控危险区域9. 双模型推理检测人 检测装备python运行# 检测 跟踪 results_person model_person.track(frame, classes[0], confCONFIDENCE, persistTrue, verboseFalse) results_hv model_helmet_vest(frame, confCONFIDENCE, verboseFalse) frame results_hv[0].plot(imgframe, labelsFalse, confFalse)model_person.track()检测人员 分配唯一 ID跟踪model_helmet_vest()检测安全帽、反光衣.plot()把检测结果画在画面上10. 人员装备匹配逻辑核心判断python运行for pid, box in zip(ids, boxes): x1, y1, x2, y2 box # 人员框坐标 has_helmet False has_vest False # 判断装备看安全帽/反光衣的中心点 是否在 人的框内 for hb in results_hv[0].boxes: hx1, hy1, hx2, hy2 装备坐标 hcx, hcy 装备中心点 if x1 hcx x2 and y1 hcy y2: if cid 0: has_helmet True if cid 1: has_vest True✅原理判断安全帽 / 反光衣的中心点是否落在人员的方框内在里面 → 这个人穿戴了装备不在 → 没穿戴11. 合规 / 违规标记python运行if has_helmet and has_vest: # 合规绿色框 Safe cv2.rectangle(..., (0,255,0), 2) safe_person 1 else: # 违规红色框 Danger cv2.rectangle(..., (0,0,255), 2) violate_person 1两个装备都有 → 安全缺一个 / 都缺 → 违规12. 独立报警逻辑最智能的部分python运行current_t time.time() for pid in ids: info track_info[pid] if info[is_violating]: if info[violate_start] is None: info[violate_start] current_t # 开始计时 # 持续违规2秒 → 记1次警告 if current_t - info[violate_start] WARNING_TIME: info[warn_count] 1 info[violate_start] current_t # 累计3次警告 → 触发报警 if info[warn_count] MAX_WARNING_COUNT: print(f ALERT: Person {pid} NOT SAFE!) total_alert_count 1 else: # 恢复合规 → 清空计时和警告 info[violate_start] None info[warn_count] 0✅报警规则人员开始违规 → 启动计时器持续违规2 秒→ 警告 1累计3 次警告→ 触发最终报警戴上装备 → 立即清空计时停止报警13. 实时数据统计显示python运行cv2.putText(frame, fTotal: {total_person}, ...) cv2.putText(frame, fSafe: {safe_person}, ...) cv2.putText(frame, fViolate: {violate_person}, ...) cv2.putText(frame, fAlert Tot: {total_alert_count}, ...)画面左上角显示总人数安全人数违规人数总报警次数14. 退出与资源释放python运行cap.release() cv2.destroyAllWindows()关闭摄像头、销毁窗口安全退出程序三、核心亮点总结双模型协同人员跟踪 装备检测分离精度更高多人独立跟踪报警不会混淆不同人员每个人单独计时延时报警避免瞬间遮挡误报只有持续违规才报警GPU 加速运行流畅适合实时监控可视化统计画面直接显示人数、报警数