这是一套基于 YOLOv8 的实时工地安全检测系统,核心功能:摄像头实时识别人员、检测是否佩戴安全帽 + 反光衣,对违规人员独立跟踪、计时报警、统计人数,全程 GPU 加速运行。

效果演示

安全帽反光衣识别

我会分模块、逐段、通俗化给你讲清楚每一行代码的作用。(关注私领源码和model.pt文件)

一、整体架构总览

  1. 双模型分工
    • YOLOv8n:专门检测人员+ 跟踪人员 ID(区分不同人)
    • 自定义训练模型:检测安全帽、反光衣
  2. 核心逻辑:找到人 → 看这个人身上有没有安全帽 + 反光衣 → 合规标绿色、违规标红色 → 违规计时 → 达到阈值报警 → 实时统计数据
  3. 运行环境: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)
  1. model_person.track()检测人员 + 分配唯一 ID(跟踪)
  2. model_helmet_vest():检测安全帽、反光衣
  3. .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

报警规则

  1. 人员开始违规 → 启动计时器
  2. 持续违规2 秒 → 警告 + 1
  3. 累计3 次警告 → 触发最终报警
  4. 戴上装备 → 立即清空计时,停止报警

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()

关闭摄像头、销毁窗口,安全退出程序


三、核心亮点总结

  1. 双模型协同:人员跟踪 + 装备检测分离,精度更高
  2. 多人独立跟踪报警:不会混淆不同人员,每个人单独计时
  3. 延时报警:避免瞬间遮挡误报,只有持续违规才报警
  4. GPU 加速:运行流畅,适合实时监控
  5. 可视化统计:画面直接显示人数、报警数
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐