简介这份安全帽数据集面向从事工业安全监控、智慧工地与计算机视觉方向的开发者及算法学习者用于训练和验证YOLO目标检测模型解决施工现场、矿山等场景下工人是否规范佩戴安全帽的识别问题。压缩包共约2000个文件以6057张jpg图像、6057个xml标注和6058个txt标注为主另含少量cache缓存文件整体约608.51MB图像与双格式标注一一对应标注涵盖person与hat两类便于直接用于模型训练与格式转换。目前已有1399人学习下载适合入门目标检测实战或需要现成数据做迁移训练的人群。借助该数据集读者可完成从标注解析、YOLO格式转换到模型训练与验证的完整流程并可通过随机翻转、裁剪、色彩变换等增强手段提升泛化能力为搭建实时安全帽检测系统提供扎实的数据基础。1. 拿到 person_hat.rar 之后安全帽数据集到底能解决什么检测问题工地上真正难的不是「有没有戴安全帽」而是「画面里十几个人谁戴了、谁没戴、谁戴的是反光背心配的黄色帽」。person_hat.rar这类安全帽数据集核心价值就在于把「人」和「帽子」两个目标绑在一起标注让模型学会在同一个画面里同时输出 person 和 hat 两类框。它解决的是工地、电厂、隧道口这类场景下的合规巡检问题摄像头架好模型跑起来没戴帽子的框自动报警。适合谁用三类人最直接一是做智慧工地视觉方案的算法工程师需要快速验证 helmet 检测可行性二是学生或转行者想找一个有真实遮挡、有密集小目标的数据集练手三是已经有一版模型但漏检严重想换数据重训的团队。这个数据集不是玩具它通常包含不同光照、不同角度、部分遮挡的样本正好卡在「能跑通」和「能上线」之间。先别急着解压下面把从 rar 到可训练格式的整条链路拆开讲。2. 从 rar 到可训练格式解压、目录结构与标注格式确认2.1 解压前先看清 rar 里到底装了什么很多人拿到person_hat.rar第一反应是双击解压结果解出来一堆乱码文件名或者嵌套三层目录。血泪经验是先看压缩包列表再决定解压路径。Linux 下用unrar l或7z lWindows 下用 7-Zip 的「查看」功能。重点确认三件事图片格式是 jpg 还是 png、标注是 xmlVOC还是 txtYOLO、有没有中文路径。# 列出 rar 内容不实际解压先看结构 unrar l person_hat.rar # 如果系统没装 unrar用 7z 替代 7z l person_hat.rar # 确认无误后解压到指定目录避免中文路径 mkdir -p /data/helmet_raw unrar x person_hat.rar /data/helmet_raw/逻辑说明l参数只列目录不写磁盘适合先侦察。x参数保留完整路径解压。参数上注意如果压缩包有密码而你又不知道不要去找所谓的「rar 密码移除」工具直接联系数据提供方这是最省时间的做法。解压后立刻用find统计文件数量确认图片和标注是否一一对应。# 统计图片和标注文件数量判断是否配对 find /data/helmet_raw -name *.jpg | wc -l find /data/helmet_raw -name *.xml | wc -l # 查看目录层级确认没有多余嵌套 tree -L 2 /data/helmet_raw如果图片数和 xml 数不一致说明有脏数据后面转换会报错。常见情况是多了__MACOSX目录或.DS_Store文件直接删掉即可。2.2 VOC 与 YOLO 两种标注格式的取舍安全帽数据集常见两种标注Pascal VOC 的 xml 和 YOLO 的 txt。xml 里存的是绝对坐标xmin,ymin,xmax,ymaxtxt 里存的是归一化后的class_id cx cy w h。选哪个取决于你用的框架YOLOv5/v8 系列直接吃 txtDetectron2 和 MMDetection 更习惯 VOC 或 COCO。我一般会先把 xml 转成 YOLO txt因为后续做数据增强和划分训练集更方便。转换前必须确认类别名。安全帽数据集里常见类别是person、hat有的还带helmet、head、no_hat。打开一个 xml 看name标签把类别列表固定下来。下面是一个标准的 VOC 转 YOLO 脚本直接可抄。import xml.etree.ElementTree as ET import os from pathlib import Path # 类别映射必须和 xml 里的 name 完全一致 CLASSES [person, hat] CLASS_MAP {name: i for i, name in enumerate(CLASSES)} def convert_bbox(size, box): VOC绝对坐标转YOLO归一化坐标 dw 1.0 / size[0] dh 1.0 / size[1] x (box[0] box[1]) / 2.0 y (box[2] box[3]) / 2.0 w box[1] - box[0] h box[3] - box[2] return x * dw, y * dh, w * dw, h * dh def convert_xml(xml_path, out_dir): tree ET.parse(xml_path) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in CLASS_MAP: continue # 跳过未定义类别避免训练时报错 bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) bb convert_bbox((w, h), (xmin, xmax, ymin, ymax)) lines.append(f{CLASS_MAP[name]} .join(f{v:.6f} for v in bb)) # 写同名txt stem Path(xml_path).stem with open(os.path.join(out_dir, stem .txt), w) as f: f.write(\n.join(lines)) if __name__ __main__: xml_dir /data/helmet_raw/annotations out_dir /data/helmet_labels os.makedirs(out_dir, exist_okTrue) for f in os.listdir(xml_dir): if f.endswith(.xml): convert_xml(os.path.join(xml_dir, f), out_dir)逻辑说明convert_bbox把左上右下坐标转成中心点加宽高再除以图像宽高做归一化。CLASS_MAP决定类别索引顺序一旦定了就不能改否则训练和推理对不上。参数上xmin等要转 float有些 xml 里写的是小数。如果某个 xml 没有size节点说明标注不完整直接跳过并记录文件名。2.3 划分训练集与验证集时别踩随机种子的坑转换完 txt 后按 8:2 划分 train 和 val。很多人用random.shuffle不固定种子导致每次跑结果都不一样调参时根本分不清是模型变了还是数据变了。固定seed42并且把划分结果写成 txt 文件后续训练直接读。import random from pathlib import Path random.seed(42) # 固定种子保证可复现 img_dir Path(/data/helmet_raw/images) all_imgs sorted([p.stem for p in img_dir.glob(*.jpg)]) random.shuffle(all_imgs) split int(len(all_imgs) * 0.8) train, val all_imgs[:split], all_imgs[split:] for name, items in [(train, train), (val, val)]: with open(f/data/helmet_{name}.txt, w) as f: f.write(\n.join(items))参数说明seed一旦固定任何人跑出来的划分都一样。sorted保证初始顺序稳定避免文件系统返回顺序不同导致结果漂移。划分完检查一下 train 和 val 里是否都有 hat 类别如果 val 里一个 hat 都没有评估指标会失真。3. 用 YOLOv8 在本地跑通安全帽检测的最小闭环3.1 环境安装与数据配置文件写法YOLOv8 是目前安全帽检测最省事的起点ultralytics包一条命令装完。注意 Python 版本别低于 3.8torch 版本和 CUDA 对齐。如果你只有 CPU也能跑只是训练慢建议先用yolov8n.pt小模型验证流程。pip install ultralytics # 验证安装 yolo checks数据配置文件helmet.yaml必须写对路径和类别名。路径用绝对路径别用相对路径否则训练时找不到图。# helmet.yaml path: /data/helmet_dataset train: images/train val: images/val names: 0: person 1: hat逻辑说明path是数据集根目录train和val是相对路径。names的索引必须和转换脚本里的CLASS_MAP完全一致。常见翻车点是 names 写成了helmet但标注里是hat训练不报错但推理时类别名对不上。3.2 启动训练与关键参数怎么设最小训练命令如下先跑 50 轮看 loss 是否下降。安全帽数据集通常几千张图yolov8s比n精度高比m省显存是性价比最高的选择。yolo detect train \ datahelmet.yaml \ modelyolov8s.pt \ epochs50 \ imgsz640 \ batch16 \ lr00.01 \ seed42 \ projecthelmet_run \ nameexp1参数说明imgsz640是安全帽检测的常用输入尺寸小目标多可以提到 1280但显存翻倍。batch16在 8G 显存上比较稳爆显存就降到 8。lr00.01是初始学习率YOLOv8 默认自适应但安全帽数据类别少适当降低能减少震荡。seed42和划分时保持一致。训练过程中重点看mAP50和mAP50-95如果 20 轮后 mAP50 还低于 0.3大概率是标注格式或类别映射错了。3.3 推理验证与漏检排查训练完用best.pt跑一张工地图看框是否合理。下面命令输出带框图片。yolo detect predict \ modelhelmet_run/exp1/weights/best.pt \ source/data/test_site.jpg \ conf0.25 \ saveTrueconf0.25是置信度阈值安全帽检测建议先设 0.25 看召回再根据误报调整。如果人戴了帽子但只框出 person 没框出 hat检查标注里 hat 框是否太小或是否被 person 框完全包含。YOLO 对嵌套框的处理依赖 NMSiou阈值默认 0.7可以试着调到 0.5 减少抑制。4. 安全帽数据集训练避坑5 个真实翻车记录4.1 现象训练 loss 正常下降但 mAP 始终为 0原因类别索引错位。转换脚本里CLASS_MAP是person:0, hat:1但 yaml 里写成了0: hat, 1: person。模型学到的 hat 实际是 person评估时对不上。解决打开一个生成的 txt看第一个数字是 0 还是 1和 yaml 逐行核对。最稳妥的办法是转换脚本和 yaml 用同一个类别列表生成别手写。4.2 现象解压后图片能打开但训练报「corrupt image」原因rar 解压时部分文件损坏或者图片是 CMYK 模式OpenCV 读不了。工地数据经常从不同设备导出格式不统一。解决用 PIL 批量检查并转 RGB。from PIL import Image import os for f in os.listdir(/data/helmet_raw/images): p os.path.join(/data/helmet_raw/images, f) try: img Image.open(p).convert(RGB) img.save(p) # 覆盖保存为RGB except Exception as e: print(f坏图: {f}, {e})4.3 现象验证集 mAP 很高但实际工地图漏检严重原因训练集和验证集来自同一批视频帧画面高度相似模型过拟合到特定背景。安全帽数据集如果按帧随机划分相邻帧会同时进 train 和 val造成数据泄漏。解决按视频或按时间段划分同一段视频的帧只进 train 或只进 val。如果数据集没提供视频来源至少按文件名前缀分组划分。4.4 现象小目标 hat 框大量漏检原因输入尺寸 640 下远处工人的帽子只有十几个像素特征图下采样后信息丢失。解决把imgsz提到 1280或者在数据增强里开启mosaic和copy_paste。YOLOv8 默认开启 mosaic但copy_paste需要手动加。另外可以增加 P2 小目标检测层但这会改模型结构新手先用大尺寸输入顶一顶。4.5 现象训练到一半显存爆了原因batch设太大或者workers太多导致内存泄漏。Windows 下workers设 0 更稳。解决batch8workers4开启ampTrue混合精度。如果还爆用yolov8n先跑通流程。5. 把 person_hat 数据集用出上限类别平衡与难例挖掘的实操技巧数据集跑通只是及格线真正拉开差距的是对难例的处理。安全帽检测的难例集中在三类逆光、密集人群、帽子颜色和背景接近。我一般会在第一轮训练后用best.pt对训练集做一次推理把漏检和误检的图单独挑出来人工复查标注。这个过程叫难例挖掘比盲目加数据有效得多。具体做法用yolo detect predict的save_txtTrue输出预测框然后写脚本对比预测 txt 和标注 txt找出 IoU 低于 0.3 的图。这些图要么标注错了要么确实是难例。标注错的直接修难例的复制到hard_examples目录在下一轮训练时通过datahelmet_hard.yaml提高采样权重。import os from pathlib import Path def iou(box1, box2): # box格式: cx cy w h x1 max(box1[0]-box1[2]/2, box2[0]-box2[2]/2) y1 max(box1[1]-box1[3]/2, box2[1]-box2[3]/2) x2 min(box1[0]box1[2]/2, box2[0]box2[2]/2) y2 min(box1[1]box1[3]/2, box2[1]box2[3]/2) inter max(0, x2-x1) * max(0, y2-y1) area1 box1[2]*box1[3] area2 box2[2]*box2[3] return inter / (area1 area2 - inter 1e-6) def find_hard(gt_dir, pred_dir, img_dir, out_dir, thresh0.3): os.makedirs(out_dir, exist_okTrue) for txt in Path(gt_dir).glob(*.txt): gt_boxes [list(map(float, l.split()[1:])) for l in open(txt) if l.strip()] pred_path Path(pred_dir) / txt.name if not pred_path.exists(): continue pred_boxes [list(map(float, l.split()[1:])) for l in open(pred_path) if l.strip()] # 简化判断只要有一个gt框和所有pred框IoU都低于阈值就算难例 for gb in gt_boxes: if all(iou(gb, pb) thresh for pb in pred_boxes): img Path(img_dir) / (txt.stem .jpg) if img.exists(): import shutil shutil.copy(img, out_dir) break find_hard(/data/helmet_labels, runs/detect/predict/labels, /data/helmet_raw/images, /data/hard_examples)逻辑说明iou计算两个框的交并比find_hard遍历每个标注框如果它和所有预测框的 IoU 都低于 0.3说明模型完全没学到这个目标把对应图片复制到难例目录。参数thresh可以按需调整0.3 比较宽松0.5 更严格。这个脚本跑完你会得到几十到几百张难例图人工过一遍修正标注后再加入训练集通常能带来 3 到 5 个点的 mAP 提升。另一个技巧是类别平衡。安全帽数据集里 person 框通常远多于 hat 框因为一张图里可能有三个人但只有一顶帽子。这会导致模型偏向 person。可以在 yaml 里加fraction或者用copy_paste增强 hat 类别。我习惯在训练时监控每个类别的instances数量如果 hat 实例数不到 person 的 1/3就手动复制含 hat 的图并做轻微旋转、亮度变化扩充到 1/2 左右。最后说一个验证方法别只看 mAP把模型部署到实际摄像头流上跑一天统计误报和漏报的时间分布。很多模型在测试集上漂亮一到下午逆光时段就崩。我现在的习惯是任何安全帽模型上线前必须过一遍早中晚三个时段的实拍视频漏检率超过 5% 就回炉。这个习惯帮我省掉了好几次现场翻车。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
项目启动|运匠科技 × 恒立液压,共建一体化智能物流平台 一、关于恒立液压恒立液压是中国液压行业的龙头企业、上交所上市公司,总市值超千亿元,总部位于中国常州。 经过30多年的专注与创新,恒立液压已发展成为集液压元件、精密铸件、液压系统等产业于一体的大型综合性企业,在全球各地分别… · 2026/9/23 14:09:42
法搜保姆级教程 法搜避坑指南:3个致命错误与速查手册 版本升级后 API 全变了?别慌,这份速查手册能救命。很多应届生刚接手项目,一查文档发现法搜接口和教程里写的完全对不上,代码跑通率不足 30%。这种崩溃感我懂,因为法搜(法律搜索引擎)的底层架构随着… · 2026/9/23 14:09:33
GCN+Attention多任务谣言检测系统设计与实现 简介:本资源是一套面向本科毕业设计与机器学习课程实践的多任务谣言检测系统完整实现,聚焦社交网络谣言识别与立场判断双重任务,适合具备Python基础与深度学习入门知识的学习者开展项目实战。压缩包共74个文件,包含25个核心Python… · 2026/9/23 14:09:33
VictoryChart 36.x—37.x 演进全解:从默认轴注入到 React 18 时代的重大变更实录 数据可视化UI组件 【免费下载链接】victory A collection of composable React components for building interactive data visualizations 项目地址: https://gitcode.com/gh_mirrors/vi/victory 点击查看 免费下载 packages/victory-chart/CHANGELOG.md 记录了 V… · 2026/9/23 14:54:03
3步拆解我速购源码:附完整示例与避坑指南 3步拆解我速购源码:附完整示例与避坑指南 学会语法却不知怎么搭项目?这是绝大多数培训班学员卡住的死结。你背熟了API,却面对空白文件发呆。今天咱们直接扒开【我速购】的底层逻辑,用 完整示例… · 2026/9/23 14:54:03
Python本地财务管理系统:SQLite+规则引擎实现个人数据自主 简介:这是一套面向计算机专业本科生与毕业设计初学者的Python个人财务管理系统实战项目,聚焦财务管理场景下的工程化开发实践,融合基础业务逻辑与轻量级AI应用思路。资源共30个文件,包含10个核心Python模块(如账单处理… · 2026/9/23 14:53:55
Akka Streams `Source.single` 操作符完全指南:单元素流的创建、语义与底层实现 后端并发编程异步编程 【免费下载链接】akka-core A platform to build and run apps that are elastic, agile, and resilient. SDK, libraries, and hosted environments. 项目地址: https://gitcode.com/gh_mirrors/ak/akka-core 点击查看 免费下载 导读
Sourc… · 2026/9/23 14:53:55
多线程的应用场景避坑指南:3个真实案例教你读懂源码 多线程的应用场景避坑指南:3个真实案例教你读懂源码 刚拿到手的多线程代码,运行起来就像个黑盒。CPU占用率飙升,结果却算错了,甚至直接死锁卡死。这种“复制粘贴就能跑,换个环境就报错”的噩梦,你是不是也经历过?别慌,今天这篇避坑指南,不背八股… · 2026/9/23 14:53:48
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29