🎯 工地 AI 安防场景最常用的目标检测:安全帽、反光衣穿戴检测!
很多小伙伴想要一份开箱即用的 YOLO 检测代码:既能上传本地视频自动生成带检测框的结果视频,也能直接打开电脑摄像头做实时识别。
今天把完整项目分享出来,模型 + 源码一次性给到,复制就能跑!
✅ 本模型可识别类别(精简版,只展示我们需要的 7 类)
['Hardhat', 'Mask', 'NO-Hardhat', 'NO-Mask', 'NO-Safety Vest', 'Person', 'Safety Vest']Hardhat:佩戴安全帽 ✅
NO-Hardhat:未佩戴安全帽 ❌
Safety Vest:穿戴反光衣 ✅
NO-Safety Vest:未穿戴反光衣 ❌
Person:人员
Mask:佩戴口罩
NO-Mask:未佩戴口罩
💡 我们精简过滤了机械、车辆、安全锥等无关类别,画面更干净,重点聚焦人员防护合规检测。
🎬 效果演示(输出ppe.mp4检测模型效果)
ppe
视频演示:读取测试视频 ppe.mp4,AI 自动画框、标注类别 + 置信度,输出带标注的结果视频。同时代码支持一键切换电脑摄像头实时检测,打开摄像头就能实时识别现场人员防护情况。
🧰 环境依赖准备
先安装依赖库,打开 cmd 执行:
pip install ultralytics opencv-python pillow numpy说明:
需要提前准备训练好的
ppe.ptYOLO 模型文件(如果不想自行训练模型,关注微信公众号私信直接给开箱即用的ppe.pt模型文件)
测试视频 ppe
.mp4和代码放在同一个文件夹
🚀 完整 Python 源码(双模式:视频文件检测 / 摄像头实时检测)
使用方法:修改
mode参数
mode = "video" :读取本地视频,输出标注视频文件(就是你的 ppe.mp4)
mode = "camera":调用电脑摄像头实时检测,按 q 退出
from ultralytics import YOLO import cv2 import math from PIL import Image, ImageDraw, ImageFont import numpy as np # ===================== 配置区,按需修改 ===================== mode = "video" # video=本地视频;camera=摄像头实时检测 video_path = "ppe.mp4" output_video_path = "output_result.mp4" model_path = "ppe.pt" conf_threshold = 0.6 # 只显示指定7个类别 show_classes = ['Hardhat', 'Mask', 'NO-Hardhat', 'NO-Mask', 'NO-Safety Vest', 'Person', 'Safety Vest'] # 类别配色:合规绿色,违规红色 color_map = { "Hardhat": (0, 255, 0), "Mask": (0, 255, 0), "Safety Vest": (0, 255, 0), "NO-Hardhat": (0, 0, 255), "NO-Mask": (0, 0, 255), "NO-Safety Vest": (0, 0, 255), "Person": (255, 0, 0), } # ========================================================= # 加载YOLO模型 model = YOLO(model_path) # 中文绘制函数(Windows微软雅黑;Linux/Mac需要修改字体路径) def draw_text(img, text, position, font_size=30, color=(0,255,255)): pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(pil_img) font = ImageFont.truetype("C:/Windows/Fonts/msyh.ttc", font_size) draw.text(position, text, font=font, fill=color) return cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR) # 初始化视频源 out = None if mode == "video": cap = cv2.VideoCapture(video_path) fps = cap.get(cv2.CAP_PROP_FPS) w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) out = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h)) else: cap = cv2.VideoCapture(0) # 0=默认摄像头 cv2.namedWindow("YOLO PPE安全检测", cv2.WINDOW_NORMAL) while True: ret, img = cap.read() if not ret: break img = draw_text(img, "YOLO PPE 防护检测", (20, 40), font_size=36) label_off = {} results = model(img, conf=conf_threshold, iou=0.5) for r in results: for box in r.boxes: x1,y1,x2,y2 = map(int, box.xyxy[0]) conf = math.ceil(box.conf[0] * 100)/100 cls_idx = int(box.cls[0]) cls_name = model.names[cls_idx] # 过滤,只渲染我们需要的类别 if cls_name not in show_classes: continue box_color = color_map.get(cls_name, (200,200,200)) # 标签防重叠偏移 k = x1 // 100 off = label_off.get(k, 0) label_off[k] = off + 40 label_text = f"{cls_name} {conf}" # 标签背景 cv2.rectangle(img, (x1, y1 - 40 - off), (x1 + 220, y1 - 5 - off), box_color, -1) cv2.putText(img, label_text, (x1 + 8, y1 - 15 - off), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255,255,255), 2) cv2.rectangle(img, (x1,y1), (x2,y2), box_color, 2) if mode == "video": out.write(img) cv2.imshow("YOLO PPE 防护检测", img) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() if out is not None: out.release() cv2.destroyAllWindows() print("✅ 程序执行完成!")📝 使用教程,一看就会
把代码、
ppe.pt模型、测试视频ppe.mp4放在同一个文件夹修改第一处配置:
mode="video"处理本地视频;改为mode="camera"开启摄像头实时检测运行代码,弹出预览窗口;按键盘
q随时停止程序视频模式下,处理完成后目录自动生成
output_result.mp4带标注结果视频
💡 小提示
conf_threshold 置信度:调低(如 0.4)检测更多目标,调高减少误检
Linux / Mac 用户:需要替换
msyh.ttc字体路径,否则中文会乱码如果不需要预览窗口,可以注释掉 cv2.imshow 和 cv2.waitKey,后台静默生成视频
📌 应用场景
✅ 工地现场安防检测
✅ 园区、工厂人员防护穿戴巡检
✅ 视频录像事后 AI 分析,自动识别违规不戴安全帽、不穿反光衣人员
✅ 本地离线推理,不需要上传视频到云端,保护数据隐私
如果你正在做 YOLO 目标检测、工地安防 AI 项目,这份代码可以直接拿来二次开发并量化到视觉边缘盒子使用!
👉觉得有用,点个赞 +收藏文章,写项目的时候随时回来复制代码📤转发给做机器视觉、安防算法的朋友,一起交流学习!
欢迎关注微信公众号交流。