⛏️ 井下钻场智能监控系统:YOLOv8驱动的多目标检测全栈实战 | 打钻过程监测、安全行为识别、灾害防治辅助系统
煤矿井下打钻作业环境复杂,设备状态与人员安全行为监测至关重要。本文基于70,948张实地标注图像,构建了覆盖夹持器、钻机卡盘、煤矿工人、安全帽、钻杆5类关键目标的大规模数据集,并提供从环境配置、VOC到YOLO格式转换、YOLOv8模型训练、推理优化到TensorRT部署的完整代码,为智能矿山建设提供高精度、可落地的AI解决方案。
📊 数据集核心指标与构成
数据集信息表
| 项目 | 内容 |
|---|---|
| 名称 | 煤矿井下钻场目标检测数据集 |
| 图像规模 | 70,948张 (8.8 GB) |
| 标注格式 | PASCAL VOC (XML) + YOLO (TXT) 双格式 |
| 目标类别 | 5类 (夹持器、钻机卡盘、工人、安全帽、钻杆) |
| 总标注实例 | 262,345个 |
| 数据来源 | 煤矿用本安型执法记录仪实地拍摄 |
| 构建流程 | 采集 → 清洗 → 人工标注 → 专家抽检核查 → 标准化发布 |

类别与标注数量统计
| 类别编号 | 英文标签 | 中文名称 | 标注实例数 |
|---|---|---|---|
| 0 | clamp | 夹持器 | 54,207 |
| 1 | drill_chuck | 钻机卡盘 | 70,253 |
| 2 | miner | 煤矿工人 | 39,482 |
| 3 | safety_helmet | 矿井安全帽 | 31,119 |
| 4 | drill_rod | 钻杆 | 67,284 |
| 总计 | -- | -- | 262,345 |


数据集特点
- 超大规模:7万余张真实井下图像,覆盖不同光照、烟尘、遮挡、角度等复杂场景。
- 多目标覆盖:同时检测关键设备与人员,支持打钻全流程监控与安全合规分析。
- 高质量标注:经过严格清洗与专家核查,确保标注准确性。
- 应用价值高:适用于打钻过程监测、安全行为识别、灾害防治辅助等系统。
🏗️ 项目目录结构建议
coal_mine_drilling_detection/
├── dataset/ # 数据集
│ ├── images_raw/ # 原始图像
│ ├── labels_voc/ # VOC格式XML标注
│ ├── images/ # 按子集划分的图像
│ │ ├── train/ (80%)
│ │ ├── val/ (10%)
│ │ └── test/ (10%)
│ ├── labels/ # 转换后的YOLO格式TXT
│ │ ├── train/
│ │ ├── val/
│ │ └── test/
│ └── data.yaml # 数据集配置文件
├── scripts/
│ ├── convert_voc_to_yolo.py # 格式转换脚本
│ ├── split_data.py # 数据划分脚本
│ ├── train_yolov8.py # 训练脚本
│ ├── predict.py # 推理脚本
│ └── evaluate.py # 评估脚本
├── models/
│ └── coal_mine_yolov8m.pt # 训练好的模型权重
└── requirements.txt # 项目依赖
💻 核心代码实现与场景注释
1. 环境准备与依赖安装
bash
# 对应主题场景:配置具有GPU加速的深度学习环境
# 1. 确认CUDA驱动 (需≥11.8)
nvidia-smi
# 2. 创建conda虚拟环境 (Python 3.9)
conda create -n coal_mine_detection python=3.9
conda activate coal_mine_detection
# 3. 安装PyTorch (CUDA 11.8版本示例)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 4. 安装YOLOv8及辅助库
pip install ultralytics opencv-python numpy matplotlib tqdm scikit-learn pandas pillow lxml tensorboard
# 5. 验证GPU可用性
python -c "import torch; print(torch.cuda.is_available())" # 应输出True
2. VOC标注转YOLO格式 scripts/convert_voc_to_yolo.py
python
# 对应主题场景:将井下钻场数据集的PASCAL VOC标注统一转换为YOLO格式
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_voc_to_yolo(xml_file, output_folder):
"""解析单个XML文件并生成对应的YOLO格式TXT"""
tree = ET.parse(xml_file)
root = tree.getroot()
size = root.find('size')
img_w = int(size.find('width').text)
img_h = int(size.find('height').text)
txt_path = os.path.join(output_folder, Path(xml_file).stem + '.txt')
with open(txt_path, 'w') as f:
for obj in root.iter('object'):
cls_name = obj.find('name').text.lower().strip()
if cls_name not in CLASSES:
continue
cls_id = CLASSES[cls_name]
box = obj.find('bndbox')
xmin = float(box.find('xmin').text)
ymin = float(box.find('ymin').text)
xmax = float(box.find('xmax').text)
ymax = float(box.find('ymax').text)
# 转换为YOLO归一化的中心点坐标和宽高
x_center = (xmin + xmax) / 2.0 / img_w
y_center = (ymin + ymax) / 2.0 / img_h
width = (xmax - xmin) / img_w
height = (ymax - ymin) / img_h
f.write(f"{cls_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n")
# 执行批量转换
voc_dir = 'dataset/labels_voc'
yolo_dir = 'dataset/labels'
os.makedirs(yolo_dir, exist_ok=True)
for xml_file in Path(voc_dir).glob('*.xml'):
convert_voc_to_yolo(xml_file, yolo_dir)
print("VOC to YOLO conversion completed.")
3. 数据集配置文件 dataset/data.yaml
yaml
# 对应主题场景:为YOLOv8指定训练、验证、测试数据路径及类别
train: ./dataset/images/train
val: ./dataset/images/val
test: ./dataset/images/test
nc: 5 # 类别数量
# 类别英文名 (顺序需与转换脚本中的CLASSES一致)
names: ['clamp', 'drill_chuck', 'miner', 'safety_helmet', 'drill_rod']
# 类别中文名 (用于可视化等)
names_zh: ['夹持器', '钻机卡盘', '煤矿工人', '安全帽', '钻杆']
4. YOLOv8模型训练脚本 scripts/train_yolov8.py
python
# 对应主题场景:利用预训练权重在井下钻场大规模数据集上微调模型
from ultralytics import YOLO
def train_drilling_model():
# 加载YOLOv8m预训练模型 (平衡速度与精度)
model = YOLO('yolov8m.pt')
# 训练配置 (针对工业场景优化)
results = model.train(
data='dataset/data.yaml',
epochs=200, # 大数据集,充分训练
batch=32, # 根据GPU显存调整 (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, # 几何变换
flipud=0.0, fliplr=0.5,
mosaic=1.0, # Mosaic增强
mixup=0.1, # MixUp增强
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 # 内存充足时开启以加速训练
)
return model
if __name__ == '__main__':
train_drilling_model()
5. 模型推理与可视化 scripts/predict.py
python
# 对应主题场景:加载训练好的模型,对井下监控图像或视频进行实时检测
from ultralytics import YOLO
import cv2
def detect_drilling_scene(model_path, source_path, conf_thres=0.3):
"""对图像或视频进行推理,并保存/显示结果"""
model = YOLO(model_path)
# 执行推理
results = model.predict(
source=source_path,
save=True, # 保存检测结果
project='runs/detect',
name='drilling_monitoring',
conf=conf_thres,
imgsz=640,
show_labels=True,
show_conf=True,
line_width=2
)
# 如需实时显示 (适用于单张图像)
if source_path.lower().endswith(('.jpg', '.jpeg', '.png')):
img = cv2.imread(source_path)
annotated_img = results[0].plot() # 获取标注后的图像
cv2.imshow('Drilling Scene Detection', annotated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
return results
if __name__ == '__main__':
# 单图检测示例
detect_drilling_scene(
model_path='runs/train/coal_mine_yolov8m/weights/best.pt',
source_path='path/to/underground_scene.jpg'
)
6. 模型评估 scripts/evaluate.py
python
# 对应主题场景:在独立测试集上评估模型性能,获取每类AP指标
from ultralytics import YOLO
def evaluate_model(model_path):
model = YOLO(model_path)
# 在验证集上评估
val_metrics = model.val(
data='dataset/data.yaml',
split='val',
batch=32,
imgsz=640,
save_json=True,
project='runs/val',
name='drilling_eval'
)
# 打印核心指标
print(f"mAP@0.5: {val_metrics.box.map50:.4f}")
print(f"mAP@0.5:0.95: {val_metrics.box.map:.4f}")
print(f"Precision: {val_metrics.box.p:.4f}")
print(f"Recall: {val_metrics.box.r:.4f}")
# 打印每类AP
print("\nPer-class AP@0.5:")
for i, name in enumerate(model.names):
print(f" {name}: {val_metrics.box.ap[i]:.4f}")
# 在测试集上独立评估 (最终性能)
test_metrics = model.val(data='dataset/data.yaml', split='test')
print(f"\nFinal Test mAP@0.5: {test_metrics.box.map50:.4f}")
if __name__ == '__main__':
evaluate_model('runs/train/coal_mine_yolov8m/weights/best.pt')
7. 模型导出 (ONNX/TensorRT) scripts/export.py
python
# 对应主题场景:将PyTorch模型转为工业部署格式,提升推理速度
from ultralytics import YOLO
def export_models(model_path):
model = YOLO(model_path)
# 导出为ONNX (动态尺寸,兼容性好)
model.export(format='onnx', dynamic=True, opset=13, imgsz=640)
# 导出为TensorRT (NVIDIA Jetson/工控机,FP16加速)
model.export(format='engine', half=True, dynamic=True)
# 导出为TFLite (边缘设备,INT8量化)
# model.export(format='tflite', int8=True)
if __name__ == '__main__':
export_models('runs/train/coal_mine_yolov8m/weights/best.pt')
🔧 工业场景优化建议
| 常见问题 | 优化策略 |
|---|---|
| 井下光照差、对比度低 | 训练时增强 hsv_v 参数;推理前应用CLAHE或Gamma校正。 |
| 安全帽、钻杆等小目标 | 使用 copy_paste、mosaic 增强;适当提高 imgsz 至640或768。 |
| 目标遮挡严重 | 使用 mixup、copy_paste 增强;调整NMS的IoU阈值至0.4-0.5。 |
| 实时性要求高 | 换用 yolov8s 模型;导出为TensorRT并启用FP16推理。 |
| 边缘设备部署 | 使用INT8量化导出为TFLite;或使用NVIDIA Jetson平台运行TensorRT。 |
🔮 应用场景与拓展方向
核心应用场景
- 智能打钻监控系统:实时识别钻杆进给、卡盘动作、夹持器状态。
- 安全合规检测:自动检测工人是否佩戴安全帽,实现PPE合规性分析。
- 设备状态预警:通过夹持器和卡盘位置异常,判断设备故障隐患。
- 钻杆计数与进度管理:追踪钻杆使用数量,辅助打钻作业管理。
- 数字孪生系统:为井下三维可视化场景提供目标检测数据支撑。
可拓展方向
- 行为识别:结合姿态估计,检测工人是否有危险操作行为。
- 多模态融合:融合红外或深度相机数据,提升在烟尘、低光照环境下的检测鲁棒性。
- 预测性维护:分析设备检测历史数据,预测关键部件剩余寿命。
- 边缘计算:将优化后的轻量级模型部署至井下防爆边缘计算盒子,实现本地实时告警。
🏷️ 技术标签
#智慧矿山 #井下钻场 #打钻监测 #安全行为识别 #YOLOv8 #目标检测 #煤矿安全 #工业AI #深度学习 #计算机视觉