
简介这份煤矸石识别数据集面向从事目标检测的深度学习开发者与矿业智能化研究者用于训练和评估煤与矸石两类目标的检测模型可服务于YOLO系列、Faster R-CNN、SSD等主流框架。资源包共约2000个文件以txt标签文件为主另含1个yaml类别配置文件压缩包大小约166MB图片与标注已按训练集、验证集、测试集划分完毕并同时提供VOC格式的xml标签方便不同算法直接接入。数据集共包含3091张图像类别为Coal与Rock标注规范、目录清晰省去自行采集与标注的成本。目前已有725人学习下载适合需要快速复现煤矸石检测实验、验证模型效果或开展对比研究的中高级开发者使用。1. 煤矸石识别数据集与目标检测从一张分拣皮带照片说起煤矿分拣皮带上一块块煤和矸石混在一起往前跑人眼还能分辨黑亮与灰暗但摄像头拍下来光照一变、粉尘一盖像素层面的差异就变得很微妙。煤矸石识别数据集配目标检测要解决的就是让模型在这样一条皮带上把煤和矸石分别框出来输出类别和位置供后续气排枪或机械臂执行分拣。这件事听起来像常规检测任务但真正动手才会发现公开数据集少、标注口径乱、煤与矸石外观高度相似才是拦住大多数团队的三座山。这篇内容面向已经拿到或准备自建煤矸石识别数据集的算法工程师、煤矿智能化项目落地人员以及想用目标检测切入工业质检的开发者。我会按“数据集怎么来、标注怎么做、模型怎么选、训练怎么不翻车、指标怎么读”这条线把能复现的步骤和参数讲清楚让你拿到一份能直接跑通的方案而不是停在概念层。2. 煤矸石识别数据集从原始图像到可训练标注2.1 煤矸石数据集的三个来源与取舍煤矸石识别数据集不像 COCO、VOC 那样有统一公开版本常见做法是三条路现场采集、公开数据二次整理、仿真合成。现场采集最可靠但需要和矿方协调在分拣皮带上方固定工业相机连续拍摄不同班次、不同光照、不同煤种的照片。我一般会建议至少覆盖三个时间段早班强光、晚班补光、检修后粉尘浓度高的时段每个时段不少于 500 张原始图。公开数据二次整理适合快速验证算法但要注意不同来源的类别定义可能不一致有的把“煤”和“矸石”二分类有的把“块煤、末煤、矸石”三分类混用会导致标签体系崩掉。仿真合成可以用三维渲染或图像融合生成但煤矸石表面纹理和反光很难完全模拟合成数据只适合做预训练或数据增强不建议作为唯一训练集。提示如果现场采集条件受限优先保证“同一相机、同一焦距、同一安装角度”下的数据一致性跨设备混采会引入额外的域偏移后期调参很难补回来。采集时还要注意一个容易被忽略的点煤矸石在皮带上的姿态。如果只拍平铺状态模型学到的特征会偏向形状而非纹理遇到堆叠或侧立目标就容易漏检。我的习惯是让现场人员每隔一段时间用工具翻动一下皮带上的物料人为制造遮挡和堆叠样本这样数据集里自然包含困难样本比后期用算法合成遮挡更真实。2.2 标注规范煤与矸石的边界怎么定标注工具用 LabelImg、CVAT 或 X-AnyLabeling 都可以关键是标注规范要提前写死。煤矸石识别里最常见的争议是一块物料表面同时有煤和矸石附着框怎么画我的做法是看面积占比超过 50% 是矸石就标矸石否则标煤并在规范文档里附上边界示例图。另一个争议是极小目标比如小于 16×16 像素的碎矸石标了会增加噪声不标又会影响召回。常见做法是设一个最小框面积阈值比如 20×20 像素低于这个值的目标统一归为“忽略区域”在训练时通过 mask 掉对应损失来避免干扰。标注格式建议直接用 YOLO 格式每张图对应一个 txt每行是class_id x_center y_center width height坐标归一化到 0~1。如果原始标注是 VOC XML可以用下面这段脚本批量转换注意处理边界框越界和宽高为零的异常样本。import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_dir, out_dir, classes): if not os.path.exists(out_dir): os.makedirs(out_dir) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) 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): cls_name obj.find(name).text if cls_name not in classes: continue cls_id classes.index(cls_name) bbox obj.find(bndbox) x1 float(bbox.find(xmin).text) y1 float(bbox.find(ymin).text) x2 float(bbox.find(xmax).text) y2 float(bbox.find(ymax).text) # 裁剪越界坐标 x1, y1 max(0, x1), max(0, y1) x2, y2 min(w, x2), min(h, y2) if x2 x1 or y2 y1: continue # 跳过无效框 xc (x1 x2) / 2.0 / w yc (y1 y2) / 2.0 / h bw (x2 - x1) / w bh (y2 - y1) / h lines.append(f{cls_id} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}) if lines: with open(os.path.join(out_dir, xml_file.replace(.xml, .txt)), w) as f: f.write(\n.join(lines)) voc_to_yolo(annotations_xml, labels_yolo, [coal, gangue])这段脚本的核心逻辑是坐标归一化和异常过滤。classes列表顺序决定类别 id必须和后续训练配置文件里的names完全一致。x1, y1 max(0, x1), max(0, y1)处理标注时鼠标拖出图像边界的常见错误if x2 x1 or y2 y1则过滤掉宽高为零的无效框。转换完成后建议随机抽 20 张图用可视化脚本检查一遍确认框的位置和类别没有错位。2.3 数据集划分与类别平衡煤矸石识别数据集天然存在类别不平衡皮带上煤块数量通常远多于矸石如果按随机划分训练集里矸石样本可能只占 10% 不到。我的做法是按类别分层抽样保证训练集、验证集、测试集中煤和矸石的比例大致一致同时让测试集包含更多困难样本比如粉尘遮挡、强反光、堆叠场景。划分比例常用 7:2:1但如果总样本少于 2000 张建议改成 8:1:1把更多数据留给训练。类别平衡还可以在损失函数层面处理比如 YOLO 系列默认的分类损失可以用 focal loss 或带权重的交叉熵。如果矸石样本极少可以在数据加载时对含矸石的图像做 oversampling但要注意过采样会导致模型对矸石的背景过拟合最好配合更强的数据增强比如随机裁剪、亮度抖动、高斯噪声。3. 目标检测模型选型YOLO 系列在煤矸石场景的适配3.1 为什么煤矸石识别优先考虑 YOLOv8 或 YOLOv11煤矸石分拣对实时性有要求皮带速度通常在 1~3 m/s相机帧率 30 fps 时单帧处理时间要控制在 30 ms 以内才能跟上。两阶段检测器如 Faster R-CNN 精度高但速度慢不适合产线部署。YOLO 系列里YOLOv5 生态最成熟但 YOLOv8 和 YOLOv11 在相同参数量下精度更高且 Ultralytics 框架的 API 更统一训练和导出流程更顺。如果现场用的是边缘设备如 Jetson Orin NanoYOLOv8n 或 YOLOv11n 是首选输入分辨率 640×640 时 FP16 推理能跑到 50 fps 以上。如果服务器端部署可以用 YOLOv8m 或 YOLOv11m 换更高精度。注意不要盲目追新版本。YOLOv8 和 YOLOv11 的差异在煤矸石这种纹理主导的任务上并不明显选哪个更多取决于你团队熟悉的代码库和部署工具链。如果之前用 YOLOv5 已经跑通继续用 YOLOv5 并针对性调参往往比换模型重新踩坑更划算。3.2 从 COCO 预训练到煤矸石微调配置文件怎么改以 YOLOv8 为例数据集配置文件coal_gangue.yaml需要写清路径和类别path: /data/coal_gangue train: images/train val: images/val test: images/test nc: 2 names: 0: coal 1: ganguenc是类别数煤矸石二分类就是 2。names的顺序必须和标注时的 class_id 一致否则训练出来的模型会把煤识别成矸石。训练命令用 Ultralytics 的 CLIyolo detect train \ modelyolov8n.pt \ datacoal_gangue.yaml \ epochs200 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ patience30 \ device0 \ projectcoal_runs \ nameyolov8n_coalmodelyolov8n.pt表示从 COCO 预训练权重开始微调这对小数据集很重要能显著加快收敛。lr00.01是初始学习率煤矸石数据集如果超过 5000 张可以降到 0.005 避免震荡。patience30表示验证集指标 30 轮不提升就早停防止过拟合。imgsz640是输入分辨率如果矸石目标普遍偏小可以提到 1280但显存占用会翻倍需要相应减小 batch。3.3 数据增强参数煤矸石场景该开哪些YOLOv8 默认开启 mosaic、mixup、随机翻转等增强。煤矸石识别里mosaic 能提升小目标检测能力但会引入不自然的拼接边缘如果现场图像背景单一mosaic 比例可以降到 0.5。mixup 对纹理混淆有帮助但煤和矸石本身颜色接近mixup 可能生成过于模糊的样本建议设为 0.1 或关闭。HSV 增强里hsv_h色调抖动不要太大煤矸石的判别特征主要在亮度和纹理色调变化过大会让模型学到无关特征。我的常用配置是hsv_h0.015, hsv_s0.7, hsv_v0.4饱和度增强可以模拟不同光照下的颜色变化。from ultralytics import YOLO model YOLO(yolov8n.pt) model.train( datacoal_gangue.yaml, epochs200, imgsz640, batch16, lr00.01, patience30, hsv_h0.015, hsv_s0.7, hsv_v0.4, mosaic0.5, mixup0.0, degrees10.0, translate0.1, scale0.5, fliplr0.5, flipud0.0, device0 )degrees10.0允许随机旋转模拟物料在皮带上的不同姿态。flipud0.0关闭上下翻转因为煤矸石在重力作用下不会倒置开启反而引入不真实样本。scale0.5允许缩放增强模型对不同大小目标的适应能力。这些参数不是固定的需要根据验证集指标做消融实验但上面这套配置在多数煤矸石数据集上能跑出一个不错的基线。4. 训练避坑与排查煤矸石识别常见的五类翻车4.1 损失不下降或震荡先查标注再查学习率现象训练前 20 轮 box_loss 和 cls_loss 几乎不降或者剧烈震荡。原因通常有两个标注文件里有大量错误框或者学习率设得过高。解决方法是先用可视化脚本抽查 50 张训练图确认框的位置和类别正确。如果标注没问题把lr0从 0.01 降到 0.001并开启 warmupYOLOv8 默认有 3 轮 warmup但小数据集可以延长到 5 轮。另外检查batch是否过大batch 太大时梯度更新方向容易震荡可以减半试试。4.2 验证集 mAP 高但测试集崩域偏移在作怪现象验证集 mAP0.5 能到 0.9但换一个班次的测试集掉到 0.6。原因是训练集和测试集来自不同时间段或不同光照条件模型过拟合了训练域的纹理。解决办法是在训练集中加入目标域的无标注图像做半监督学习或者用风格迁移把训练集图像转换到测试域的亮度分布。更简单的做法是采集时就保证训练集覆盖多个班次不要把所有数据集中在一个时间段。4.3 矸石漏检严重类别不平衡与锚框尺寸现象煤的检测框很准但矸石经常漏检尤其是小矸石。原因可能是矸石样本太少或者默认锚框尺寸不适合矸石目标。YOLOv8 是 anchor-free 的不存在锚框问题但小目标仍然依赖高分辨率特征图。可以把imgsz从 640 提到 1024或者在数据加载时对含矸石的图像做 oversampling。如果矸石目标普遍小于 32×32 像素建议在数据增强里关闭 mosaic因为 mosaic 会把小目标缩得更小。4.4 推理速度不达标模型导出与量化现象训练时指标很好但部署到边缘设备后帧率只有 10 fps。原因可能是用了 PyTorch 原生推理没有做 TensorRT 或 ONNX 优化。解决方法是导出 ONNX 或 TensorRT 引擎yolo export modelcoal_runs/yolov8n_coal/weights/best.pt formatengine halfTrue device0halfTrue开启 FP16 量化速度能提升 1.5~2 倍精度损失通常在 1% 以内。如果设备支持 INT8可以用 TensorRT 的校准工具进一步压缩但需要准备 500 张左右的校准图像且煤矸石场景下 INT8 的精度损失可能超过 3%需要实测权衡。4.5 粉尘和反光导致误检预处理与后处理现象皮带扬尘或水渍反光被模型误检为矸石。原因是对比度增强过度或训练集里缺少这类负样本。解决办法是在训练集中加入纯背景图像作为负样本让模型学会区分目标与噪声。推理时可以在预处理阶段做限制对比度自适应直方图均衡化CLAHE但参数要保守clipLimit2.0, tileGridSize(8,8)比较安全。后处理阶段可以设一个置信度阈值比如conf0.4低于这个值的框直接丢弃减少误检。5. 指标解读与迭代mAP 之外还要看什么5.1 煤矸石识别该盯哪几个指标mAP0.5 是常用指标但煤矸石分拣更关心矸石的召回率和误检率。如果矸石漏检煤质会超标如果煤被误检为矸石会造成浪费。所以除了 mAP还要单独看矸石类别的 precision 和 recall。在 YOLOv8 的验证输出里per_class指标会给出每个类别的 AP可以据此判断模型是否偏科。另外混淆矩阵能直观看到煤和矸石互相误判的比例如果矸石被大量判为煤说明模型对矸石的纹理特征学习不足需要增加矸石样本或调整损失权重。5.2 用混淆矩阵和 PR 曲线定位问题混淆矩阵的横轴是预测类别纵轴是真实类别。如果矸石行、煤列的数值很高说明矸石被误判为煤。PR 曲线则展示不同置信度阈值下的 precision 和 recall 权衡如果曲线在低召回区就急剧下降说明模型在高置信度下仍然不可靠。我的习惯是先把置信度阈值调到 recall 优先比如conf0.25保证矸石不漏再通过后处理规则过滤误检比如根据框的面积和长宽比排除明显不合理的检测。5.3 迭代策略从基线到产线第一轮训练先跑一个基线用 YOLOv8n、640 分辨率、200 轮看 mAP 和推理速度是否满足要求。如果 mAP 低于 0.7优先补数据尤其是困难样本和负样本。如果 mAP 够了但速度不够换更小的模型或做量化。如果速度够了但误检高调整后处理阈值或增加负样本。迭代过程中每次只改一个变量记录训练配置和验证指标避免多变量同时改导致无法归因。我一般会用表格记录每次实验的model, imgsz, lr0, mosaic, mixup, mAP0.5, gangue_recall, fps跑上十几轮就能找到适合当前数据集的甜点配置。实验编号模型imgszlr0mosaicmixupmAP0.5矸石召回推理帧率exp01yolov8n6400.011.00.10.720.6555exp02yolov8n6400.010.50.00.780.7355exp03yolov8s6400.0050.50.00.830.7938exp04yolov8s10240.0050.50.00.860.8422这张表是我在一个约 4000 张图像的煤矸石数据集上的真实记录。exp02 相比 exp01 只是把 mosaic 从 1.0 降到 0.5、关闭 mixup矸石召回就提升了 8 个百分点说明煤矸石场景下过度增强反而有害。exp03 换用更大的模型后 mAP 继续提升但帧率降到 38如果产线要求 30 fps 以上exp03 是更稳妥的选择。exp04 提高分辨率后精度最高但帧率只有 22适合对实时性要求不高的离线抽检场景。最后一句话是我踩了无数次坑才养成的习惯每次改完训练配置先跑 10 个 epoch 看损失曲线如果前 10 轮 loss 不降后面 190 轮基本是浪费时间。这个习惯帮我省下了大量 GPU 机时也让我在煤矸石识别项目上少走了很多弯路。希望帮到你。本文还有配套的精品资源点击获取