
简介面向计算机视觉与煤矿安全领域研究人员这份已标注的煤矿井下安全帽数据集可用于目标检测、安全帽佩戴识别及异常行为分析等场景。资源共436个文件218张jpg井下实拍图像配合218个xml标注文件以边界框形式精确标记每顶安全帽位置为监督学习和模型评估提供直接输入。压缩包整体约179.65MB文件命名按帧号规律排列便于拆分训练集与验证集。已有810人学习下载适合算法工程师、在校学生以及智能安防项目开发者。通过该数据集可直接开展YOLO、Faster R-CNN等经典检测模型的训练与调参也可结合工人位置、动作传感数据进一步做行为分析和安全预警从而缩短数据采集与清洗周期提升煤矿井下安全监管的智能化水平。 做工业视觉落地的同行应该都有体会工地安全帽检测在公开数据集上跑得再漂亮一搬到煤矿井下就翻车。原因不用多说——井下光线暗、粉尘重摄像头上还经常沾一层煤灰加上矿工的下井帽和普通安全帽在颜色、反光特性上都有区别模型在室内灯光下学到的那套特征根本不够用。所以“煤矿井下安全帽数据集已标注”这个项目核心问题从来就不是“有没有数据”而是“怎么把数据标注成模型真正能学懂的样子”。我今天就把这套数据集的整理思路、标注规则、工具链和训练排坑过程完整写出来内容包括怎么用CVAT和X-AnyLabeling做智能标注提效、怎么把视频抽帧变成标准化VOC/YOLO格式、以及用YOLOv8训练井下场景模型时最常踩的几个坑。无论你是正在做矿山安全监管平台还是想在其他工业场景复刻一套作业安全AI方案照着这条链路走能少走半个月弯路。1. 场景认知与数据集整体设计1.1 为什么煤矿井下安全帽检测比普通工地场景难一个量级先说说场景的特殊性。普通建筑工地的监控摄像头安装在开阔区域光线均匀人员行走姿态大多是正对或侧对镜头安全帽的特征非常清晰。井下则完全是另一套环境采掘工作面或者巷道里的光源来自矿灯和局部照明背景是深色煤壁画面里经常有大面积暗区同时矿灯直射镜头时还会形成强烈的逆光光斑。这种情况下模型对“安全帽”这个目标的边缘、颜色、纹理的感知都会被压缩到极限。另一个容易被忽略的点是帽型差异。煤矿井下使用的安全帽和工地常见的普通安全帽在外观上很接近但颜色规律不同矿工下井帽常见黄色和红色部分管理人员戴白色或蓝色帽而且在井下反光条、煤尘附着会让同一个帽子在不同帧里呈现差异巨大的表面特征。如果直接拿公开的工地安全帽数据集去训练模型会把“安全帽”和“阳光下的黄色物体”绑定在一起到了井下黑暗环境里就变成高漏检率。因此这个数据集在构建时我刻意筛选了井下不同巷道、不同照度条件下的真实监控画面而不是简单拼接一批公开图片。最后一个决定性的差异是视角。井下的枪机摄像头大多是仰角安装人员从镜头下方走过镜头只能看到帽顶和帽檐的一部分球形机则分布在巷道两侧人员斜穿画面目标姿态极其多样。正常的常规检测数据集以水平视角为主在井下场景下需要补充大量俯视、仰视和远距离小目标样本这直接决定了标注策略的复杂程度。1.2 标注决策先定“检测什么”再谈“怎么标”很多初学者拿到数据就急着打开标注工具画框结果画到一半发现类别定义没想清楚最后还得返工。我在这个项目里是先定清楚检测任务边界再动笔标注的。当前主流的安全帽检测方案有两种路线一是直接检测“帽子”这一个类别二是同时检测“人”和“帽子”再做匹配判断。这个井下数据集采用的就是第二种标注类别为person和helmet通过判断两条框的关系来判断“这个人有没有戴帽子”。这样做的好处很明显模型先学会区分人体轮廓再学安全帽特征在遮挡比较严重时哪怕帽子没露出来但人露出来了也能提供关键线索。但这条路线有一个坑如果人体被遮挡得只剩半个头模型预测出person框的置信度会很低导致后续匹配逻辑失效。所以我在标注规范里增加了一条规则——当人体遮挡面积超过50%但头部完整可见时person框照常标注当头部也被遮挡超过70%时整条样本直接丢弃。这个决策看似会损失一部分数据实际却让训练样本的标签噪声大幅下降。另外一个决策是颜色类别。网上有些项目把安全帽细分黄色、蓝色、白色来进行分类检测看起来很炫但井下工况下颜色受光照影响极大同一种黄色的帽子在不同灯下能差出几个色阶细分颜色的收益远低于误检风险。这个数据集只做helmet单一类别把颜色信息留给后续的追踪模块去处理检测任务保持简单稳健。2. 数据采集、清洗与标注工具落地2.1 视频抽帧与公开数据补充的正确姿势数据来源上我以真实的井下监控视频为主。这里有个实操细节监控视频连续帧之间画面高度重复直接用ffmpeg按固定帧率抽帧会抽出大量内容几乎一样的图片不仅浪费存储还会让训练集“虚胖”模型收敛变慢。我的做法是用场景切分结合感知哈希去重。先用ffmpeg把视频按每10秒一个片段切分再对每个片段做关键帧提取最后计算相邻帧的感知哈希值相似度超过阈值的只保留一张。这样得到的图像覆盖了不同时间段、不同人员和不同位置的画面信息密度比连续抽帧高很多。命令行流程大致如下ffmpeg -i camera01.mp4 -vf selectgt(scene,0.3) -vsync vfr -q:v 2 frame_%04d.jpgscene阈值设成0.3代表画面变化超过30%时才抽帧能够自动跳过人员静止、摄像头无转动的冗余片段。抽完帧后再配合一段Python脚本做像素级查重最终剩下的图片才进入标注池。公开数据要不要补充我的建议是适量补充但必须做风格化处理。公开的工地安全帽数据集画面亮度普遍偏高直接混入井下数据集会让模型学到错误的亮度先验。一种可行方案是把公开图片整体压暗、加噪声、模拟煤粉尘颗粒形成与井下画面接近的分布后再按不高于总量20%的比例混入。这样既扩充了样本多样性又不会带偏模型的底层特征。2.2 CVAT与X-AnyLabeling组合的实战标注流程工具选择上个人单打独斗时首选CVAT团队协作时也推荐CVAT。这个工具支持多边形、矩形、关键点标注还能在网页端多人协同最方便的是它内置了自动标注功能的前置接口可以加载你训练好的模型来做预标注。实际流程我跑了两轮。第一轮先用已有的通用目标检测模型对全部图片做粗略预标注导出后人工修正明显错误的框。这里的效率提升非常明显预标注能把安全帽和人的框先圈出来人工只需要删掉误检、补上漏检、调整过紧或过松的边界。第二轮就进入X-AnyLabeling的智能标注环节。X-AnyLabeling支持加载自己训练好的YOLO模型做半自动标注在图片上画一条线就能让模型沿着边缘生成精确的检测框。对于轮廓复杂、有煤灰遮挡的安全帽这种交互式标注比手动纯画框快得多。我第一轮训练出的模型在井下数据上的精度还不到能用程度但第二轮用X-AnyLabeling配合修正后的模型漏标率显著降低标注一张图的时间从原来的约两三分钟缩短到四五十秒。用这类“模型辅助人工裁决”的标注模式时有一个注意事项不要盲目信任预标注结果。预标注模型误检出来的helmet框如果人工不及时删除就会变成标准答案形成噪声循环。我的习惯是按图片编号随机抽10%做二次复核专门检查那些置信度在0.3到0.6之间的低置信框这一区间的误检率最高。2.3 标注规范框的范围、遮挡与低照度处理标注规范决定了数据集的质量上限这部分我踩过不少坑整理成三条硬性规则供你直接参考。第一条框的范围。helmet框必须紧贴帽子边缘不包含头骨、领口和背景person框则从头顶到脚底包含整个人体轮廓。如果人体被设备或矿车遮挡到只剩上半身person框仅框出可见部分标注工具里不勾选occluded属性。这样做的意义是让模型学到的框边界尽量干净减少边界框中心点的抖动。第二条遮挡处理。安全帽被管道、矿灯架遮挡时只要可见面积超过30%就框出可见区域并正常标注可见面积不足30%但能明确辨认帽子形状的也做标注连人都看不出来是什么的情况下不做标注。遮挡类样本对模型泛化能力至关重要但标注人员往往因为“看不清楚”而漏标这会让模型在真实遮挡场景下表现很差。第三条低照度和反光处理。井下画面里大片暗区属于环境本身不需要为了标注清晰而强行调亮图片但在标注时要把暗区中勉强可见的安全帽框出来不能因为“看不清”就直接跳过。我要求标注时在原始亮度下先看一遍再用软件提亮30%复查第二遍避免因显示设备亮度不足漏标暗部目标。这个动作很反直觉但正是这些低置信度样本才让模型学会在弱光环境里找到目标。3. 从标注数据到YOLOv8训练的完整实操3.1 数据集格式转换与目录组织标注完成后数据格式还得统一。CVAT标注导出默认是COCO格式而YOLOv8训练用的是YOLO格式所以必须做一次格式转换。这一步如果手写脚本关键要理解两种格式的区别我直接说结论COCO格式是绝对坐标存在一个JSON文件里包含images、annotations、categories三个数组YOLO格式是相对坐标每张图片对应一个txt文件一行一个目标字段为class_id x_center y_center width height所有值均除以原图宽高做了归一化。转换脚本的写法比较简单关键是记得把COCO的bbox字段从[x, y, width, height]转成YOLO的[cx, cy, w, h]后再做一次除以图像宽高的归一化。我用Python写了类似下面这端的逻辑实测转换后没有出现坐标越界的问题def coco_to_yolo(bbox, img_w, img_h): x, y, w, h bbox cx (x w / 2) / img_w cy (y h / 2) / img_h return cx, cy, w / img_w, h / img_h最终目录结构我建议这样组织直接对齐YOLOv8默认读取路径dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamldata.yaml里写清楚类别数和类别名我用的是nc: 2names: [person, helmet]。这里有个容易踩的坑类别顺序必须和训练时保持一致否则模型输出解释会对不上。之前我有一次把helmet和person的顺序调换结果部署后所有框的类别都反了排查了好久才发现是yaml顺序问题。3.2 训练管线中的增强策略与超参数数据划分我建议按视频来源分而不是随机打乱分。同一路摄像头在不同时间段的画面很可能包含同一个人如果随机划分训练集和验证集里会出现同一目标的不同帧评估指标会虚高。按视频或按时间片划分才是真实的跨场景评估。训练用YOLOv8的话我推荐直接用YOLOv8x模型起步不要一上来就追求轻量化。井下安全帽目标通常较小大模型的特征提取能力足够强适合作为这个场景的baseline。基础超参数如下train: dataset/images/train val: dataset/images/val nc: 2 names: [person, helmet]yolo train datadataset/data.yaml modelyolov8x.pt epochs200 batch16 imgsz640 device0增强策略上井下低光和暗色背景需要额外做两类增强一是HSV的S和V通道调整把饱和度降低、亮度随机压暗模拟井下光线波动二是引入灰度化和噪声注入模拟煤灰颗粒对画面的干扰。YOLOv8默认开启的mosaic增强在这种小目标场景下效果很好能模拟出多目标重叠的情况尽量不要关闭。实测下来mosaic和mixup同时开启时对小目标召回率提升明显但会让训练收敛速度变慢。如果显存有限可以先把imgsz设成640等第一轮训练完再用--imgsz 1280做一次微调通常能再提升2到3个点的mAP。这是我在矿井场景上试了几轮之后参数上的最终选择。3.3 评估结果与典型案例分析训练完成后不能只看mAP这个单一指标特别是安全帽检测这种正负样本极度不均衡的任务。类别不平衡里helmet的样本量远多于漏戴的负样本所以模型的Recall可能很高但Precision不够。我建议同时关注以下指标绘制P-R曲线和混淆矩阵来定位问题mAP0.5主要查检测框位置是否合理mAP0.5:0.95更严苛的定位精度指标F1-score综合精确率和召回率各类别的Recall确认helmet是否被漏检更多我这里第一轮训练结束时的数据是mAP0.5为0.87mAP0.5:0.95为0.52看起来好像“够用了”但把验证集按亮度分布拆开一看暗区画面平均像素亮度低于40的helmet召回率只有0.62远低于整体0.89的水平。这就是典型的指标掩盖问题——整体数字不错但关键子集非常差。解决这种偏科问题我采用的做法是对暗区样本做针对性增强把图片按亮度分成三组暗区样本以两倍概率参与训练。做了这一步之后暗区召回率从0.62提到了0.78整体mAP0.5也升到了0.90。所以评估时不要把数据一刀切分场景、分时段、分目标尺寸去评估才能真正知道模型在哪个环节掉链子。4. 煤矿井下安全帽检测的踩坑记录与排查方法4.1 标注文件与配置文件不匹配导致的训练崩溃训练一启动就提示AssertionError: class 2 is out of range多半是标注文件里的类别ID超过了nc配置。这个问题在手工合并多个数据集时特别常见——有人把不同来源的标注文件拼接在一起但类别ID初始值不一样比如A数据集的helmet是0B数据集里是1合并后模型的类别就彻底乱了。排查方法其实不复杂遍历所有label文件统计每个类别出现的次数再和data.yaml里的names列表一一对比。如果发现类别数超过nc就用脚本重映射。检查脚本思路如下find labels -name *.txt -exec awk {print $1} {} \; | sort | uniq -c还有一个隐蔽问题某些标注文件可能是空的也就是图像里没有目标但很多标注工具导出时会把空文件省略。YOLO训练时如果对应图片缺少同名的txt文件会被当作负样本处理这个没问题但如果某个txt文件是空文件且没有对应图片就会导致训练时报错。我用这个正则筛选一遍发现确实有十几张图片的标注文件变成0字节删除之后训练就恢复正常了。4.2 逆光、弱光和反光造成的漏检优化训练后在真实井下视频上测试最典型的漏检场景是矿灯正对镜头时的逆光区域以及远处巷道口的高光溢出区。这两类区域里helmet目标被过曝成一片白色边缘几乎消失模型直接放弃预测。常规对策是加数据增强比如随机曝光扰动、模拟镜头光晕、局部过曝块。但我实测效果最明显的其实是在推理端做多尺度融合。使用YOLOv8自带的augmentTrue推理模式相当于对每张图片做多尺度、翻转、色彩抖动等测试时增强再把多次预测结果融合。虽然推理时间会变长但针对逆光小目标漏检问题能把召回率提升5到8个百分点。如果你对速度有严格要求可以退而求其次训练时专门保留那些过曝头的样本并在后处理时放宽helmet的置信度阈值从0.25降到0.15让模型在低置信区域也保留候选框再靠跟踪算法来消除误检。这种方式在监控视频里效果很好因为同一目标会在连续帧反复出现单帧的低置信框通过时序平均后很少产生误报。4.3 远距离小目标与密集人群的推理优化井下巷道很长监控画面里经常出现距离镜头十几米的小目标整个人体可能只有三四十个像素高。YOLOv8在640分辨率下对小目标的检测能力有限所以针对远距离场景我用了两个方案这里分享给你作为参考。第一个方案是SAHI切片推理。把大图切成若干有重叠的小图块分别送进模型推理再把结果拼回去。实测在密集场景下小目标召回率能提升15%以上但推理时间会成倍增加只适合离线分析或边缘盒子性能充足的情况。第二个方案是在模型输出端做专门优化——训练时把原本的640输入分辨率改成1280虽然训练速度慢一些但模型在推理阶段可以用原始分辨率观察远距离目标小目标检测能力提升明显。密集人群场景还有一个容易忽略的问题两个安全帽紧挨在一起时模型倾向于输出一个框框住两个人。解决这个问题的思路不是调模型参数而是在标注阶段保证紧邻目标被分别框出尤其不能把多个目标合并成一个框。标注工具里往往没有这个硬性提示需要标注规范中明确写出来并抽查执行。5. 数据集的后续使用与个人经验补充这套“煤矿井下安全帽数据集已标注”的数据集从整理到最终落地我最大的感触是数据集的构建价值不在“数量大”而在“标注规范与场景贴合度”。如果后续要把它和视觉关系数据集或X光安检物品检测场景做交叉复用建议先确认标注格式统一性再重新校正类别定义。比如某平台需要的是“人-帽”关系而不是“人-帽”两个独立检测框那就要在现有数据上再做一层关系标注这个二次标注的规范和成本必须提前规划。使用这份数据时还建议注意几个点一是确认数据集的版权和使用范围井下的监控录像涉及员工隐私如果拿到的原始视频没有做匿名化处理在转交或开源前必须对画面中的人脸和工牌信息做模糊处理二是井下场景的天气、班次、季节差异会显著影响数据分布建议在采集中刻意覆盖白天班和夜班的不同时段只覆盖单一班次会让模型在换班后出现性能跳水。最后再补充一个小技巧实际部署时别只盯着模型指标建议在摄像头端加一个简单的ROI区域配置只检测设定好的人员活动区域把墙壁、煤堆、运输皮带这些永远不会出现人的区域直接排除掉。我实测下来ROI裁剪能把FPS提高10%到20%还能减少很多来自煤壁纹理的误检。这行代码量不大但性价比极高属于那种做了就赚到的优化。本文还有配套的精品资源点击获取