ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

工地安全设备佩戴检测数据集:3000张图+YOLO11一键训练指南

工地安全设备佩戴检测数据集:3000张图+YOLO11一键训练指南 简介数据集面向智慧工地安全监控项目开发者与YOLO目标检测初学者解决工人安全设备佩戴自动检测与合规巡检需求。总计3000张真实工地场景图片涵盖施工区域、道路场地、室内装修及密集作业、遮挡等复杂情况标注类别14种含安全帽、手套、护目镜、口罩、反光背心及未佩戴等正负样本。数据集由LabelImg标注同时提供VOC(xml)、COCO(json)、YOLO(txt)三种格式可直接接入常用检测算法训练。配套YOLO11一键训练脚本支持GPU、CPU及Mac M芯片多平台运行并附博主训练日志作参考。资源整体打包为1个PDF8.59MB内含数据集介绍与网盘获取方式已有426人学习适合需要规范标注数据和多平台训练方案的开发者。1. 工地工人安全设备佩戴检测数据集3000张图和三种标签先别急着自己标做智慧工地、安监巡检或相关毕业设计的人第一道坎往往不是模型选型而是“没有工地现场数据”。标题里这个“目标检测-工地工人安全设备佩戴检测数据集”解决的就是这件事3000张工地场景图片安全帽、反光衣这类佩戴目标已经标好VOC、COCO、YOLO三种格式标签都齐外加一份在 GPU、CPU、Mac 三平台都能跑的 YOLO11 一键训练脚本。适合谁适合想快速验证工地安全检测方向、又不想把时间耗在爬图和手标上的工程师与学生。先算一笔账3000 张图自己标按一张 3 到 5 分钟算一个人不吃不喝要两周多这还不算格式转换和环境配置的功夫。这个数据集的价值不在“图多”而在“格式齐、脚本直接、能马上出结果”。2. 3000 张工地安全图到底够不够用先分清三种标签格式再做体检2.1 工地安全设备检测的难点安全帽和反光衣为什么会漏检工地场景的目标检测和通用目标检测有个明显差别目标小、角度杂、光线脏。摄像头往往装在塔吊、围挡或者工地出入口的高处往下拍的时候一个工人全身在画面里可能只占几百个像素安全帽就更小了。再加上粉尘、逆光、阴雨天的反光模型很容易把戴了帽子的人漏掉或者把背景里的红色塑料桶、红色编织袋当成安全帽。反光衣也有类似问题白色或黄色的反光衣跟工地墙面、围挡颜色接近时模型经常把它们捡进背景里。直接拿 COCO 预训练权重去跑通用物体检测安全帽大概率能出来一点反光衣效果就差很多因为公开数据集里几乎没有“穿了反光衣的工地工人”这个类别。所以这种场景必须用专门的工地数据集来做迁移学习。3000 张的量级对两到四个类别来说属于“够起步但不富裕”的水平关键还得看标签质量和类别分布而不是只看总数。2.2 VOC、COCO、YOLO 三种格式同一张图三套坐标系拿到数据集后先别急着训练第一件事是弄清楚三种格式在文件层面长什么样。它们描述的框是同一个框但坐标系和存储方式完全不同。格式文件形式坐标含义备注VOC每张图一个 xmlxmin, ymin, xmax, ymax 绝对像素坐标出自 PASCAL VOC标注软件 labelImg 默认输出COCO整个集合一个 jsonx, y, width, height左上角加宽高绝对像素坐标出自 MS COCO标注软件 labelme 可输出YOLO每张图一个 txtclass, x_center, y_center, width, height全部归一化到 0~1出自 Ultralytics/YOLO 系训练脚本只认这种一个常见误区是认为 YOLO 的 txt 里“x y w h”是像素坐标。不是它是相对图片宽高的比例。比如一张 1920x1080 的图一个框中心在像素 (960, 540)、宽 480、高 540它的 YOLO 格式会写成0 0.5 0.5 0.25 0.5。想验证这一点很简单打开任意一个 txt 看看坐标有没有超过 1如果有说明这个标签大概率是别处转过来转换错了。理解了这三套坐标后续不管你是要看标签、改类别、还是和别的数据集合并都不会被格式绕晕。标题说三种格式都给了那我一般不会重复做转换而是直接选 YOLO 格式开始训练VOC 和 COCO 的 json 留着做校验和二次标注时用。2.3 训练前的标签体检这一步不做后面全是白跑我在拿到任何一个 yolo 数据集时都会先跑一遍标签体检脚本。这一步能查出三类问题空标注文件、坐标越界、类别索引对不上。import os from pathlib import Path label_root Path(labels/train) # 改成你的标签目录 num_classes 4 # 按数据集实际类别数改 bad_empty, bad_range, bad_cls [], [], [] for txt_path in label_root.glob(*.txt): lines [line.strip() for line in txt_path.read_text().splitlines() if line.strip()] if len(lines) 0: bad_empty.append(str(txt_path)) continue for line in lines: parts line.split() cls int(parts[0]) x_c, y_c, w, h map(float, parts[1:]) # 归一化坐标越界检查 if not (0.0 x_c 1.0 and 0.0 y_c 1.0 and 0.0 w 1.0 and 0.0 h 1.0): bad_range.append(f{txt_path}: {line}) if cls 0 or cls num_classes: bad_cls.append(f{txt_path}: class{cls}) print(f空标签文件: {len(bad_empty)} 个) print(f坐标越界: {len(bad_range)} 条) print(f类别索引越界: {len(bad_cls)} 条)这段脚本的逻辑很直接空文件会在训练时被直接忽略但如果你把空文件全删了又会导致某张图在训练中完全没有任何检测目标模型会把它当成纯背景坐标越界的框在 Mosaic 增强时会被裁掉一半相当于标签跟实际目标错位类别索引越界则会在读标签时报错训练直接中断。跑完体检之后我还会做一件事随机抽 50 张训练图把 YOLO 格式的框画回原图肉眼扫一遍。import cv2 import numpy as np from pathlib import Path img_root Path(images/train) label_root Path(labels/train) colors [(0, 0, 255), (0, 255, 0), (255, 0, 0), (0, 255, 255)] # 每类一个颜色 for img_path in sorted(img_root.glob(*.jpg))[:50]: txt_path label_root / (img_path.stem .txt) if not txt_path.exists(): continue img cv2.imread(str(img_path)) h, w img.shape[:2] for line in txt_path.read_text().splitlines(): cls, x_c, y_c, bw, bh line.split() cls int(cls) x_c, y_c, bw, bh map(float, (x_c, y_c, bw, bh)) x1 int((x_c - bw / 2) * w) y1 int((y_c - bh / 2) * h) x2 int((x_c bw / 2) * w) y2 int((y_c bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), colors[cls % len(colors)], 2) cv2.putText(img, fcls{cls}, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, colors[cls % len(colors)], 2) cv2.imwrite(fcheck_{img_path.name}, img)这一步能发现自动标注或者格式转换时留下的系统性错误比如某个类别的框整体偏移、类别标号顺序和 data.yaml 里的 names 不一致。肉眼扫完确认没问题再进入训练是最稳妥的节奏。手动标注可以靠人的直觉修正但脚本校验才是能保证规模的方法两件事缺一不可。2.4 3000 张图的训练效果预期类别分布决定精度上限3000 张图如果类别只有“safe_helmet安全帽”和“vest反光衣”两类训练起来很轻松精度也会比较好看如果还加了“person工人”“gloves手套”“safety_net”等多类别尤其手套这种小目标3000 张就紧巴巴的了。我的经验是每个类别至少要有 500 到 800 个实例如果某个类别的实例数少于 300别指望模型能稳定检测出来要么补数据要么把类别合并。训练集和验证集的划分也值得多看一眼。标题里的数据集如果已经帮你划分好了就别动它的顺序直接用如果是自己从零整理数据按 9:1 或 8:2 划分但务必保证同一段视频抽出来的连续帧不要同时出现在训练集和验证集里否则验证指标虚高到了现场立刻打回原形。划分完后数一下每个类别在训练集和验证集里的数量做到两个集里分布接近。3. GPU/CPU/Mac 三平台 YOLO11 训练环境配置到一键脚本拆解3.1 YOLO11(ultralytics) 环境配置0 基础小白也能一次装对的依赖清单YOLO11 是 Ultralytics 在 YOLOv8 之后接棒推出的目标检测模型训练和推理都走同一个包ultralytics。对这个数据集来说你不需要自己写网络结构也不需要手动实现损失函数装好环境后所有东西都封装在 API 里。先把 Python 环境准备好我习惯用 conda因为隔离干净翻车了随时删掉重建。conda create -n yolo11 python3.10 -y conda activate yolo11 pip install ultralytics如果电脑上没有 conda直接用系统 Python 3.9 以上版本也可以。pip install ultralytics会自动带上 PyTorch一般情况下无需手动装 torch。有 NVIDIA GPU 的 Windows/Linux 机器PyTorch 安装时会自动匹配带 CUDA 的版本Mac 上则会装 macOS 版Apple Silicon 芯片会自动支持 MPSMetal Performance Shaders加速。装完验证一下python -c import ultralytics; ultralytics.checks()这行命令会打印当前 torch 版本、CUDA 是否可用、MPS 是否可用还会提示有没有不兼容的版本组合。看到类似CUDA: True (device 0)或MPS: True就说明环境没问题如果显示两个都是 False也可以训练只是走 CPU速度慢不少。提示不要在这个环境里手动安装乱七八糟的 torch 版本。pip install ultralytics会锁定兼容版本你一旦手动升级 torch很可能出现 MPS 报错或 CUDA 版本不匹配。3.2 一键训练脚本拆解每一行都要能看懂这是整个数据集最值钱的部分一份能自动选择设备的训练脚本。先看 shell 入口它负责识别当前系统、选设备、调 Python 参数真正的训练逻辑在 train.py 里。#!/bin/bash # 一键训练脚本自动识别平台并选择设备 set -e echo 检查 Python 环境... if ! command -v python3 /dev/null 21; then echo 未检测到 Python3请先安装 Python 3.9 或 Anaconda exit 1 fi # 平台识别Mac 分 Apple Silicon 和 IntelLinux/Windows 看 nvidia-smi if [[ $(uname) Darwin ]]; then if [[ $(uname -m) arm64 ]]; then DEVICEmps else DEVICEcpu fi elif command -v nvidia-smi /dev/null 21; then DEVICE0 else DEVICEcpu fi echo 当前使用设备: $DEVICE python train.py --device $DEVICE这里的判断逻辑是macOS 上 Apple Silicon 走mps老款 Intel Mac 走cpu其他系统上有 NVIDIA 显卡就指定第一张卡0没有就 CPU。Windows 用户如果在 PowerShell 里跑 bash 会失败直接用 Git Bash 或 WSL 执行或者跳过这层 shell 脚本直接手动运行下面的 Python 训练命令。train.py 里的核心逻辑import argparse from ultralytics import YOLO parser argparse.ArgumentParser() parser.add_argument(--device, defaultcpu) parser.add_argument(--imgsz, typeint, default640) parser.add_argument(--batch, typeint, default16) args parser.parse_args() model YOLO(yolo11n.pt) # 用官方预训练权重做迁移学习起步 model.train( datadataset/data.yaml, epochs120, imgszargs.imgsz, batchargs.batch, deviceargs.device, patience25, save_period10, projectruns/工地安全检测, nameyolo11n_3000, lr00.005, )为什么要从yolo11n.pt预训练权重开始而不是从零训练因为 3000 张图从零训练一个深度网络收敛慢且容易过拟合预训练模型已经在 COCO 上见过大量物体轮廓我们只需要让它适应“安全帽”和“反光衣”这两类新目标迁移学习能省一半以上时间。epochs1203000 张图100 到 150 轮足够收敛再多就是过拟合。patience25连续 25 轮验证集指标没有提升就自动停止这是防浪费时间的关键参数。save_period10每 10 轮存一次权重中途断了也能接着续。lr00.005预训练权重继续训练学习率比默认的 0.01 温和一点不容易把之前学的特征冲掉。3.3 三平台参数对照GPU、CPU、Mac 该改哪一行同一份脚本三个平台需要改动的参数其实不多主要是batch和workers。给一套可以直接抄的对照参数平台device 参数建议 batch建议 workers100 轮参考耗时NVIDIA GPU8G 显存016440-60 分钟NVIDIA GPU24G 显存032830-45 分钟CPU8 核cpu8010 小时以上Mac M1/M2MPSmps1623-5 小时Mac Intelcpu8010 小时以上CPU 训练时batch调大不会让速度变快因为瓶颈在算力不在数据吞吐workers设成 0 可以避免 Windows 和 macOS 上多进程数据加载报错。GPU 训练时batch越大显存占用越高如果报 OOM先把 batch 减半其次把imgsz从 640 降到 480。Mac 上mps如果遇到算子不支持导致的报错最快的办法就是devicecpu别纠结稳定比速度重要。4. 训练参数不是玄学把 YOLO11 在工地数据集上的精度再抬一截4.1 五个必调参数imgsz、batch、epochs、lr0、patience很多人习惯拿着脚本默认参数直接开训这不是不行但在工地这种小目标场景里参数没调到位很容易出现“训练过程很顺利结果一测全是漏检”的尴尬局面。我的建议是每次只动一个变量别一次改三个参数否则翻车了你根本不知道是哪一步引起的。imgsz是第一个值得动的参数。YOLO11 训练时会把所有图缩放到这个尺寸再喂进网络640 是默认值速度最快但安全帽这种小目标在 640 分辨率下经常只有十几个像素特征非常微弱。把imgsz提高到 960等于让模型在更大分辨率下看这些小目标漏检会明显减少。代价是显存占用增大——从 640 提到 960面积是原来的 2.25 倍batch 要相应减半。如果训练时显存不够优先保imgsz牺牲 batch。batch的调整要结合显存和训练稳定性看。8G 显存跑 yolo11nbatch16 是比较合理的位置24G 显存可以跑到 32但再往上收益就不明显了。batch 太小比如 2、4会导致梯度噪声大损失函数曲线抖动厉害收敛不稳定batch 太大会让模型过早过拟合验证集指标上不去。epochs和patience是配合使用的。3000 张图 120 轮足够了但到底多少轮合适看早停表现。patience25的意思是验证集 mAP 连续 25 轮没有提升就终止训练这样既不会欠拟合也不会在过拟合阶段空转。如果训练到第 100 轮还在涨说明数据复杂度比预期高可以追加到 150 轮如果 40 轮就停住了先看学习率。lr0是迁移学习中影响最大的参数。预训练权重已经具备很强的特征提取能力学习率设得太大反而会把之前的参数冲乱。我一般从 0.005 起步如果发现损失下降太慢可以改回默认的 0.01 再跑一次对比如果损失在震荡降到 0.001。4.2 小目标专项输入尺寸和数据增强的取舍工地场景的安全帽检测本质上是小目标检测最直接的手段就是提高输入分辨率。但要分清楚imgsz960只对训练时提升小目标的像素占比有帮助它不能凭空创造现场没有的纹理特征。所以另一个配合手段是看 Mosaic 增强是否合适。Ultralytics 默认开启mosaic1.0它会把四张图拼成一张再训练能大幅提升模型对小目标的泛化能力但也有副作用拼接后的图里单个目标尺寸进一步缩小尤其在 3000 张这样的小数据集上可能导致模型对小目标的特征学习不稳定。我的习惯是训练 YOLO11 在工地数据集时把mosaic设为 0.5保留一半的拼接增强让模型也能看到完整的大尺度目标。model.train( datadataset/data.yaml, epochs120, imgsz960, batch8, device0, patience25, lr00.005, mosaic0.5, fliplr0.5, # 左右翻转工地场景安全 flipud0.0, # 上下翻转工地里人不会倒立关掉 )flipud0.0这一点经常被忽略。工地场景里工人是站立或走动的目标在画面里的“上下”关系是有物理意义的——安全帽在人体上方反光衣在躯干位置。如果开了上下翻转模型会被迫学习“帽子在下面也能检测”消耗了宝贵的参数空间效果反而变差。左右翻转没问题工地场景里人和设备左右对称出现很常见。4.3 只看 mAP 会骗人PR 曲线和混淆矩阵才是裁决者训练结束后runs/工地安全检测/yolo11n_3000/目录下会生成results.png、confusion_matrix.png、PR_curve.png等指标图。我见过很多人只看一眼输出的 mAP50 就收工这里要说一句mAP50 高不代表工地现场好用。PR 曲线Precision-Recall Curve要看的是曲线右下角的面积尤其关注曲线在召回率 0.6 到 0.9 之间的下降速度。如果曲线掉得很快说明模型在“少漏检”和“少误检”之间只能顾一头。安全帽检测宁可误检多一点也不能漏检因为漏检意味着工人没戴帽子却没被发现这在安监场景是要出事的。混淆矩阵能告诉你模型把哪两类搞混了。常见情况是反光衣和背景里的白色墙面高混淆、安全帽和黄色安全帽与地面杂物高混淆。看到混淆矩阵里某个类别互相混淆严重说明该类别的特征学习还不够优先补该类别的现场数据而不是盲目加训练轮数。5. 避坑YOLO11 训练工地数据集最容易翻车的 5 个坑5.1 训练 loss 出现 NaN直接中断现象训练跑到第几个 epoch损失函数变成 NaN之后训练进程直接挂掉。翻车原因多半在标签。标注文件里出现inf或坐标全 0 的框或者类别索引写的是 5 但 data.yaml 里只有 4 个类别都会让损失计算失控。解决先跑一遍第 2 章的标签体检脚本把异常标签文件定位出来。如果是单张图标签坏了直接删掉这张图和它的标签如果是类别索引整体错位把 txt 里的 class id 批量改对。改完重跑问题立刻消失。血的教训是这类问题在 3000 张图的数据集里尤其常见因为有相当一部分是半自动标注工具转出来的坐标错乱很难一眼看到。5.2 标签坐标没有越界但检测框整体偏移半个身位现象训练能正常完成画出来测试效果发现框的位置偏了尤其是安全帽的框总是落在头旁边或身体上。原因标签在格式转换时没有按原图分辨率算归一化坐标。比如原始标注是 1920x1080 的图转换脚本却按 1280x720 做了归一化导致所有框整体偏移。解决检查原始图片的实际分辨率选几张图把标注框重画回原图对比如果确实整体偏移用脚本按正确分辨率重新归一化。这里有个细节画框验证时必须用原图不要用 OpenCV 读图后隐式缩放的版本。5.3 训练时显存 OOMbatch 调小了还是报错现象GPU 训练中途报CUDA out of memory把 batch 从 16 降 8 还是报错。原因workers参数太高导致数据加载线程占满 CPU或者打开了cacheTrue把整数据集缓存进显存。3000 张图如果全部缓存显存占用直接顶满。解决按顺序排查。先workers4再关掉数据集缓存选项然后把imgsz降到 640最后才动 batch。调一个验一个别一次全改。5.4 Mac 上 MPS 训练报算子不支持错误现象Mac M1/M2 训练到第一轮报某个算子不支持 MPS或者直接卡死。这是 YOLO11 在 Mac 上最常见的坑跟 PyTorch 版本强相关。原因ultralytics版本和 torch 版本不匹配某些自定义算子没有 MPS 实现。解决先升级pip install -U ultralytics如果还不行就把 PyTorch 升到最新稳定版。如果升级后依然报错别耗了devicecpu跑速度慢但稳定。Mac 上的目标本来就是调试和验证流程真到量产训练建议放到 GPU 机器上。5.5 训练集 mAP 很高拿到现场实地视频全露馅现象数据集划分的验证集 mAP50 有 0.9看起来很漂亮拿去跑一段真实工地视频安全帽漏检率居高不下。原因验证集和训练集来自同一批采集场景背景、角度、光照高度相似现场视频里的机位、距离、画面噪声都和训练集分布不完全一样。这在目标检测里叫“数据分布漂移”任何数据集都躲不掉包括这个。解决从现场视频里抽帧用训练好的模型伪标注一批“难例”人工修正后混入训练集做第二轮训练。这一步没有捷径它决定了模型能不能从“数据集上跑得通”变成“现场能用”。6. 从模型到现场可用坏 case 分析、导出 ONNX 与攒第二版数据训练完之后别急着部署。先把最差的结果拿出来看——把验证集里漏检、误检的图批量导出来。用 YOLO11 自带的 predict 跑一遍验证集把置信度低于 0.3 但实际有目标的图挑出来逐张看是角度问题、遮挡问题还是目标太小。这种“坏 case 分析”一次只要半小时但远比盯着 mAP 数字有用。导出部署格式也很简单。训练阶段用的是 PyTorch 权重best.pt部署到终端或边缘设备时一般转成 ONNXfrom ultralytics import YOLO model YOLO(runs/工地安全检测/yolo11n_3000/weights/best.pt) model.export(formatonnx, imgsz960, opset12)这里有个容易踩的细节导出时的imgsz必须和训练时一致。训练用 960导出传 640模型内部的结构和对输入尺寸的假设会不一致轻则精度下降重则推理结果异常。导出后可以用 ONNX Runtime 或 TensorRT 推理现场如果要接多路 RTSP 流转 TensorRT 后在 T4 上用 640 分辨率跑 1080p 25 帧的视频流一路大概需要几十毫秒具体路数取决于显存和算力衡量清楚再上。关于数据集本身我最后想掏一句心窝子3000 张图只是起点。第二版数据最实际的来源是用当前模型对工地现场视频做半自动标注把置信度在 0.3 到 0.5 之间的检测结果导出人工快速修正后混入训练集。我自己的习惯是每次训完先打印一批漏检图再花半天从现场视频抽帧补 100 张难例重新标这比连续调一周参数对精度的提升都明显。目标检测这个方向数据和标注永远比网络结构更决定上限。希望这套流程能帮你少走点弯路把时间花在现场数据上而不是和训练脚本死磕。本文还有配套的精品资源点击获取
返回列表