尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

煤矿输送带异物检测:从数据集标注到YOLO训练实战

发布时间:2026/9/28 1:14:57

资讯中心
01
ARTICLE

煤矿输送带异物检测:从数据集标注到YOLO训练实战

煤矿输送带异物检测:从数据集标注到YOLO训练实战
简介这份煤矿输送带异物识别数据集面向目标检测与工业视觉应用专供YOLO、Faster RCNN、SSD等主流模型训练使用。压缩包共2000个文件其中包含1999个txt标注文件与1个yaml配置文件整体大小约117.87MBtxt文件采用YOLO格式记录目标框坐标yaml文件定义类别名称及数据集路径标注文件已按训练集、验证集和测试集划分可直接用于模型训练与迭代无需额外格式转换。资源类别涵盖bolt、bulk两类异物标注信息完整文件名以meikuang_编号方式呈现便于与原始图片对应适合煤矿输送带异物识别、工业安全监测等方向的研究者与开发者使用为算法调参与模型评估提供规范输入。目前该资源已有1119人学习下载能够帮助使用者省去自行采集、标注和划分数据的时间快速验证算法效果并推进项目落地。1. 煤矿输送带异物识别数据集从现场到模型的最后一块拼图煤矿井下输送带跑偏、撕裂、断带八成事故源头是混进煤流的大块异物——锚杆、托盘、铁丝网、道木。这些异物卡在缓冲托辊或溜槽口轻则划伤皮带重则撕开整条钢丝绳芯输送带一次断带检修就是一个星期起步。用摄像头盯着画面人工巡检井下粉尘大、光照差异物和煤块在黑白监控里几乎分不清。深度学习目标检测能解决这个识别问题但训练它需要一批真正贴近现场的数据。这份煤矿输送带异物识别数据集就是干这个用的它按煤矿输送带场景整理了异物目标的图像与标注类别涵盖金属锚杆、托盘、铁丝、木块、矸石等标注格式对齐主流检测工具拉到 YOLO 或 MMDetection 里就能直接开训。适合两类人一是做煤矿智能化改造的算法工程师拿它验证检测方案二是研究输送带异物检测的课题组成员需要一份现成的基准数据跑实验。2. 数据集结构与标注规范动手前先看清楚的三个细节2.1 类别划分与场景分布别把杂物当成一类就完事拿到数据集第一件事不是解压看图片而是先把类别清单理清楚。煤矿输送带场景的异物检测类别划分直接影响模型的收敛难度和对现场工况的适配度。常见做法的类别是锚杆、托盘、铁丝、木块、矸石、塑料杂物几类。锚杆和铁丝都是细长金属像素上的长宽比接近如果标注框画得太松模型把两者识别错是常见事我在别的项目上踩过这个坑后来不得不回头重标了三百多张图。托盘是扁平金属件经常被煤粉盖住半边只有边缘轮廓露出来光线一暗就几乎隐形。木块和矸石在灰度上和煤块、煤矸石的边缘区分度低尤其是木头被水浸过以后颜色和煤接近误检率比金属类高不少这一点是实训和实验室 U 型数据集最大的区别。我拿到这份数据集后会先按类别统计标注框数量画出各类别实例数的柱状分布。这一步是后续选择损失函数和处理类别不平衡的依据。常见情况是锚杆和矸石类样本偏多塑料杂物偏少差距可能到五倍以上。如果这个分布不做任何处理直接开训模型会把塑料杂物当成背景学掉推理时几乎检不出这类目标这就是后面第 3 章要重点解决的问题。另外要注意标注框的归一化方式。YOLO 格式的标签是 txt 文件每行一个目标内容是class_id x_center y_center width height所有坐标值都是相对图片宽高的比例范围 0 到 1。这份数据集如果已经是这种格式解压出来就能直接喂给训练脚本。如果拿到的是 COCO 格式json 文件先转成 YOLO 格式再训转换脚本会在第 4 章给出完整做法。两种格式混着用是新手最容易犯的错训练脚本读 txt 读到 json 的内容直接报坐标越界排查还特别费时间。2.2 标注质量检查遮挡、截断和小目标盲信数据集的标注质量是大忌。我干过一回把标注全盘接受直接训练的事训练到一半 loss 抖动得厉害排查发现不少标注框只框住了目标的一半——比如锚杆插入煤堆只露出 40%标注框却按完整锚杆长度画导致模型被迫去拟合一个不存在的边界。检查数据集时重点看三类情况。第一是遮挡目标。输送带上的异物经常是半埋在煤流之中标注规范应该是只框可见部分不脑补完整轮廓。第二是密集目标。铁丝网散落时是几十个相互靠近的小目标标注框之间互相重合太多评估 mAP 时正样本的置信度被 NMS 抑制模型能力被系统性低估。第三是极小目标。锚杆尾部在远距离监控下可能只有十几个像素宽这类样本的数量和标注精度决定了模型对远处异物的召回率也是后面部署阶段最容易翻车的点。检查方法不复杂把每个类别按标注框面积排序挑出面积最小的那批样本逐个看图确认。另一个更高效的办法是可视化标注框——YOLO 格式的标签用 OpenCV 画框到原图上一页拼 36 张图快速扫一遍框画歪的、类别标反的、重复框同一个目标的一眼就能抓出来。下面这段脚本就是把标注框批量画回原图的输出到独立目录不污染原数据集。import cv2 import os label_dir labels image_dir images output_dir check_vis os.makedirs(output_dir, exist_okTrue) # 按数据集的类别顺序填写训练时保持一致 class_names {0: anchor, 1: tray, 2: iron_wire, 3: wood, 4: gangue, 5: plastic} for img_name in os.listdir(image_dir): base os.path.splitext(img_name)[0] txt_path os.path.join(label_dir, base .txt) img_path os.path.join(image_dir, img_name) if not os.path.exists(txt_path): continue img cv2.imread(img_path) h, w img.shape[:2] with open(txt_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() cls_id, xc, yc, bw, bh map(float, parts) x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, class_names.get(int(cls_id), ?), (x1, max(0, y1 - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) cv2.imwrite(os.path.join(output_dir, img_name), img)这段脚本把 YOLO 格式标签按类别名和边框画回原图批量输出到 check_vis 目录。参数上xc, yc, bw, bh是从 txt 读出的归一化中心点和宽高乘上图像的w, h才还原成像素坐标不做这步画出的框会全部堆在左上角好几回有人拿这个来问我是不是脚本写错了其实只是忘记换算。class_names字典必须和训练配置的类别顺序一致一旦顺序错位可视化时类别名对不上标注框排查会被误导到错误方向。2.3 数据划分按序列去重再切分数据集默认划分可能不适合你的任务。常见划分是训练集、验证集、测试集按 8:1:1 切但煤矿场景有个特殊情况——同一段输送带在不同时段的图像高度相似同样的皮带纹理、同样的托辊位置、同样的光照角度。如果切分时不做序列去重相邻帧会同时出现在训练集和测试集里评估结果会虚高部署后新场景下 mAP 断崖式下跌还以为模型过拟合了其实核心就是数据泄露。我一般会在切分前按图像文件名或采集时间排序先按连续序列分组再把整组序列随机分配到训练、验证、测试三个集合确保测试集里的图像和训练集不来自同一段连续录像。这样评估出的 mAP 才反映模型在新场景下的真实表现。如果这份数据集的目录已经按序列组织直接用脚本按序列目录划分就行不要打散单个文件后随机分。分组脚本参数里要固定随机种子方便复现同一套划分否则每次跑训练验证集都不一样对比实验失去意义。3. 煤矿场景下的数据预处理与增强策略3.1 暗光、粉尘与反光三个退化单独处理井下输送带监控有三个典型的图像问题光照不均匀头顶一盏灯画面边缘压暗、粉尘造成的整体对比度低、煤水混合物造成的反光干扰。直接用通用增强手段随机翻转、随机 HSV 扰动效果有限要针对这三个退化条件做定制增强。我常用两张牌。第一是 CLAHE限制对比度自适应直方图均衡它把图像分成若干小块分别做直方图均衡不会像全局均衡那样把煤块的纹理细节洗掉。训练时以 30% 概率对图像做 CLAHE模型就见过从暗光变清晰的样本推理时对暗光画面的鲁棒性会好不少。第二是模拟粉尘噪声——随机往图像上叠加低灰度的高斯噪点模拟粉尘遮挡。这个增强不要做过头粉尘占比超过 15% 会让模型把模糊区域当背景学掉反而损害对部分遮挡异物的检测能力。import cv2 import numpy as np def clahe_augment(img, clip_limit2.0, grid_size8): # 转LAB色彩空间只对亮度通道做CLAHE避免色偏 lab cv2.cvtColor(img, cv2.COLOR_BGR2LAB) l, a, b cv2.split(lab) clahe cv2.createCLAHE(clipLimitclip_limit, tileGridSize(grid_size, grid_size)) l_new clahe.apply(l) lab_new cv2.merge((l_new, a, b)) return cv2.cvtColor(lab_new, cv2.COLOR_LAB2BGR) def dust_augment(img, intensity0.1): # 随机选约10%像素叠加高斯噪声模拟粉尘遮挡 mask np.random.rand(*img.shape[:2])[:, :, None] intensity noise np.random.normal(0, 15, img.shape).astype(np.float32) img_aug img.astype(np.float32) mask * noise return np.clip(img_aug, 0, 255).astype(np.uint8)clip_limit控制对比度拉伸幅度太大会把噪声一起放大煤矿图片一般取 1.5–2.5 之间。intensity是粉尘遮挡面比例0.1 表示最多约 10% 像素被随机噪声污染这个量级下模型能学会忽略粉尘干扰高于 0.2 会把目标的边缘轮廓彻底破坏。这两个函数要在数据加载器里按概率调用而不是离线把所有图片都处理一遍——在线增强变相扩充了数据多样性离线处理只会让模型反复看同一批增强后的图等于没增强。3.2 Mosaic 增强什么时候开什么时候关YOLO 训练默认开 Mosaic 增强把四张图拼成一张好处是丰富上下文和平衡小目标密度。但煤矿输送带场景有个副作用Mosaic 会把不同光照条件下的目标拼到同一张图里导致模型倾向于学习上下文无关的特征而煤矿场景原本可以靠皮带纹理和托辊位置辅助判别异物。这个矛盾得靠训练节奏解决。我的做法是训练前 60% 的 epoch 开 Mosaic后 40% 关掉只用基础增强。这样模型的早期阶段靠 Mosaic 见到更多样化的目标形态后期切换到接近真实场景的单图分布让框回归和置信度预测更贴合实际画面。YOLOv8 里这个开关在训练参数里配置写成mosaic0.6表示前 60% 的 epoch 启用后面自动关闭这种方式比全程开启的稳定收敛效果好一些。增强策略前 60% epochs后 40% epochsMosaic开启四图拼接关闭单图CLAHE30% 概率30% 概率粉尘噪声20% 概率20% 概率随机翻转50% 概率50% 概率这张表是训练配置里增强部分的常见起点。Mosaic 只在前期开后期关掉让模型适应真实单图分布CLAHE 和粉尘噪声全程保留它们是针对井下画面退化的核心增强和 Mosaic 不同不会破坏上下文标准。这样组合下来模型既见过拼接图的多样性又不会被拼接上下文带偏。3.3 类别不均衡重采样与损失加权怎么配合第 2 章说的类别不均衡问题两个解法配合用。第一是样本重采样——对样本少的类别在每次 epoch 里多采样几遍最简单的做法是给 Dataloader 设采样权重少样本类的图像被重复抽到的概率更高。第二是损失函数加权——在 YOLO 的分类损失里按类别逆频率加权常见做法是把分类损失的类别权重按频率倒数设置。这两个方案要选一个为主线。重采样改动数据流对模型结构透明适合样本不均衡跨度过大的情况。损失加权更平滑但需要调权重系数调不好会出现尾部类别检一堆假目标。我一般在初始阶段用重采样把各类别样本比例拉到 1:3 以内再用轻量的损失加权做微调不把权重顶到 1:10 以上那样会矫枉过正。以 YOLOv8 为例重采样在训练脚本层面做——用 PyTorch 的WeightedRandomSampler替换普通采样器类别权重取样本数的倒数再归一化。损失加权则写在数据集 yaml 的类别权重字段附近官方默认值 1.0对稀缺类别调到 1.2–1.5 就够太高会让模型对稀缺类别异常敏感误检率升得快。这个调参过程没有捷径每调一档就跑一轮验证集看漏检和误检的变化趋势。4. 用 YOLO 训练异物检测模型从数据转换到出权重的完整流程4.1 环境准备与数据格式转换训练环境通常是一张 8G 显存以上的显卡。YOLOv8 的 pip 安装注意 Python 版本 3.8 以上建议把 numpy 固定到稳定版本避免和 torch 编译版本冲突。这个组合卡版本的问题在 Linux 服务器上尤其常见numpy 版本太新会触发 torch 的 ABI 告警。pip install ultralytics torch torchvision如果数据集是 COCO 格式先转成 YOLO 格式再训。转换脚本读取 json 标注文件把每个目标的多边形盒转成矩形框再换算成归一化坐标写入 txt。核心逻辑是遍历annotations数组用bbox字段的[x, y, w, h]左上角坐标加宽高转成 YOLO 的(cx, cy, w, h)格式。import json import os from PIL import Image def coco_to_yolo(coco_json, img_root, label_root): with open(coco_json, r) as f: data json.load(f) img_info {img[id]: img for img in data[images]} annos {} for ann in data[annotations]: img_id ann[image_id] annos.setdefault(img_id, []).append(ann) for img_id, img in img_info.items(): img_path os.path.join(img_root, img[file_name]) try: w_px, h_px Image.open(img_path).size except FileNotFoundError: continue base os.path.splitext(img[file_name])[0] with open(os.path.join(label_root, base .txt), w) as f: for ann in annos.get(img_id, []): x, y, w, h ann[bbox] # COCO左上角坐标 xc (x w / 2) / w_px yc (y h / 2) / h_px w_n w / w_px h_n h / h_px cat_id ann[category_id] # 类别ID要重映射到0开始的连续整数 f.write(f{cat_id - 1} {xc:.6f} {yc:.6f} {w_n:.6f} {h_n:.6f}\n)coco_to_yolo 函数遍历每张图的标注把像素坐标换算成归一化坐标。w_px, h_px是原图宽高必须从实际图像读取不能从 json 里的width/height字段直接拿否则图像被预处理缩放过的版本会导致坐标整体偏移训练时 loss 降不下去还查不出原因。cat_id - 1是常见的类别重映射操作COCO 的类别 ID 往往从 1 或 90 开始YOLO 要求从 0 连续递增。4.2 数据目录与训练参数配置数据目录结构按 YOLO 项目的惯例组织。images 和 labels 分 train/val 两个子目录YOLO 会把 txt 标签自动匹配到同名的图像文件。目录结构对了训练脚本几乎不用改就能跑起来。datasets/ ├── images/ │ ├── train/*.jpg │ └── val/*.jpg ├── labels/ │ ├── train/*.txt │ └── val/*.txt └── data.yamldata.yaml 是数据配置中心YOLO 读取它构建输出层类别数量和名称必须和标签里的类别 ID 一一对应写错了训练直接报维度错误# 数据集的类别数量与名称顺序与标签文件中的id一一对应 path: ./datasets train: images/train val: images/val nc: 6 names: 0: anchor 1: tray 2: iron_wire 3: wood 4: gangue 5: plastic异物检测对相对误差容忍度不高锚杆和铁丝在画面上长度为 20–100 像素选模型时优先考虑中大型网络。我用 YOLOv8m 起步输入尺寸 640anchor-free 设计对细长目标友好。如果部署到边缘盒子再降到 YOLOv8n 或 s同时把 imgsz 降到 448–512 换推理帧率。模型尺寸的选择要在训练前想清楚不然训完发现部署端跑不动又要重头训一遍。训练命令写成 shell 脚本方便跑时长实验yolo detect train \ modelyolov8m.pt \ datadata.yaml \ epochs200 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.1 \ mosaic0.6 \ patience30 \ project./runs/train \ nameconveyor_foreignlr0初始学习率 0.01lrf为最终学习率相对初始的倍数 0.1mosaic0.6对应 3.2 节说的分阶段 Mosaicpatience30指验证集 mAP 连续 30 个 epoch 不上升就提前停机。batch 大小按显存调16G 显存跑 640 输入的 YOLOv8m 一般能开 16 左右显存不足时用batch8 nbs64模拟大 batch 训练——nbs是名义 batch size梯度累积到指定步数再更新参数效果接近大 batch 但显存占用小得多。4.3 训练过程监控与中断恢复训练最怕跑到一半发现 loss 曲线异常的过拟合——mAP 曲线先升后暴跌。我一般每 20 个 epoch 手动看一眼训练目录下的 results.csv重点看 val/box_loss 和 val/cls_loss 是否和训练 loss 保持同步下降。如果训练 loss 降但验证 loss 反弹超过 10%通常是过拟合或数据泄露回查 2.3 节的序列去重是否做干净。中断恢复是另一件容易被忽略的事。YOLO 训练脚本默认从runs/train/conveyor_foreign/weights/last.pt继续训练只要把命令里的model改成这个路径就能接着跑训练日志和曲线会追加而不是覆盖。如果中断发生在 epoch 100 以上恢复后建议把 lr 调小一个数量级避免学习率跳变导致 loss 震荡。yolo detect train \ modelruns/train/conveyor_foreign/weights/last.pt \ datadata.yaml \ epochs200 \ imgsz640 \ batch16 \ lr00.001 \ resumeTrueresumeTrue会从 checkpoint 读取 epoch、优化器状态和学习率调度位置保证断点续训时学习率曲线连续。注意续训命令里不要再写mosaic等增强参数以 checkpoint 保存的配置为准否则增强策略在续训点突变模型表现会突然掉一截。这一点我吃过亏续训完 mAP 掉了三个点排查半天才发现是增强配置覆盖了原设定。5. 避坑指南异物检测训练的几个真实翻车现场5.1 标注框只框住了目标的一半现象训练完的模型在验证集上对锚杆类别的 recall 高但 precision 极低输出一堆覆盖半截皮带或半块煤的假框置信度还不低。原因训练集里锚杆插入煤堆的图片标注框按完整锚杆画实际可见的只有露出的半截。模型学到的是那个位置有一个长条形物体而不是掉在皮带上的完整锚杆推理时看到煤堆边缘的细长纹理就误报。解决把这类遮挡目标的标注收回到可见区域只标露出的部分。手工修几十张最典型的遮挡图或在数据增强阶段加随机裁剪——把目标从中间切掉一部分再训练强迫模型把遮挡本身当成正常外观样本。改完标签重新训练precision 和 recall 都会回到正常区间。5.2 小目标异物几乎检不到现象训练完成后一米内的大块矸石能检出但画面远端 30–40 像素高的锚杆尾部全部漏检验证集小目标类别 recall 不到 30%。原因两个因素叠加。第一是原数据集里小目标占比本来就不高训练时小目标样本被大目标淹没梯度贡献被稀释第二是 imgsz640 时30 像素的目标在输入图上只占 5% 左右的区域特征图最深层的语义信息把它滤掉了。解决分两步。一是输入分辨率提到 960 或 1280小目标像素占比翻倍召回率明显回升代价是显存和推理耗时上涨按部署硬件取舍。二是开 P2 检测头YOLOv8 的p2True参数在更浅特征层上多出一路检测头专门捕小目标配合小目标样本 2–3 倍重采样能把 30 像素级别目标的 recall 拉高 10 个点左右。5.3 训练 loss 正常推理时大量误检托辊和管道现象训练 mAP 不低但在新的输送带视频上模型把托辊支架、管道法兰盘、甚至皮带边缘的磨损纹理都报成锚杆或铁丝。原因训练集里金属类异物多出现在皮带上方的背景模型无意中把皮带上方区域有细长边缘当成了判别依据。深层语义特征学到了场景结构而不是目标本身的形状。这属于典型的背景泄露训练集和测试集的场景结构太一致导致的。解决加负样本最快。收集一批没有异物的输送带空皮带图像标注文件写成全空混到训练集里让模型看到干净的皮带。加到总样本量的 15–25%就能把误检显著压下去。另外保持测试视频机位与训练集一致更换摄像头角度后做一次盲样本回测误检率会随角度变化。5.4 验证集 mAP 虚高部署后断崖式下跌现象训练结束时的 mAP 看着很不错0.85 以上把一周后新录的输送带视频放了进去mAP 直接跌到 0.5 以下误检率翻倍。原因数据泄露和场景漂移同时发生。数据泄露是 2.3 节说的相邻帧串集——训练集和验证集混入了同一段录像的相邻帧评估虚高。场景漂移是新视频里机位、曝光、皮带速度都变了模型没见过这些条件。解决先把验证集重新按序列划分确保验证集与训练集完全无序列重叠。再在训练时随机变换机位、曝光、阴影等场景变量让模型见过更多变化。如果新场景差异确实太大把新场景的几十帧图像增量训练进去再重新评估别指望一个模型吃遍所有场景。6. 从 mAP 到现场可用评估指标与推理部署技巧评估一套异物检测模型单看 mAP 不全够。我会在训练完成后再跑一段标注过的盲测视频把模型在每帧上的漏检和误检按类别统计出来。mAP 是聚合指标它把 recall 和 precision 揉成一个数两个模型的 mAP 相同但行为可能差很多——一个漏检多误检少一个漏检少误检多在煤矿场景里这两种模型的可用性完全不是一个量级。可视化推理阶段有个实用技巧把 conf 阈值从默认 0.25 往上调。井下现场如果误检会造成不必要的停机检查把 conf 提到 0.45–0.5 能压掉大半误检代价是漏检率轻微上升。煤矿这种场景漏检一块矸石的破坏力比误检大得多所以我通常对着真实场景视频调一圈找一个漏检为零而误检可控的点而不是机械盯着验证集 mAP 最优值。部署阶段另一个容易踩的坑在推理帧率。井下边缘盒子往往是低功耗设备一张 Jetson Xavier 或海思方案只有 10–20 FPS。这时候要么降 imgsz 到 448要么换 YOLOv8s 并启用 TensorRT 的 FP16 量化能把推理帧率拉到 25–30 FPS。转换命令一般是yolo export modelbest.pt formatengine导出时注意架构匹配在 Xavier 上导出后换到另一块卡上会报不兼容得重新导出一次。最后说一个我自己的习惯每次拿到新的输送带场景数据我都会先跑一遍旧模型盲测把误检帧截下来再挑 50–100 帧进训练集做增量训练。做过三轮之后模型在新场景的误检率基本能降一半。从那以后我每次部署异物检测系统都强制走一遍盲测 → 误检采集 → 增量训练的循环而不是训完一个模型就万事大吉。这个流程配合这份数据集能让你在煤矿输送带异物识别这个任务上少走很多弯路希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。