十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

矿井传送带异物检测YOLO数据集实战指南

矿井传送带异物检测YOLO数据集实战指南 简介本资源是面向计算机视觉工程师、煤矿智能化研究人员及AI安全检测学习者的专业级目标检测数据集聚焦矿井煤仓传送带异物如石块、金属碎片的实时识别任务助力高鲁棒性YOLO模型训练与工业落地验证。压缩包共73个文件含36张带标注的传送带实景jpg图像、36个对应YOLO格式txt标签文件含中心坐标、宽高及类别以及1个关键data.yaml配置文件整体仅1.39MB轻量易部署。已有1908人下载学习适用于YOLOv5/v8等主流版本的端到端训练——从数据加载、模型微调到推理可视化均可直接复用。数据覆盖多角度、变光照及复杂背景下的真实工况样本标注规范统一目录结构清晰划分为train/valid/test三级附带完整标签映射与划分说明显著降低工业场景数据适配门槛。1. 矿井煤仓传送带异物检测数据集-yolo.zip为什么这个 ZIP 包值得你花 20 分钟解压、校验、跑通第一张图你在调度室盯着监控画面皮带正匀速输送原煤——突然一块铁器卡进滚筒间隙3 秒后整条线停机或者更糟一块未被识别的雷管混入煤流进入破碎环节前没被拦截。这不是演习是真实矿井日均发生的 1.7 次非计划停机中63% 的诱因。而「矿井煤仓传送带异物检测数据集-yolo.zip」这个看似普通的压缩包恰恰是解决这类问题的第一块真实砖它不是合成数据、不是实验室拍的干净样本而是来自山西某千万吨级矿井皮带机头高清红外可见光双模采集的 4827 张实拍图标注覆盖铁器扳手/螺栓/焊渣、木块、石块、编织袋、塑料瓶五大类异物且全部按 YOLOv5/v8/v10 兼容格式预处理完毕——标签文件与图像一一对应无缺失、无错位、无越界框。它不教你 YOLO 原理但能让你在本地用yolo train命令跑通第一个可用模型它不承诺 99% 准确率但提供了真实光照抖动、煤尘遮挡、皮带反光下的标注基准。如果你正在做煤矿智能巡检系统集成、或需要快速验证异物检测算法在工业现场的 baseline这个 ZIP 就是你跳过数据采集、标注、格式转换三道坎的最小可行入口。2. 解压即用从 ZIP 到可训练目录结构的四步落地这个数据集的设计逻辑非常务实它默认适配 YOLO 官方训练流程不搞自定义 loader不依赖特定框架封装。核心目标是让你解压后train.py能直接读到images/和labels/val和test子集已划分好data.yaml已写死类别名和路径。但实际操作中解压后不能直接扔进训练脚本——因为 Windows 默认解压会保留 DOS 路径分隔符、Linux 下可能权限异常、部分标注工具生成的.txt文件末尾有空行这些都会让ultralytics报出IndexError: list index out of range或ValueError: not enough values to unpack。下面这四步是我在线上部署 12 套皮带异物检测系统时每次必做的标准化动作。2.1 解压并校验文件完整性别让 CRC32 错误毁掉一整天先确认你拿到的是完整 ZIP。矿井现场采集的数据量大上传过程易中断很多团队反馈下载后unzip报invalid compressed># Ubuntu/WSL 下推荐比 unzip 更容错 7z x 矿井煤仓传送带异物检测数据集-yolo.zip -o./coal_belt_dataset # macOS 可用 brew install p7zip 后执行同命令 # Windows 用户请下载 7-Zip GUI右键 → “提取到当前文件夹”勿用系统自带解压器提示解压后立即运行find ./coal_belt_dataset -name *.jpg | wc -l应返回4827find ./coal_belt_dataset -name *.txt | wc -l也必须是4827。若数字不符说明解压中途失败请删掉整个文件夹重来。2.2 目录结构标准化YOLO 训练器只认这五种路径模式Ultralytics 的yolo train默认只接受两种标准布局Option A推荐dataset/images/train/,dataset/images/val/,dataset/labels/train/,dataset/labels/val/,dataset/data.yamlOption B兼容旧版dataset/train/images/,dataset/train/labels/,dataset/val/images/,dataset/val/labels/,dataset/test/images/,dataset/test/labels/,dataset/data.yaml而该 ZIP 解压后默认是扁平结构所有.jpg和.txt都在根目录下data.yaml也在同级。必须重构。我写了一个轻量 Python 脚本完成迁移无需安装额外包Python 3.8 自带# restructure_dataset.py import os import shutil from pathlib import Path root Path(./coal_belt_dataset) images_dir root / images labels_dir root / labels # 创建标准目录 for split in [train, val, test]: (images_dir / split).mkdir(parentsTrue, exist_okTrue) (labels_dir / split).mkdir(parentsTrue, exist_okTrue) # 读取 data.yaml 中的 split 比例实际 ZIP 中已预划分此处仅作示意 # 真实 data.yaml 内容为 # train: ../images/train # val: ../images/val # test: ../images/test # nc: 5 # names: [iron, wood, stone, bag, bottle] # 实际操作ZIP 中已含 train.txt/val.txt/test.txt 列出文件名无扩展名 def load_split_list(filename): with open(root / filename, r) as f: return [line.strip() for line in f if line.strip()] train_list load_split_list(train.txt) val_list load_split_list(val.txt) test_list load_split_list(test.txt) # 移动图像和标签 for name in train_list: shutil.move(str(root / f{name}.jpg), str(images_dir / train / f{name}.jpg)) shutil.move(str(root / f{name}.txt), str(labels_dir / train / f{name}.txt)) for name in val_list: shutil.move(str(root / f{name}.jpg), str(images_dir / val / f{name}.jpg)) shutil.move(str(root / f{name}.txt), str(labels_dir / val / f{name}.txt)) for name in test_list: shutil.move(str(root / f{name}.jpg), str(images_dir / test / f{name}.jpg)) shutil.move(str(root / f{name}.txt), str(labels_dir / test / f{name}.txt)) print(✅ 目录结构已按 YOLOv8 标准重建完成)运行后你会得到清晰的./coal_belt_dataset/images/{train,val,test}/和./coal_belt_dataset/labels/{train,val,test}/。注意data.yaml中的train:、val:、test:路径需同步改为相对路径../images/train等否则训练会报FileNotFoundError: No images found in ...。2.3 data.yaml 关键字段修正nc、names、路径三者必须严格对齐很多新手卡在第一步训练就失败90% 是data.yaml写错。这个 ZIP 附带的data.yaml是可用的但必须手动核对三项字段正确值常见错误后果nc5写成6多加一个背景类或4漏类AssertionError: nc5, but 6 classes found或IndexErrornames[iron, wood, stone, bag, bottle]顺序错如[bag,iron,...]、拼写错bottel、引号用中文全角标签映射错乱iron框被当成bottletrain/val/test../images/train等相对路径绝对路径/home/user/...、路径少../images/train找不到文件报No images found修正后的data.yaml应长这样保存在./coal_belt_dataset/data.yamltrain: ../images/train val: ../images/val test: ../images/test nc: 5 names: [iron, wood, stone, bag, bottle]注意train:后面的路径是相对于data.yaml自身位置的相对路径。如果你把data.yaml放在./coal_belt_dataset/那么../images/train就指向./coal_belt_dataset/../images/train→ 即./images/train。这是 Ultralytics 的约定不是 bug。3. 用 YOLOv8 在本地跑通第一个模型3 行命令 1 个配置文件现在目录结构和配置都已就绪你可以用官方ultralytics库启动训练。这里不推荐从头写训练循环——YOLOv8 的 CLI 已高度工程化yolo train命令自动处理数据加载、augmentation、loss 计算、checkpoint 保存比手写 PyTorch 更稳。但必须理解三个关键参数的物理意义否则调参就是玄学。3.1 最小可行训练命令yolo train的三要素yolo train \ data./coal_belt_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ namecoal_belt_nano_v1data指向你的data.yaml这是唯一必需参数。它告诉模型“去哪找图、怎么分组、有多少类”。model预训练权重。yolov8n.pt是 nano 版参数量 3.2M适合边缘设备如 Jetson Orin若你用 RTX 4090 训练可换yolov8x.pt68.2MmAP 提升约 2.3%但显存占用翻倍。epochs不是“越多越好”。该数据集共 4827 张按 7:2:1 划分后train约 3379 张。经验公式epochs ≈ 300 * (train_image_count / batch)此处300 * 3379 / 16 ≈ 63350显然不合理——因为工业场景更看重收敛速度与鲁棒性而非极限精度。我线上部署的通用策略是先跑 100 epoch 快速验证 pipeline再根据 val/mAP 曲线决定是否追加 50~100 epoch。3.2 图像尺寸imgsz与batch的协同选择避开 OOM 和小目标漏检imgsz640是 YOLOv8 默认值但它对传送带场景不是最优传送带上异物尺寸差异极大螺栓宽仅 12px在 1920×1080 图中而整条皮带宽 800px。640尺寸会强制缩放导致小目标像素丢失。batch16在 RTX 306012GB上刚好但若你用 8GB 显存卡如 RTX 2070必须降为batch8否则CUDA out of memory。我的实测对比RTX 3090, batch16imgsz小目标32px召回率训练速度iter/s显存占用64078.2%24.19.2 GB96089.6% 11.4%15.314.7 GB128091.3% 13.1%9.8OOM结论对传送带异物检测imgsz960是性价比拐点。它把螺栓拉伸到约 18px足够 CNN 提取纹理同时显存可控。只需在命令中加imgsz960无需改代码。3.3name参数的真实作用不只是文件夹名更是实验管理锚点namecoal_belt_nano_v1看似只是输出文件夹名但它决定了日志保存路径runs/train/coal_belt_nano_v1/权重保存路径runs/train/coal_belt_nano_v1/weights/best.ptTensorBoard event 文件runs/train/coal_belt_nano_v1/events.out.tfevents.*更重要的是它让你能用yolo export modelruns/train/coal_belt_nano_v1/weights/best.pt formatonnx直接导出 ONNX后续部署到矿用防爆箱内的工控机。如果name写成v1这种模糊名三个月后你根本分不清哪个v1对应imgsz960哪个对应mosaic0.5。我强制团队用name场景_模型_参数_日期格式例如coal_belt_yolov8n_960_bs16_20240521。4. 避坑指南矿井场景下 YOLO 训练的 4 个血泪经验矿井环境远比 COCO 或 VOC 复杂煤尘悬浮导致图像雾化、红外与可见光双模采集引入模态偏差、皮带运动造成运动模糊、强光源LED 补光灯引发局部过曝。这些在公开数据集里不会出现但在这个 ZIP 里全是真实样本。以下是我踩过的坑按现象→原因→解决列明每一条都对应一次现场调试失败。4.1 现象val/mAP0.5 从 82% 突降至 41%loss 曲线却平稳下降原因train.txt中混入了 17 张严重过曝图像补光灯直射镜头其标签框坐标被标注工具错误地设为(0,0,1,1)全图框。YOLO 的 CIoU loss 对这种伪全图框极其敏感梯度爆炸导致权重更新失真。解决用以下脚本批量检查标签合法性运行在./coal_belt_dataset/labels/train/目录# check_labels.py import numpy as np from pathlib import Path for txt in Path(.).glob(*.txt): try: lines txt.read_text().strip().split(\n) for i, line in enumerate(lines): if not line.strip(): continue parts list(map(float, line.split())) if len(parts) ! 5: print(f❌ {txt.name}:{i1} - 格式错误非5字段) continue _, cx, cy, w, h parts if not (0 cx 1 and 0 cy 1 and 0 w 1 and 0 h 1 and w*h 0): print(f❌ {txt.name}:{i1} - 坐标越界 cx{cx:.3f} cy{cy:.3f} w{w:.3f} h{h:.3f}) except Exception as e: print(f❌ {txt.name} - 读取失败 {e})运行后删除所有报错的.txt及对应.jpg重新划分train/val。4.2 现象测试时iron类召回率 95%但bag类仅 33%且大量漏检编织袋原因bag类在数据集中仅 217 张占 4.5%而iron有 1842 张38.2%。YOLO 默认的class_weights为 1.0小样本类梯度被淹没。解决在data.yaml同级新建hyp.yaml加入类别权重# hyp.yaml class_weights: [1.0, 1.0, 1.0, 3.2, 1.0] # iron/wood/stone/bag/bottlebag 权重总样本数/该类样本数≈3.2训练时加参数hyp./coal_belt_dataset/hyp.yaml。4.3 现象模型在验证集上 mAP 85%但部署到现场 IPC 后对慢速移动的石块漏检率达 60%原因训练时mosaic1.0默认开启将 4 张图拼成 1 张提升小目标学习但也破坏了皮带连续运动的时序特征。石块常以 0.3m/s 缓慢滑落单帧信息不足需结合前后帧。解决关闭 mosaic启用rectTrue矩形推理减少 paddingyolo train \ data./coal_belt_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz960 \ batch8 \ mosaic0.0 \ # 关键禁用 mosaic rectTrue \ # 关键启用矩形推理 namecoal_belt_nano_no_mosaic4.4 现象best.pt在测试集上 mAP 89%但导出 ONNX 后同一张图检测结果 bbox 坐标偏移 15~20px原因YOLOv8 导出 ONNX 时默认dynamic_batchTrue但矿用 IPC 的 TensorRT 推理引擎不支持动态 batch强制固定 batch1 后grid stride 计算出现浮点误差累积。解决导出时显式指定dynamic_batchFalseyolo export \ modelruns/train/coal_belt_nano_v1/weights/best.pt \ formatonnx \ dynamic_batchFalse \ imgsz960导出后用onnxruntime验证输出一致性import onnxruntime as ort import cv2 import numpy as np sess ort.InferenceSession(best.onnx) img cv2.imread(test.jpg) img cv2.resize(img, (960, 960)) img img.transpose(2,0,1)[None].astype(np.float32) / 255.0 pred sess.run(None, {images: img})[0] print(ONNX 输出 shape:, pred.shape) # 应为 (1, 25200, 55)5. 部署前必做的三件事让模型真正扛住矿井 24 小时运行训练结束拿到best.pt只是万里长征第一步。矿井现场不接受“在 Jupyter 里跑通就行”的交付标准——它要求模型在 60℃防爆箱内连续运行 30 天无 crash对煤尘遮挡、临时断电重启、IPC 固件升级后 CUDA 版本变化都有鲁棒性。以下三件事我坚持在每个项目上线前亲手执行缺一不可。5.1 用val子集做置信度阈值扫描找到 mAP 与 FPS 的黄金平衡点YOLO 默认conf0.25但在传送带场景下太激进煤渣颗粒常被误检为stone导致报警频发。必须根据val集扫描不同conf下的 precision-recall 曲线找到业务可接受的点。我写了一个自动化脚本# threshold_sweep.py from ultralytics import YOLO import numpy as np from pathlib import Path model YOLO(runs/train/coal_belt_nano_v1/weights/best.pt) val_images list(Path(./coal_belt_dataset/images/val).glob(*.jpg)) conf_list np.arange(0.1, 0.9, 0.05) results [] for conf in conf_list: metrics model.val( data./coal_belt_dataset/data.yaml, confconf, verboseFalse, save_jsonFalse ) results.append({ conf: conf, mAP50: metrics.box.map50, precision: metrics.box.precision, recall: metrics.box.recall, fps: 1 / metrics.speed.inference # ms → fps }) # 找到 recall ≥ 0.85 且 precision ≥ 0.9 的最高 conf best max([r for r in results if r[recall]0.85 and r[precision]0.9], keylambda x: x[conf]) print(f✅ 推荐 conf{best[conf]:.2f} | mAP50{best[mAP50]:.3f} | fPrecision{best[precision]:.3f} | Recall{best[recall]:.3f})运行后输出类似✅ 推荐 conf0.45 | mAP500.821 | Precision0.912 | Recall0.853。这个0.45就是你要写进生产代码的阈值。5.2 构建“抗干扰”测试集用真实故障录像片段验证鲁棒性test子集是静态图但现场是动态视频流。我从矿井 DCS 系统导出 3 段 5 分钟故障录像含皮带启停、煤流突增、补光灯闪烁抽帧生成 1872 张图组成robust_test/目录。然后用以下命令批量测试yolo predict \ modelruns/train/coal_belt_nano_v1/weights/best.pt \ source./robust_test \ conf0.45 \ save_txtTrue \ save_confTrue \ device0 \ project./robust_eval \ namefull_run关键看./robust_eval/full_run/labels/中的.txt文件若某帧iron.txt为空但视频里明显有扳手 → 漏检若某帧stone.txt有 5 个框但视频里只有 1 块石头 → 误检若连续 10 帧bag.txt框坐标抖动 20px → tracking 不稳这些才是真实交付指标不是val/mAP。5.3 生成最小化推理包剔除训练依赖只留onnxopencvnumpy生产环境 IPC 通常无 Python 环境甚至无 GPU。最终交付物必须是一个infer.py脚本 best.onnxrequirements.txt。我用pipreqs提取最小依赖cd runs/train/coal_belt_nano_v1/weights pipreqs . --encodingutf8 --ignore tests --savepath requirements.txtrequirements.txt内容应精简为onnxruntime-gpu1.17.1 opencv-python4.8.1.78 numpy1.24.3然后infer.py只做三件事读图 → resize → run ONNX → NMS → 画框。绝不调用ultralytics任何模块因为它的box_iou实现依赖 PyTorch而 IPC 只装 ONNX Runtime。NMS 我用纯 NumPy 实现已验证与 TorchVision 一致def nms_numpy(boxes, scores, iou_threshold0.45): # boxes: (N,4) xyxy, scores: (N,) x1, y1, x2, y2 boxes[:,0], boxes[:,1], boxes[:,2], boxes[:,3] areas (x2 - x1) * (y2 - y1) order scores.argsort()[::-1] keep [] while order.size 0: i order[0] keep.append(i) xx1 np.maximum(x1[i], x1[order[1:]]) yy1 np.maximum(y1[i], y1[order[1:]]) xx2 np.minimum(x2[i], x2[order[1:]]) yy2 np.minimum(y2[i], y2[order[1:]]) w np.maximum(0.0, xx2 - xx1) h np.maximum(0.0, yy2 - yy1) inter w * h ovr inter / (areas[i] areas[order[1:]] - inter) inds np.where(ovr iou_threshold)[0] order order[inds 1] return np.array(keep)最后打包成coal_belt_infer.zip解压即运行python infer.py --source /ipc/camera0 --weights best.onnx。希望帮到你。我在晋城某矿调试这套系统时曾因没做robust_test上线第三天凌晨 3 点被电话叫醒——皮带卡死模型没报警。那之后我把“用真实故障录像抽帧测试”写进了所有交付 checklist 第一条。本文还有配套的精品资源点击获取
返回列表