基于yoloV8安全帽反光衣检测(含代码)
基于yolov8的安全帽反光衣识别
·
这是一套基于 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 defaultdict
YOLO:目标检测核心库,加载模型、推理、跟踪cv2:OpenCV,处理摄像头画面、绘图、显示窗口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
- 无限循环读取摄像头画面
ret=False代表摄像头断开,退出循环
7. 跳帧优化(保证流畅不卡顿)
python
运行
# 间隔帧检测,提升流畅度
frame_count += 1
if frame_count % FRAME_SKIP != 0:
cv2.imshow("窗口名", frame)
if 按Q键: break
continue
- 不检测的帧直接显示画面,不做 AI 计算
- 算力低的电脑可以改
FRAME_SKIP=2,速度翻倍
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], conf=CONFIDENCE, persist=True, verbose=False)
results_hv = model_helmet_vest(frame, conf=CONFIDENCE, verbose=False)
frame = results_hv[0].plot(img=frame, labels=False, conf=False)
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, f"Total: {total_person}", ...)
cv2.putText(frame, f"Safe: {safe_person}", ...)
cv2.putText(frame, f"Violate: {violate_person}", ...)
cv2.putText(frame, f"Alert Tot: {total_alert_count}", ...)
画面左上角显示:
- 总人数
- 安全人数
- 违规人数
- 总报警次数
14. 退出与资源释放
python
运行
cap.release()
cv2.destroyAllWindows()
关闭摄像头、销毁窗口,安全退出程序
三、核心亮点总结
- 双模型协同:人员跟踪 + 装备检测分离,精度更高
- 多人独立跟踪报警:不会混淆不同人员,每个人单独计时
- 延时报警:避免瞬间遮挡误报,只有持续违规才报警
- GPU 加速:运行流畅,适合实时监控
- 可视化统计:画面直接显示人数、报警数

更多推荐
所有评论(0)