基于YOLOv5的轨道异物识别数据集与训练实战解析
2026/8/26 11:24:07 网站建设 项目流程

简介:目标检测是计算机视觉领域的核心任务,其本质是在图像中定位并分类感兴趣的对象。在实际工程中,数据质量往往决定了模型性能的上限,而高质量的标注数据集更是训练可靠模型的前提。YOLOv5作为兼顾检测精度与推理速度的经典算法框架,被广泛应用于工业视觉场景。在铁路轨道安全领域,异物识别需要检测人、动物、汽车、石头、垃圾等多类目标,真实场景数据稀缺且标注成本高。本文以一套适配YOLOv5的轨道异物识别数据集为依托,系统梳理了数据目录结构、TXT标注规范及类别分布特点,并完整演示了环境搭建、训练参数配置、损失与mAP指标解读等实操流程。针对小目标漏检、类别不均衡导致的召回率偏低等典型问题,提供了分辨率提升、数据增强、负样本引入等调优策略,为轨道交通巡检场景的视觉落地提供可复用的工程参考。 做轨道异物识别这块,最头疼的从来不是模型选型,而是数据。前阵子我拿到一套火车轨道场景的异物识别数据集,原始图片带着完整标注,类别覆盖人、动物、汽车、石头、垃圾这几类,格式原生就是给YOLOv5用的,直接省掉了一大半数据清洗和格式转换的功夫。这套数据在实际项目中帮我把落地周期压缩了不少,这篇就围绕这个数据集,从标注规范、训练配置到踩坑排查完整梳理一遍,给准备做类似巡检、监控场景的同行一个参考。

1. 项目概述:轨道异物识别到底在解决什么问题

1.1 核心需求解析:为什么要做轨道异物检测

铁路运行安全里,轨道异物侵限是必须严防的一类隐患。这里说的“异物”范围很广,既有活物,比如牛羊误入、行人翻越、野生动物穿越,也有非生物类的,比如山上滚落的石头、大风刮来的垃圾、违规闯入的机动车。传统方式主要靠人工巡检和司机目视,但铁路线路动辄几十上百公里,很多区段在山区、隧道、无人值守站,纯靠人盯根本盯不过来,而且夜间、雨雾天气下人眼效率会明显下降。

计算机视觉方案就是要用固定摄像头或巡检设备,自动发现轨道上的异常目标并报警。所以这个数据集的类别设计其实是跟着真实风险走的:人、汽车、动物、石头、垃圾,基本覆盖了最常见的几类侵限物。用YOLOv5来做检测,是因为它在精度和速度之间平衡得比较好,既能跑在服务器上做集中分析,也能通过导出ONNX或TensorRT部署到边缘设备,实际项目里非常实用。

1.2 数据集的价值:为什么说数据质量决定模型上限

做目标检测的人都明白一个道理:模型结构决定上限,但数据质量决定你能摸到多高的上限。同一个YOLOv5s,在干净、规范、场景覆盖全面的数据集上训练出来的效果,和在随手扒来的不完整数据上训练出的效果,差距可能是天壤之别。

这套数据集的价值首先在于“真”。轨道场景非常特殊,背景是道砟、钢轨、接触网立柱,和普通道路、园区场景完全不同。如果拿通用COCO数据训练模型,在轨道场景里基本没法用,因为背景差异太大,模型会把钢轨的纹理、扣件的形状都当成干扰。所以一套真实轨道环境拍摄、带精确标注的原始图片,是训练出可落地模型的前提。其次,标注齐全也让工作流顺畅很多,省掉了我自己整理类别、清洗错误标签的时间,可以直接进入训练阶段。

2. 数据集结构与标注规范详解

2.1 数据集构成与目录组织

拿到数据集后,第一件事就是先把目录结构看清楚。这套数据按YOLOv5常见的组织方式来排列,即图片和标注文件分开存放,训练集和验证集分开目录,下面是我实际使用时的目录结构示例:

track_obstacle_dataset/ ├── images/ │ ├── train/ │ │ ├── track_001.jpg │ │ ├── track_002.jpg │ │ └── ... │ └── val/ │ ├── track_101.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── track_001.txt │ │ ├── track_002.txt │ │ └── ... │ └── val/ │ ├── track_101.txt │ └── ... ├── dataset.yaml ├── classes.txt └── README.md

图片都是现场摄像头拍摄的原始帧,没有做过裁剪或过度压缩,分辨率基本在1080P左右,视角是轨道沿线的固定机位,这种画面和真实部署时的输入基本一致。训练集和验证集的划分大约是8:2,划分时已经注意了同一场景的视频帧不会同时出现在两个集合里,避免数据泄漏导致的指标虚高。这一点很关键,如果训练集和验证集来自同一段连续视频,模型相当于见过“答案”,验证时的mAP会很好看,但一上真实场景就露馅。

2.2 标注格式与YOLOv5兼容性分析

标注文件是TXT文本格式,每行对应一个目标,格式是:

class_id x_center y_center width height

这五个值里,class_id是从0开始的整数,对应类别列表中的索引;x_center、y_center、width、height都是相对于图片宽高的归一化坐标。比如一张1920x1080的图片里,一个目标的包围框左上角在(960, 540),宽度是480,高度是270,那么对应的标注就是:

0 0.5 0.5 0.25 0.25

因为坐标做了归一化,所以无论原始图片是1920x1080还是1280x720,标注都能通用,这也是YOLO系列格式的一个优势。YOLOv5训练时默认从images/目录找图片,然后去对应的labels/目录找同名TXT文件,所以强制要求图片文件名和标注文件名的主名完全一致,否则会提示找不到标签。我第一次用这套数据时,发现里面有少量文件名带空格或中划线的情况,先批量替换成下划线才继续训练,这个细节容易忽略,但实际上非常影响流程。

2.3 类别体系与样本均衡问题

类别文件classes.txt里顺序对应标注里的class_id,当前数据集的类别列表是:

0: person 1: animal 2: car 3: stone 4: trash

五类目标的样本数量并不是均衡的。从实际使用来看,人和汽车这类“大目标”标注量明显偏多,石头和垃圾因为个体小、目标不显眼,标注量相对少一些。这个不均衡情况在轨道场景里其实很自然,因为人和车一旦出现就是画面里的大目标,容易识别也容易标注,而石头和垃圾往往散落在道砟之间,有些甚至只有二三十个像素大小,标注难度大,样本天然稀缺。

类别不均衡会带来一个具体问题:训练时模型倾向于学习样本量大的类别,导致石头和垃圾的召回率偏低。处理办法我放在后面“训练调优”部分细说,这里先提醒一点:拿到数据后先跑一个统计脚本,看看每一类的框数量和平均尺寸,做到心里有数,这个步骤能帮你少走很多弯路。

3. YOLOv5训练实操全流程

3.1 环境搭建与依赖安装步骤

训练环境的搭建是老生常谈,但踩坑的人依然不少。我用的环境是Ubuntu 20.04,显卡是RTX 3090,显存24GB,训练YOLOv5s/5m都够用。Python建议用3.8或3.9,太新或太旧都可能遇到依赖兼容问题。

先创建虚拟环境并激活:

conda create -n yolov5 python=3.9 conda activate yolov5

然后克隆YOLOv5仓库:

git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt

PyTorch的安装建议单独处理。如果你有NVIDIA显卡且CUDA环境正常,可以用:

pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118

这个命令会安装CUDA 11.8版本的PyTorch。装完后用python -c "import torch; print(torch.cuda.is_available())"检查一下,输出True就说明GPU可用。如果输出False,排查一下显卡驱动版本和CUDA版本是否匹配。CPU训练不是不行,但YOLOv5在CPU上训练速度太慢,一个epoch就要跑很久,不推荐。

3.2 数据配置:构建dataset.yaml与校验标注

YOLOv5训练前需要写一个数据配置文件dataset.yaml,内容格式如下:

path: ../track_obstacle_dataset train: images/train val: images/val nc: 5 names: 0: person 1: animal 2: car 3: stone 4: trash

格式很简单,需要注意path是数据集的根目录,相对或绝对路径都可以,但建议用绝对路径避免迷路。trainval是相对于path的图片目录路径。nc是类别数量,必须和names里的数量一致。这里有同学会问:验证集路径不写labels目录吗?YOLOv5会自动根据图片目录去对应位置找labels,只要目录结构符合前面那张图就好。

建议训练前先做一次快速校验,我用过一个简单脚本,随机挑几张训练图片,把标注框可视化画出来,确认坐标和类别对应关系没问题:

import cv2 import numpy as np image_path = "track_obstacle_dataset/images/train/track_001.jpg" label_path = "track_obstacle_dataset/labels/train/track_001.txt" img = cv2.imread(image_path) h, w = img.shape[:2] with open(label_path, "r") as f: for line in f.readlines(): cls_id, xc, yc, bw, bh = map(float, line.strip().split()) 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, str(int(cls_id)), (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) cv2.imwrite("check_vis.jpg", img)

跑几张图看看,如果框位置贴合目标,说明标注基本可用。这一步虽然原始,但能提前发现很多格式问题,比直接开训练然后看loss不降要省时间得多。

3.3 训练参数选择与超参数调优思路

数据准备好了,就可以开始训练。基础命令如下:

python train.py \ --data ../track_obstacle_dataset/dataset.yaml \ --weights yolov5s.pt \ --img 640 \ --batch-size 16 \ --epochs 300 \ --cache

几个参数的选择逻辑要解释一下。

--weights是预训练权重。YOLOv5提供s/m/l/x几个规格,s是small,m是medium,l是large。轨道异物检测对实时性有要求,我一般先用yolov5s.pt做基线,跑通流程,然后再用yolov5m.pt试一下精度提升,最终权衡后选择部署方案。直接从头训练不是不行,但收敛慢、效果差,除非你的数据集和COCO差异大到预训练特征完全失效,否则强烈建议加载预训练权重。

--img是训练分辨率。默认640,这是速度和精度的折中。但轨道场景有个特殊情况:石头和垃圾在远处时目标非常小,640分辨率下可能只有十几个像素,模型很难学过。如果显存够大,可以尝试--img 1280,对小目标识别有明显帮助,但训练时间会大幅增加。实际项目中我做了对比,1280输入下mAP确实有提升,但推理耗时也上去了,具体选哪个要根据部署设备的算力来定。

--batch-size受显存限制。24GB显存跑YOLOv5s、640分辨率,batch-size可以开到64,但实际训练时我一般保守一点用32,避免显存打满后训练中断。如果你显存只有8GB,batch-size设16或8都是可以的。

--epochs建议300起步,配合早停机制。YOLOv5默认会在--patience设置的轮数内验证集指标不再提升时自动停止训练,默认是100轮,这个机制能帮你省不少时间,不用死等300轮跑完。

超参数方面,yolov5/data/hyps/hyp.scratch-low.yaml是默认配置。一般不需要大改,如果发现类别不均衡问题比较严重,可以适当调整loss_ota或分类损失的权重分配。但我的建议是:先跑一个默认超参数的基线,再看指标决定要不要动,不要一上来就调参。

3.4 训练过程监控与评估指标解读

训练过程中,YOLOv5会打印每次epoch的loss信息,主要看这三项:

  • box_loss:边界框回归损失,衡量预测框和真实框位置的差异。
  • obj_loss:目标置信度损失,衡量模型判断“这个位置有目标”的准确度。
  • cls_loss:分类损失,衡量目标类别判断的准确度。

正常情况下,这三个loss应该整体呈下降趋势,如果某个loss波动剧烈或者不下降,大概率是数据或参数配置有问题。loss收敛到平稳后,最终会计算验证集上的mAP。

评估指标重点看两个:mAP@0.5mAP@0.5:0.95。mAP@0.5指的是IoU阈值0.5下的平均精度,通常别称“粗指标”,适合快速看模型整体效果;mAP@0.5:0.95是IoU从0.5到0.95取多个阈值算平均,要求严格得多。对这个数据集,我的经验是mAP@0.5能达到0.85以上就算基本可用,mAP@0.5:0.95会比它低不少,不用太焦虑,这是正常现象。

训练完成后会在runs/train/exp目录下生成结果,包括PR曲线、混淆矩阵、验证集预测可视化图。混淆矩阵尤其值得看,能直接反映出哪两个类别之间容易混淆,比如“石头”和“垃圾”外形接近,很容易彼此误判。我拿到结果后会先去翻混淆矩阵,再决定要不要针对性补充数据。

4. 训练过程中的常见问题与排查技巧

4.1 标注格式错误导致训练异常

踩过的最常见坑是标注格式问题,归纳起来有以下几类:

  • class_id越界:标注文件里的类别编号大于类别总数,训练直接报错。
  • 坐标值未归一化:有人直接把像素坐标写进TXT,训练loss直接乱飞。YOLOv5的标签要求0到1之间,如果出现大于1的值就要赶紧排查。
  • 空标签文件:有些图片没有目标,TXT文件是空的。YOLOv5支持空标签,但如果你写脚本处理数据时没注意,可能把空文件误删或改成错误格式。
  • 文件名不匹配:图片是.jpg后缀,标签是.txt后缀,但主名对不上,训练时大量图片被跳过。

排查方式其实很机械:训练前写一个脚本遍历所有labels文件,检查每行的字段数量是否为5、class_id是否在范围内、坐标值是否在合理区间。如果数据量大,这个脚本跑不了几秒,能帮你省下好几个小时的调试时间。

4.2 石头和垃圾这类小目标漏检怎么办

小目标检测在轨道场景里是绕不开的问题。石头、远处的垃圾、蜷缩在轨道中间的动物,在640分辨率下可能只有几十像素,模型很容易漏掉。

我试过几种方法,给一个优先级参考:

  • 提高输入分辨率--img 1280是最直接的改善手段,代价是显存占用和训练时间翻倍。
  • 数据增强:YOLOv5自带的Mosaic增强会随机拼四张图,等于把目标缩小,对小目标学习帮助明显。可以检查配置文件里mosaic参数是否开启,默认是开的。
  • 切图推理(SAHI):推理阶段把大图切成小块分别检测,再合并结果。这个方法效果好,但会明显增加推理时间,适合离线分析场景。
  • 针对性补充数据:如果某类小目标样本本身太少,再怎么调参数也有限,最好是去现场补充采集。

实际项目中我比较推荐“先上1280输入 + 切图推理”的组合,如果实时性不允许,再退回640并用增强数据去扛。

4.3 类别不均衡与误检处理

前面说了石头和垃圾样本少,训练出来的模型容易偏向“人”和“汽车”,导致石头垃圾漏检。处理办法有几个方向:

  • 过采样:在数据加载时对样本量少的类别做重复采样,其实就是在dataset.py里给图片重复赋权,操作起来稍显粗暴但有效。
  • 复制粘贴增强(Copy-Paste):从训练集里把石头、垃圾的目标切下来,随机粘贴到别的背景图上,相当于人工合成新样本。这个对检测类不均衡问题很有用,但要注意别把石头贴在钢轨上,反而造成另一个方向上的误判。
  • 调整类别损失权重:YOLOv5允许在超参数里对类别损失做加权,把稀有类权重调高一点,模型会对它们更敏感。

误检方面,轨道场景最典型的问题是背景干扰:钢轨的反光、道砟的纹理、扣件的不规则形状,容易被模型当成石头或垃圾。我的经验是收集一批“负样本”,也就是没有任何目标的纯轨道背景图,作为训练集的一部分让模型看到更多“没有目标”的样本。YOLOv5对负样本的处理方式就是空标签文件,训练器会正常读取这些图片并学习背景特征,能有效压低误检率。

4.4 从训练到部署的注意事项

模型训练好后,部署是另一个环节。YOLOv5官方提供了导出脚本,把PyTorch权重转换为多种部署格式:

python export.py --weights runs/train/exp/weights/best.pt --include onnx

导出ONNX后可以再接TensorRT做加速,或者直接用OpenCV的DNN模块加载。如果部署目标是边缘盒子,需要注意模型大小和推理速度的平衡。YOLOv5s的ONNX模型大约在30MB左右,边缘设备跑640输入能到几十毫秒一帧,基本满足实时性要求。如果还想更快,可以做INT8量化,但精度会掉一些,轨道安全场景下建议谨慎,最好对量化后的模型重新跑一遍验证集评估,确认没有引入不可接受的风险。

安全提示要放在前面:轨道异物识别系统扮演的是辅助预警角色,不能替代现有行车安全保障措施。任何自动检测系统上线前都应该经过充分的现场验证和安全评估,不能因为模型指标好看就直接依赖它做判断。实际使用时最好配合人工复核机制,确保异常上报的可靠性。

5. 我的实操心得与后续扩展建议

5.1 几个踩坑之后的经验总结

把这套流程完整走下来,我自己的感受是:数据集质量对训练结果的影响大于模型结构的选择。这套轨道异物数据让项目能在短时间内跑到可用的精度水平,原因就在于它场景真实、类别明确、标注规范,几乎不需要预处理就能直接喂给YOLOv5。

给新上手的同行几个建议:

  • 训练前一定做标签可视化和合法性检查,这一步花10分钟,能省10小时。
  • 先跑YOLOv5s基线,不要去调复杂结构,基线稳定后再考虑m/l和输入分辨率上调。
  • 记录每一次实验的配置和指标,包括超参数、数据集版本、训练命令。这个习惯在后期调优时价值巨大,不然你调了一周超参数,最后根本不知道哪个组合是最优的。
  • 不要只盯着mAP,要看具体类别的PR曲线和混淆矩阵,尤其是石头、垃圾这类安全性敏感的目标。

5.2 这个数据集后续还能怎么扩展

轨道异物识别数据集的可扩展性很强。当前版本覆盖了人、动物、汽车、石头、垃圾五类,后续如果收集到新的异物类型,比如施工遗留物、掉落货物、塑料布等,直接扩充分类并补充标注即可。标注格式不变,YOLOv5训练配置只需同步修改ncnames

另一个可以扩展的方向是时序信息利用。当前数据集都是静态图片,但如果录像是连续帧,可以借助相邻帧的运动信息来剔除误检,比如一个“石头”只在某一帧出现、前后帧完全消失,大概率是反光造成的误检。引入轻量级跟踪模块,比如ByteTrack,不仅能提升连续性,还能让报警更可靠。

模型结构方面,YOLOv5本身很成熟,但如果你追求更高精度,可以尝试在这个数据集上跑YOLOv8或YOLOv11,因为它们对anchor-free检测头有更好的优化,但对应的数据格式需要微调。数据标注这套流程是通用的,换模型不需要重标数据,这算是当初选YOLO系格式的最大红利。

实际跑完整个流程,我的体会是:目标检测项目的成败,七成在数据,两成在调参,一成在模型选型。轨道异物识别这种强安全相关场景,对数据真实性和标注质量的要求更高,一套好的数据集就是项目的地基。后续如果手头有新的场景数据,我还会按同样的思路做扩展,把这套流程沉淀成可复用的标准化方案。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询