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

矿车与人员检测:基于YOLO的轨道数据集训练与避坑指南

发布时间:2026/9/28 16:03:56

资讯中心
01
ARTICLE

矿车与人员检测:基于YOLO的轨道数据集训练与避坑指南

矿车与人员检测:基于YOLO的轨道数据集训练与避坑指南
简介面向矿业智能安全监测和计算机视觉实践这是一份专为YOLO目标检测算法整理的轨道矿车与人员检测数据集适用于训练二分类检测模型区分“Normal”正常矿车运行与“With People”人员共存两类场景。数据集中包含近千张真实矿业轨道环境图像整体共2000个文件包括1045张jpg图片、954个txt标注文件和1个yaml类别配置txt采用YOLO格式边界框标注yaml记录nc:2类别信息及train/valid目录划分压缩包约206.69MB可直接接入YOLO系列模型训练和验证。已有118人学习/下载。借助该数据集开发者可获得贴近生产现场的正负样本和配套标注快速完成数据配准、模型调参与检测效果评估并可用于矿山安全生产中的人员闯入预警、轨道巡检自动化等场景由于类别较少模型可聚焦矿车与人员两类关键目标有助于提升识别精度与工程落地效率。1. 这个数据集在讲什么轨道运输场景下的矿车与人员检测做矿山井下轨道运输安全监控的人大概率都撞见过同一个问题市面上公开的目标检测数据集里车辆、行人、交通标志一大堆但真要找「轨道上的矿车 轨道沿线人员」这种组合几乎找不到能直接拿来训练 YOLO 的现成数据。MineCarWithPeople-yolo-data-轨道上矿车和人员检测数据集.zip 正是冲着这个缺口来的它将轨道场景中拍摄的矿车与人员图像整理成了 YOLO 训练所需的标注格式解压后可以直接交给 YOLOv5/v8 等主流框架做训练和验证。对于做矿井皮带巷、轨道运输巷安全监测或无人驾驶矿卡项目的人来说用它起步至少能省掉两三周的数据采集和人工标注时间。需要注意的是这个数据集不是万能的它的价值取决于标注质量、场景覆盖和你的部署环境之间有多匹配下面我会按「拆数据、训模型、验结果、排问题」的顺序把它讲透。2. 拆解数据集目录结构、标注格式与类别定义先别急着把 zip 解压完就跑训练命令。拿到任何 YOLO 格式的检测数据集第一步永远是确认它的目录组织、标注文件格式和类别编号这三样直接决定你的 data.yaml 怎么写、训练能否顺利开始。2.1 目录结构与文件组织images、labels 和划分文件常见做法是解压后得到 images 和 labels 两个顶层目录有时还有 train.txt / val.txt 这样的划分文件。这个数据集既然叫「MineCarWithPeople-yolo-data」大概率遵循同样的约定。我一般会先跑一段轻量检查确认每一张图片是否都有对应的标注文件find images -name *.jpg | wc -l find labels -name *.txt | wc -l # 还要检查同名配对情况 for img in $(find images -name *.jpg); do base$(basename $img .jpg) [ -f labels/$base.txt ] || echo missing: $base done逻辑说明第一条命令统计图片数量第二条统计标注数量第三个循环逐张检查同名 txt 是否存在。如果缺失文件超过几十个说明数据集本身不完整训练时会导致该样本被跳过或报错直接影响类别分布统计。参数说明我这里假设图片后缀是 jpg实际可能是 png、bmp。如果图片是 png把循环里的.jpg替换成.png即可。另外YOLO 要求图片与标签文件同名不同后缀如果发现_extra或(1)这种重命名痕迹一定要先人工抽几对确认是否真的对应同一张图。2.2 YOLO 标注格式解读txt 坐标与类别编号YOLO 格式的每个 txt 文件里每行是一个目标格式为class x_center y_center width height所有坐标都是归一化到 01 的浮点数分别表示目标的中心点 x、中心点 y、宽、高且这些值是相对于图片宽度和高度的比例。这个数据集里的类别通常有两个「矿车」和「人员」。我建议解压后先抽看几个文件确认标注框是否合理# 检查一个标注文件的前几行验证坐标范围与类别编号 with open(labels/train/000001.txt, r) as f: for line in f.readlines()[:10]: parts line.strip().split() cls int(parts[0]) x, y, w, h map(float, parts[1:]) print(cls, x, y, w, h, valid, 0 x 1 and 0 y 1 and w 0 and h 0)逻辑说明这段代码逐个字段解析检查中心坐标是否落在 01 区间内宽高是否为正。YOLO 训练前置逻辑里如果读取到越界的坐标会警告或自动截断但如果你在数据预处理时没有兜底越界框会直接污染 loss 计算尤其是 box 回归部分。参数说明类别编号必须从 0 开始连续编号。比如类别 0 是矿车、类别 1 是人员data.yaml 里的 names 顺序必须和 txt 里的编号严格对应。如果数据集里出现了类别 2 或者编号空缺训练时会把某个类别映射错导致模型把矿车当人员、把人员当背景。2.3 类别定义与锚定框anchor适配分析这个数据集的特殊之处在于目标尺寸差异非常极端。矿车通常是一个宽扁的长条矩阵在画面里可能占几百像素宽人员则可能是窄高的柱状远处甚至只有十几个像素。这种「极宽 极窄」的几何特征会让默认 anchor 吃不少亏。YOLOv5/v7 默认的 anchor 基于 COCO 数据集统计生成COCO 里的物体以车辆、行人、小狗为主宽高比相对温和。直接拿默认 anchor 训练矿山轨道数据小目标人员那一支的召回率会明显偏低。我建议训练前先统计一下数据集中所有标注框的宽高比分布import os widths, heights [], [] for lbl in os.listdir(labels/train): with open(flabels/train/{lbl}, r) as f: for line in f: _, x, y, w, h map(float, line.split()) widths.append(w) heights.append(h) import numpy as np print(mean w/h:, np.mean(widths) / np.mean(heights)) print(max w/h:, max(w / h for w, h in zip(widths, heights) if h 0))逻辑说明统计 w/h 比值如果大量样本超过 10:1说明默认 anchor 确实不匹配。YOLOv8 和 YOLOv5 的差别在于v5 完全依赖 anchorv8 是 anchor-free 结构对宽高比极端目标更友好。所以我的建议是如果这个数据集标注质量不错但你用的是 v5先跑 k-means 重算 anchor如果直接上 v8/yolo11这一步可以跳过但要调小目标头P3 层的通道数或加深该分支权重。3. 用这个数据集训练 YOLO从数据划分到训练命令数据拆解完成后下一步就是把它变成可训练的工程。这一阶段的核心不是「敲命令」而是「让数据加载链路和模型假设匹配」。许多翻车现场都发生在数据集路径、类别数和增强参数这三处。3.1 数据划分train/val/test 怎么分避免时间泄漏影像类数据集划分最忌讳的是「同场景图像被拆到 train 和 val」。比如同一台矿车在连续视频帧里出现如果你随机按 8:1:1 划分val 里很可能出现与 train 高度相似的画面mAP 虚高到 0.95部署到新巷道立刻掉到 0.6。正确的做法是优先按拍摄时段、轨道区段或文件来源分组。# 假设 images 下有三个子目录 site1 site2 site3 # 按目录划分site1 site2 做 trainsite2 抽部分做 valsite3 做 test mkdir -p dataset/train dataset/val dataset/test find images/site1 -name *.jpg | xargs -I{} cp {} dataset/train/ find images/site2 -name *.jpg | head -100 | xargs -I{} cp {} dataset/val/ find images/site3 -name *.jpg | xargs -I{} cp {} dataset/test/逻辑说明这段命令按目录隔离数据而不是按文件随机抽样能避免相同场景泄漏到训练与验证集。矿山轨道场景通常是一个固定背景的监控画面模型很容易记住背景纹理如果验证集和训练集同一视角哪怕目标框全部错位mAP 依然好看。参数说明head -100 是从 site2 里挑 100 张做验证集数量根据实际样本量调整一般 val 不少于总样本的 10%。记得 labels 也要同步按同样规则复制或者用符号链接保持同步。3.2 配置 data.yaml路径、类别数、类别名训练 YOLO 需要一个 data.yaml 文件内容是指定图片路径、标注路径和类别信息。写法如下# data.yaml path: /home/user/minecar_with_people train: images/train val: images/val test: images/test nc: 2 names: 0: minecar 1: person逻辑说明path 是数据集的根目录train/val/test 是相对于根目录的子路径。nc 必须与 names 数量一致。这里有一个高频踩坑点YOLOv5 的 data.yaml 接受绝对路径或相对 pathYOLOv8 则会自动拼接 path train如果你把 train 写成完整的绝对路径v8 会拼接出错误的双层路径。参数说明names 的 key 必须从 0 开始连续顺序必须和源数据集的类别编号一致。如果训练时发现 loss 能收敛但预测框全部错乱优先检查这处。另外类别名不要用中文YOLO 框架在部分环境读取中文字符会出现编码问题统一用拼音或英文。3.3 最小训练命令YOLOv8/v5 参数与调参数据集和配置就绪后先跑一个最小化训练确认工具链、数据加载和显存都正常# YOLOv8 最小训练命令 yolo train datadata.yaml modelyolov8s.pt epochs100 imgsz640 batch16逻辑说明yolov8s 是轻量级版本适合首次运行和调通链路。100 个 epoch 是起步量如果你的显卡是 V100 或 3090640 分辨率 16 batch 大约能在两小时内跑完。如果前期数据少这个量级足够看出模型是否在正常学习。参数说明imgsz 建议先用 640后面做部署验证时再试 1280因为轨道上的矿车在远镜头里可能只有几十像素提高到 1280 对小目标召回有明显改善但训练时间和显存都会翻倍。batch 设置成 8 的倍数最好让 GPU 利用率接近 90%。如果显存不足把 batch 降到 8 或者 4同时将 mosaic 增强改成关闭状态以避免大分辨率下拼接内存溢出。3.4 训练过程关键指标box_loss、cls_loss、dfl_loss训练时不能只盯着一个总 loss。YOLOv8 的 loss 由三部分组成box_loss 负责边界框回归精度cls_loss 负责分类正确性dfl_loss 负责框的离散分布建模。做矿车和人员检测时我的观察是box_loss 在 30 个 epoch 后如还不能降到 1.0 以下大概率标注框本身有很多不准的头尾尺寸cls_loss 如果前期震荡优先怀疑背景样本太多或类别不平衡。# 训练完成后直接看结果指标 yolo val modelruns/train/exp/weights/best.pt datadata.yaml逻辑说明训练结束后用 best.pt 跑一次验证框架会输出 Precision、Recall、mAP50、mAP50-95。注意 mAP50-95 是更严厉的指标它要求在 0.5 到 0.95 多个 IOU 阈值下都检测准确。矿山监控这种大目标场景下mAP50 通常能做到 0.9 以上但 mAP50-95 如果低于 0.6说明框还不能和标注框严丝合缝地对齐这在后续做测距或重叠判定时会放大误差。4. 模型评估与验收mAP、混淆矩阵和鲁棒性检查很多人在验证集上看到 mAP 高就很开心直接拿去部署结果现场误报频出。原因在于 mAP 是「静态指标」而轨道运输场景的难点在于动态光照、粉尘和遮挡。评估阶段必须围绕这三类干扰专门建模。4.1 用 val 集跑评估看懂指标背后的意义训练结束以后我建议不要直接看 weight 目录下的 results.png而是自己用脚本在 val 集上跑一次推理并且把检测结果和标注框画在一起人工抽样看几十张。单看数字发现不了「把矿车顶部的安全帽识别成人员」这种错位。# 使用 ultralytics 库做批量预测并保存结果 from ultralytics import YOLO model YOLO(runs/train/exp/weights/best.pt) results model.predict(sourcedataset/images/val, saveTrue, conf0.25)逻辑说明predict 会扫描整个验证目录并把预测框画到原图上保存。这一步的唯一目的是人工检查。我通常会让现场维护同事也看一遍因为有些视觉错误只有熟悉轨道环境的人才能一眼发现。比如矿车头的探照灯会被当作人员而数据处理人员看图片时往往会自动忽略亮点区域。参数说明conf 阈值默认 0.25如果现场误检多可以提到 0.4前提是召回率还要能接受。保存的图片在 runs/predict 目录一张张翻就行。4.2 混淆矩阵看什么矿车误检为人员、人员漏检使用model.val()会生成混淆矩阵图我直接告诉你重点看两个格子真实「人员」被预测成「矿车」的比例以及真实「矿车」被预测成「人员」的比例。在轨道这个场景里人员检成矿车相对少见但矿车检成人员非常常见——因为矿车驾驶室里的坐姿人形、矿车前部的反光轮廓神经网络很容易把它和站立人员混淆。混淆矩阵总合如果不唯一热词里提到这个现象大概率是你的验证集里有些标注框之间重叠度过高或者某个类别样本数过少导致矩阵被个别错误主导。正确处理方法是回看那几张样本确认是标注框画错还是模型推理错。如果是标注框把矿车前部和后面站的人框成一个目标这个样本本身就应该在训练前被修掉。4.3 夜间 / 粉尘场景的鲁棒性检查井下或露天矿山轨道夜间作业时监控画面基本依赖补光而粉尘会让图像对比度急剧下降。你可以在 val 集上手动随机调整亮度、对比度和模糊程度来看 mAP 跌幅。# 模拟夜间与粉尘场景的鲁棒性测试 import cv2, numpy as np img cv2.imread(dataset/images/val/0001.jpg) dark cv2.convertScaleAbs(img, alpha0.5, beta-30) blur cv2.GaussianBlur(img, (5, 5), 1.5) results model.predict(sourcedark, conf0.3)逻辑说明convertScaleAbs 的 alpha 是亮度增益beta 是偏移量GaussianBlur 的核大小和 sigma 模拟粉尘和雾气。如果 mAP 跌幅超过 20%说明模型对光照变化过度敏感。一个便宜的整改方案是在训练阶段增加随机光度失真增强另一个方案是直接对这个数据集重训一幅专门针对夜间图像的候选模型部署时由后台程序判断当前帧的亮度均值再切换模型。5. 训练与标注避坑数据不干净时怎么排查这一章是给你准备后悔药的。所有我经历过的翻车现场几乎都能在数据层面追溯到根因。下面是 5 个高频踩坑记录按「现象 → 原因 → 解决」写。现象 1训练 loss 从一开始就不降甚至前 10 个 epoch 后出现 NaN。原因绝大多数时候是标注文件里出现了负数坐标或者宽高为 0YOLO 在读取时计算 IOU 出现除零。还有可能是类别编号不连续比如一个 txt 里出现了 class 5而 data.yaml 只声明了 2 个类别框架内部索引越界导致梯度异常。解决训练前先跑一遍 2.2 节里的校验脚本把所有 labels 文件里的坐标范围、宽高正值、类别编号范围全部打印出来一旦发现越界直接用 python 脚本修正或删掉该样本。我的习惯是强制print出所有非法文件名而不是只报「文件数不匹配」。现象 2mAP 很高但部署到新场景误检率高得离谱。原因训练数据里存在大量「背景泄漏」。比如矿车的标注框内包含了固定的轨道道钉模型学到了道钉纹理一旦换一条轨道线道钉位置变了模型就会在原来道钉的位置乱报目标。解决先把 val 集的异常预测图拉出来看如果误检部位集中在背景纹理而非目标本体就需要在标注层面把框的内边距缩小让模型更聚焦目标本体。同时建议你用 grad-CAM 或类似工具看模型到底关注了原图的哪个区域确认是不是轨道反光这些无关特征。现象 3人员类别漏检严重尤其是在远处小目标区域。原因这个数据集里矿车和人员的数量大概率不均衡。假设矿车样本 5000 个人员样本只有 800 个模型为了降低总 loss 会优先拟合矿车人员分支的梯度贡献被稀释。解决两条路。第一在训练时把人员类别的 loss 权重调高例如cls1.0改成cls3.0。第二对人员样本做随机裁剪放大把远处的小人员目标扩成中等尺寸。数据增强上可以用 Copy-Paste 方式把人员目标粘贴到矿车附近模拟轨道旁行走的场景比单纯水平翻转有效得多。现象 4训练正常但预测框始终比目标大一圈或者整体往左上偏移。原因很可能是标注框本身画得不精确。如果标注时用的框是「肉眼可见的外包围盒」而矿车真正需要的是「与货斗边缘对齐的紧框」回归目标不一致会导致模型学出一个居中偏大的妥协框。解决没有别的办法只能重标该类别。为了减少工作量可以用当前模型对所有训练集图片做一次预标注然后在标注工具里只调整框边缘。这种「模型预标注 人工微调」的方式对矿车这种轮廓规则目标能节省接近一半时间。现象 5batch 训练到一半崩掉报显存不足或图片尺寸不一致。原因数据集中可能混有不同分辨率的图片YOLO 会自动 resize但如果某些图片长宽比太极端resize 后填充的黑边会导致有效计算区域变化有时还会触发特定版本的 CUDNN 报错。解决训练前统一将所有图片缩放到统一尺寸附近比如短边 640、长边 800或者直接丢弃长宽比大于 3:1 的异常样本。另一种更省事的方法是把 imgsz 改成 1280让填充比例变小但训练时间会增加。正常做法是写一次预处理脚本把异常样本单独挑出来放一边看而不是整体重采样。6. 进阶部署与持续优化技巧跑通训练只是开始真正把模型用起来要解决两个问题如何在边缘设备上跑得快以及如何在巷道场景变化后让模型不失准。对于部署我一般会导出 TensorRT engine。你只需要在 NVIDIA 显卡或 Jetson 板卡上执行yolo export modelbest.pt formatengine halfTrue导出后用engine文件替换原始权重。此时推理速度通常能提升 1.5 到 2 倍。如果显存紧张可以进一步开 INT8 量化但要注意矿车反光区域容易在量化后出现框抖动所以量化后必须在现场帧上重新验证一轮 mAP。如果你用的是国产化边缘盒子没跑过这几家的芯片那就老老实实直接用 ONNX 格式导出再按对方的 API 做输入前处理注意 YOLO 的输入是 RGB 顺序因为 OpenCV 读出来是 BGR这一步错了会让检测结果完全混乱。持续优化方面我的习惯是每周从部署现场抽一段视频让模型跑出所有大于置信度 0.3 的预测框再人工修正成标注逐步累积新样本。增量训练时不要从头重训而是在已有 best.pt 基础上用yolo train ... resumeTrue或直接加载权重继续训练 30 个 epoch。这样模型可以记住老场景也能学会新巷道的纹理而不是把之前学到的权重回退掉。最后说一个我的个人教训第一次拿到这种数据集时我直接跑全量训练结果 mAP 很好看部署后第一天就漏报了三个在道边休息的工人。后来发现是标注文件里的人员框把工人和安全帽框在一起模型认为安全帽顶部是人员边界新场景里工人戴的是不同颜色的帽子漏检就发生了。所以现在无论数据有多大我都要先抽 10% 数据做精细检查再决定要不要训练。希望这份拆解思路能在你的矿车与人员检测项目里少走几步弯路祝顺利。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

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

03
WHY YAOTU

想打造同款高转化官网?

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

◈

场景化定制

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

◐

营销型架构

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

▲

全周期服务

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

免费获取你的建站方案

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