煤矿井下智能监控、打钻过程自动化监测、安全行为识别、灾害防治辅助系统 检测工人是否佩戴安全帽 推动煤矿智能化发展 智能矿山、工业AI、安全生产,煤矿井下钻场目标检测数据集


在这里插入图片描述

煤矿井下钻场目标检测数据集信息表

项目 内容
数据集名称 煤矿井下钻场目标检测数据集
总图像数量 70,948 张
数据大小 8.8 GB
标注格式 PASCAL VOC(.xml)、YOLO(.txt)双格式提供
目标类别数 5 类
应用场景 煤矿井下智能监控、打钻过程自动化监测、安全行为识别、灾害防治辅助系统
数据来源 煤矿用本安型执法记录仪实地拍摄
构建流程 数据采集 → 数据清洗 → 人工标注 → 专家抽检核查 → 标准化发布

类别标签和标注数量信息整理的表格:

类别标签及标注数量统计表

类别编号 英文标签 中文名称 标注数量(实例数)
0 chuck 夹持器 54,207
1 coal_miner 煤矿工人 39,482
2 drill_pipe 钻杆 67,284
3 gripper 卡盘 70,253
4 mine_safety_helmet 矿井安全帽 31,119
总计 —— —— 262,345

在这里插入图片描述

类别标签及目标分布统计表

类别编号 英文标签 中文名称 描述
0 clamp 夹持器 钻机中用于固定钻杆的机械装置
1 drill_chuck 钻机卡盘 控制钻杆旋转的核心部件
2 miner 煤矿工人 井下作业人员
3 safety_helmet 矿井安全帽 工人佩戴的安全防护装备(常作为独立目标检测)
4 drill_rod 钻杆 打钻过程中使用的长条形金属杆件

✅ 注:安全帽与工人可分别检测,支持个体防护装备(PPE)合规性分析。


在这里插入图片描述

数据集特点总结

特点 说明
超大规模数据集 包含 70,948 张真实井下图像,是目前公开中规模领先的煤矿专用目标检测数据集。
多目标覆盖 涵盖打钻作业中的关键设备与人员,支持全流程智能监控。
双标注格式支持 PASCAL VOC(XML)YOLO(TXT) 格式,兼容主流深度学习框架(如 YOLOv5/v8、Faster R-CNN、SSD 等)。
高质量标注 经过专业数据清洗与专家抽检核查,确保标注准确性与一致性。
多样化场景 来自多个不同钻场,涵盖不同光照、烟尘、遮挡、角度等复杂井下环境,提升模型鲁棒性。
高应用价值 支持打钻过程自动化监控、人员行为分析、设备状态识别、安全隐患预警等智能化应用。

在这里插入图片描述

典型应用方向

  • 打钻过程实时监测:自动识别钻杆进给、卡盘动作等关键操作。
  • 安全合规检测:检测工人是否佩戴安全帽,实现PPE自动检查。
  • 设备状态分析:通过夹持器和卡盘位置判断设备运行状态。
  • 智能巡检系统:集成至煤矿AI监控平台,提升井下作业安全性。
  • 科研与算法训练:为深度学习模型提供高质量训练数据,推动煤矿智能化发展。

你提供的 煤矿井下钻场目标检测数据集 是一个极具工业价值和研究意义的高质量数据集,包含 70,948 张图像、5 类关键目标(夹持器、钻机卡盘、煤矿工人、矿井安全帽、钻杆),支持 PASCAL VOC(XML)和 YOLO 格式,总大小 8.8GB。该数据集可用于构建智能打钻监控系统、人员行为识别、设备状态监测、安全预警等智能化煤矿应用。

以下是 从环境搭建 → 数据预处理 → YOLOv8 模型训练 → 推理 → 评估 → 部署 的完整全流程,确保你可以高效利用这个大规模工业数据集。


✅ 一、系统环境搭建(CUDA + Anaconda + Python)

1. 确认 CUDA 驱动(GPU 加速)

nvidia-smi
  • 要求:NVIDIA GPU(建议 ≥ RTX 3090 / A100)
  • CUDA 版本 ≥ 11.8(推荐 12.1)

如未安装驱动,请前往 NVIDIA 官网 下载。


2. 安装 Anaconda(Python 包管理器)

前往 https://www.anaconda.com/products/distribution 下载并安装。


3. 创建 Python 虚拟环境

# 创建名为 coal_mine_detection 的环境
conda create -n coal_mine_detection python=3.9

# 激活环境
conda activate coal_mine_detection

4. 安装必要依赖

# 安装 PyTorch(以 CUDA 11.8 为例)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

# 安装 YOLOv8 官方库
pip install ultralytics opencv-python numpy matplotlib tqdm scikit-learn pandas pillow lxml

# 可选:TensorBoard 可视化
pip install tensorboard

# 验证 GPU 是否可用
python -c "import torch; print(torch.cuda.is_available())"
# 应输出 True

lxml 用于解析 XML(VOC 格式)


✅ 二、数据集结构与格式转换(VOC → YOLO)

YOLOv8 默认使用 YOLO 格式,因此需要将 VOC XML 转换为 .txt 标注。

目录结构建议

coal_mine_dataset/
├── images/
│   ├── train/
│   ├── val/
│   └── test/
├── labels_voc/           # 原始 XML 文件
├── labels/               # 转换后的 YOLO .txt 文件
└── data.yaml

VOC → YOLO 转换脚本

# convert_voc_to_yolo.py
import os
import xml.etree.ElementTree as ET
from pathlib import Path

# 类别映射(必须与训练一致)
classes = {
    'clamp': 0,           # 夹持器
    'drill_chuck': 1,     # 钻机卡盘
    'miner': 2,           # 煤矿工人
    'safety_helmet': 3,   # 矿井安全帽
    'drill_rod': 4        # 钻杆
}

def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    return (x * dw, y * dh, w * dw, h * dh)

def convert_annotation(xml_file, output_folder):
    tree = ET.parse(xml_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    txt_file = os.path.join(output_folder, Path(xml_file).stem + '.txt')
    with open(txt_file, 'w') as f:
        for obj in root.iter('object'):
            cls = obj.find('name').text.lower().strip()
            if cls not in classes:
                continue
            cls_id = classes[cls]
            xmlbox = obj.find('bndbox')
            b = [float(xmlbox.find(x).text) for x in ['xmin', 'xmax', 'ymin', 'ymax']]
            bb = convert((w, h), b)
            f.write(f"{cls_id} {' '.join(f'{x:.6f}' for x in bb)}\n")

# 执行转换
voc_labels = 'coal_mine_dataset/labels_voc'
yolo_labels = 'coal_mine_dataset/labels'
os.makedirs(yolo_labels, exist_ok=True)

for xml_file in Path(voc_labels).glob('*.xml'):
    convert_annotation(xml_file, yolo_labels)

print("VOC to YOLO conversion completed.")

✅ 运行后,所有 .xml 将转为 .txt 存入 labels/


✅ 三、数据划分(train/val/test)

# split_data.py
import os
import random
from pathlib import Path

image_dir = 'coal_mine_dataset/images_raw'  # 原始图像目录
output_dir = 'coal_mine_dataset/images'
label_dir = 'coal_mine_dataset/labels'

# 创建子集目录
for subset in ['train', 'val', 'test']:
    os.makedirs(f'{output_dir}/{subset}', exist_ok=True)

# 获取所有图像文件
images = [f for f in os.listdir(image_dir) if f.endswith(('.jpg', '.jpeg', '.png'))]
random.shuffle(images)

# 划分比例:80% train, 10% val, 10% test
n = len(images)
train_files = images[:int(0.8*n)]
val_files = images[int(0.8*n):int(0.9*n)]
test_files = images[int(0.9*n):]

def copy_files(files, subset):
    for img in files:
        src_img = os.path.join(image_dir, img)
        dst_img = os.path.join(output_dir, subset, img)
        os.system(f'cp "{src_img}" "{dst_img}"')

        # 同步复制 label
        label = Path(img).stem + '.txt'
        src_lbl = os.path.join(label_dir, label)
        dst_lbl = os.path.join('coal_mine_dataset/labels', subset, label)
        if os.path.exists(src_lbl):
            os.system(f'cp "{src_lbl}" "{dst_lbl}"')

copy_files(train_files, 'train')
copy_files(val_files, 'val')
copy_files(test_files, 'test')

print("Data split completed: 8:1:1")

✅ 四、data.yaml 配置文件

# data.yaml
train: ./coal_mine_dataset/images/train
val: ./coal_mine_dataset/images/val
test: ./coal_mine_dataset/images/test

# 类别数量
nc: 5

# 类别名称(英文)
names:
  - clamp            # 夹持器
  - drill_chuck      # 钻机卡盘
  - miner            # 煤矿工人
  - safety_helmet    # 矿井安全帽
  - drill_rod        # 钻杆

# 中文名称(用于可视化)
names_zh:
  - 夹持器
  - 钻机卡盘
  - 煤矿工人
  - 安全帽
  - 钻杆

✅ 五、调用 YOLOv8 官方预训练模型进行训练

由于是工业场景,光照差、遮挡多、目标小(如安全帽),建议使用 YOLOv8mYOLOv8l

from ultralytics import YOLO

# 加载官方预训练模型
model = YOLO('yolov8m.pt')  # 推荐使用中等模型

# 开始训练(大规模数据,可训练更久)
results = model.train(
    data='data.yaml',           # 数据配置文件路径
    epochs=200,                 # 大数据集建议 150~300
    batch=32,                   # 根据显存调整(A100 可用 64)
    imgsz=640,                  # 图像尺寸(提升小目标检测)
    optimizer='AdamW',          # 更稳定优化器
    lr0=0.001,
    weight_decay=0.0005,
    momentum=0.937,

    # 数据增强(关键!提升泛化)
    augment=True,
    hsv_h=0.015,
    hsv_s=0.7,
    hsv_v=0.4,
    degrees=10.0,
    translate=0.1,
    scale=0.5,
    shear=0.0,
    flipud=0.0,
    fliplr=0.5,
    mosaic=1.0,
    mixup=0.1,
    copy_paste=0.1,             # 对小目标特别有效

    # 正则化
    dropout=0.2,
    label_smoothing=0.05,

    # 学习率调度
    cos_lr=True,                # 余弦退火

    # 保存与日志
    project='runs/train',
    name='coal_mine_yolov8m',
    save=True,
    save_period=10,
    exist_ok=False,

    # 缓存(内存充足时开启)
    cache=True,

    # 分布式训练(多卡)
    # device=[0,1]  # 多GPU
)

✅ 训练时长:约 12~24 小时(取决于 GPU 数量)


✅ 六、推理代码(单图 / 批量 / 视频)

1. 单张图像推理

from ultralytics import YOLO
from PIL import Image

model = YOLO('runs/train/coal_mine_yolov8m/weights/best.pt')
results = model('underground_scene.jpg', conf=0.3)

for r in results:
    im_array = r.plot()
    im = Image.fromarray(im_array[..., ::-1])
    im.show()

2. 批量图像推理

results = model.predict(
    source='coal_mine_dataset/images/test',
    save=True,
    project='runs/detect',
    name='coal_mine_test',
    conf=0.3,
    imgsz=640
)

3. 视频检测(井下监控视频)

results = model.predict(
    source='drilling_process.mp4',
    save=True,
    project='runs/detect/video',
    name='drilling_monitoring',
    conf=0.3,
    imgsz=640
)

✅ 七、模型评估

1. 在验证集上评估

metrics = model.val(
    data='data.yaml',
    split='val',
    batch=32,
    imgsz=640,
    save_json=True,
    project='runs/val',
    name='coal_mine_eval'
)

print(f"mAP@0.5: {metrics.box.map50:.4f}")
print(f"mAP@0.5:0.95: {metrics.box.map:.4f}")
print(f"Precision: {metrics.box.p:.4f}")
print(f"Recall: {metrics.box.r:.4f}")

# 每类 AP
for i, name in enumerate(model.names):
    print(f"{name}: AP@0.5 = {metrics.box.ap[i]:.4f}")

2. 在测试集上独立评估(最终性能)

test_metrics = model.val(
    data='data.yaml',
    split='test',
    name='final_test'
)
print(f"Final Test mAP@0.5: {test_metrics.box.map50:.4f}")

✅ 八、模型导出(ONNX / TensorRT / TFLite)

# 导出为 ONNX
model.export(format='onnx', dynamic=True, opset=13, imgsz=640)

# 导出为 TensorRT(NVIDIA Jetson / 工控机)
model.export(format='engine', half=True, dynamic=True)

# 导出为 TFLite(边缘设备)
model.export(format='tflite', int8=True)

# 导出为 CoreML(iOS)
model.export(format='coreml')

✅ 九、工业场景优化建议

问题 建议
光照差、对比度低 使用 hsv_v, CLAHE, Gamma Correction
小目标(安全帽、钻杆) 使用 copy_paste, mosaic, imgsz=640
遮挡严重 使用 copy_paste, mixup
实时性要求高 使用 yolov8s + TensorRT + FP16
模型轻量化部署 使用 prune 剪枝或 QAT 量化

✅ 十、应用场景与拓展

✅ 应用场景:

  • 智能打钻监控系统:实时检测设备与人员状态
  • 安全行为识别:未戴安全帽报警
  • 钻杆计数与长度估算:辅助打钻进度管理
  • 设备故障预警:夹持器异常、卡盘松动识别
  • 数字孪生系统:构建井下三维可视化场景

✅ 可拓展方向:

  • 结合 DeepSORT 实现人员/设备跟踪
  • 添加姿态估计(工人动作分析)
  • 构建 Web 平台实现远程监控
  • 部署到边缘计算盒子(Jetson Orin)

✅ 十一、总结

你已经掌握如何:

  • ✅ 搭建大规模工业检测环境
  • ✅ 将 VOC 数据转换为 YOLO 格式
  • ✅ 划分 train/val/test 数据集
  • ✅ 使用 YOLOv8 训练煤矿井下目标检测模型
  • ✅ 完成推理、评估、模型导出全流程

🎯 下一步建议

  • 构建 Flask API 提供 REST 接口
  • 集成视频流实时分析(RTSP)
  • 添加报警模块(未戴安全帽、设备异常)
  • 部署到煤矿边缘服务器或工控机

如果你需要我提供:

  • Flask API 接口代码
  • 视频流实时检测脚本
  • 安全帽佩戴检测报警系统
  • 多摄像头融合监控方案

欢迎继续提问!祝你在 智能矿山、工业AI、安全生产 领域取得突破!⛏️🤖🛡️

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐