ARTICLE DETAIL

资讯详情

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

火车轨道异物识别数据集与YOLOv5训练实战指南

火车轨道异物识别数据集与YOLOv5训练实战指南 简介深度学习目标检测技术正逐步应用于轨道交通运维场景通过自动识别钢轨上的落石、动物、行人等异物弥补人工巡检在夜间和恶劣天气下的盲区。其核心原理是利用卷积神经网络对监控图像中的目标进行定位与分类而训练效果高度依赖贴近真实场景的标注数据。一套覆盖典型异物类别、格式规范的数据集能显著提升模型在复杂环境下的泛化能力。在实际工程中YOLOv5凭借成熟的生态和完整的部署链路成为轨道异物识别项目的热门选择。结合带标注的轨道场景数据集开发者可以快速完成模型训练与调优实现从数据准备、环境配置到推理部署的全流程落地为铁路安全运维提供可靠的技术支撑。 火车轨道异物识别这几年在轨道交通运维圈子里讨论度越来越高。落石、流浪动物、违规穿行的人、遗留车辆、施工垃圾任何一样出现在钢轨上都可能逼停列车甚至引发事故。传统的人工巡检和轨道电路方案在大雾、夜间、弯道、隧道口这些场景下盲区非常明显。所以很多团队开始用深度学习目标检测做辅助识别而YOLOv5因为生态成熟、部署链路完整几乎成了这个方向的首选。我最近在整理一套火车轨道异物识别数据集原始图片全部带标注可以直接喂给YOLOv5训练覆盖动物、汽车、人、石头、垃圾五类典型异物。这篇文章我会把数据集的内容结构、标注格式、训练配置和踩坑经验一次说清给正在做或者准备做同类项目的朋友一个可参考的实操底稿。1. 火车轨道异物识别到底在解决什么问题1.1 轨道异物的真实威胁与检测难点轨道异物检测不是普通的“监控里有没有东西”的问题它的核心矛盾在于既要识别得快又要识别得准还得扛得住极端环境。异物类别跨度极大动物可能是小体型的野兔也可能是大型牲畜汽车在铁路上通常出现在道口或非法穿越点行人则姿态多变、遮挡严重石头和垃圾的形态背景高度相似很容易漏检。同时铁路摄像头的安装视角五花八门有轨道正前方的有高杆俯视的还有站台边的低角度机位同一个目标在不同视角下差异非常大。这类场景还有几个天然难点。第一是光照剧烈变化白天强逆光、夜间靠补光灯、雨雪雾天图像对比度低第二是高速运动带来的运动模糊尤其是列车运行中拍摄的画面第三是小目标占比高石头和垃圾在远距离时可能只有几十个像素。这些问题决定了你不能拿一个在通用数据集上训练好的模型直接上线必须用贴近轨道场景的数据做针对性训练。这也是为什么一套带标注的轨道异物数据集价值往往比模型结构本身更重要。1.2 为什么说这份数据集能直接解决问题现在网上能下载的通用目标检测数据集很多COCO、VOC、OpenImages都有但直接拿来训练轨道异物识别效果很差。原因很简单COCO里的“人”是生活场景的人不是道口穿越的远景行人COCO里的“车”是轿车和卡车不是铁轨上的工程车辆或违规闯入的汽车。模型学了太多无关上下文迁移到铁轨场景后误检率会非常高。这套数据集的定位就是“场景聚焦”所有图片都来自火车轨道沿线或道口监控视角目标类别明确限定为动物、汽车、人、石头、垃圾五类。标注格式采用YOLOv5原生支持的txt格式每张图片对应一个同名标签文件类别编号从0到4坐标做了归一化处理不需要任何转换脚本就能直接训练。对于团队来说省去了从零采集图片和人工标注的大量时间拿到数据后的工作重心可以完全放在训练调优和部署上。2. 数据集内容拆解从类别到标注细节2.1 五大类别各自的识别难点把异物类别拆开看每一类都有自己特有的问题训练时不能一视同仁。动物体型差异极大小动物目标小、颜色贴近环境大型动物在轨道上又会形成大面积遮挡。野外的动物经常半隐藏在草丛里只有局部轮廓露出来漏检率天然偏高。汽车通常出现在道口、非法穿越点或者线路旁的施工区域。角度多样正对摄像头时还好侧面或斜向时特征变化大。夜间开了车灯的话高光区域还会干扰检测框回归。行人姿态变化大穿深色衣服的人在夜晚几乎和背景融为一体。多人聚集时存在遮挡检测框之间的NMS抑制容易把相邻行人误删。石头这是最难的一类。石头颜色通常和道砟、混凝土基础非常接近纹理也没有明显边缘属于典型的小目标低对比度问题。很多模型在石头上掉点严重。垃圾种类混杂塑料袋、泡沫箱、树枝、布条都有。形态不固定部分垃圾还会被风吹到钢轨中间产生新的遮挡关系。在训练策略上建议针对石头和垃圾这两类适当提高损失权重或者用数据增强把亮度、对比度变化范围加大。否则最终mAP曲线会很好看但单独看这两类的AP大概率拖后腿。2.2 YOLO标注格式与YOLOv5的兼容原理YOLOv5的训练数据不需要XML或JSON它用的是最简单的文本格式。每张图片一个txt文件文件名与图片名完全一致后缀由.jpg换成.txt即可。文件里的每一行代表一个标注框格式是class_id center_x center_y width heightclass_id是整数从0开始对应当前类别的编号center_x、center_y是目标中心点在整张图中的归一化位置width、height是目标框的宽高同样归一化到图片宽高。所有值都是0到1之间的小数与图片实际像素尺寸无关。这个设计的好处是训练时无论输入分辨率怎么缩放标注框始终有效。举个例子如果图片宽1920像素、高1080像素一个人中心点落在(960, 540)人宽200像素、高400像素那这一行就是2 0.5 0.5 0.104166 0.37037计算方式很简单center_x 960/1920 0.5center_y 540/1080 0.5width 200/1920 ≈ 0.104166height 400/1080 ≈ 0.37037。标注工具如LabelImg、X-AnyLabeling在保存为YOLO格式时都会自动完成归一化不需要手算。类别定义顺序一定要和训练时的data.yaml保持一致。比如我约定的顺序是动物0、汽车1、人2、石头3、垃圾4那标签文件里第一列就只能出现0到4。如果标注中途换过工具或者有人手动改过文件最容易出的问题就是类别编号错位模型训练出来的结果会“驴唇不对马嘴”。每次拿到数据集第一件事就是抽查标签里出现了哪些类别编号。2.3 目录结构、数据划分与质量校验拿到数据集后建议先按标准的YOLOv5工程目录来组织避免后面写路径时出问题。我在实操中习惯用下面的结构track_anomaly/ ├── images/ │ ├── train/ │ │ └── 000001.jpg │ ├── val/ │ │ └── 000101.jpg │ └── test/ │ └── 000201.jpg ├── labels/ │ ├── train/ │ │ └── 000001.txt │ ├── val/ │ │ └── 000101.txt │ └── test/ │ └── 000201.txt └── data.yamltrain、val、test按6:2:2左右的比例划分划分时要注意随机打乱避免同一个摄像头点位连续时段拍摄的相似图片全部集中在某一分区。如果相似度过高验证集指标会虚高部署到新点位时又露馅。质量校验是很多人会跳过但绝对不该跳过的环节。常见的问题包括标签文件为空导致图片被忽略、标注框坐标越界xy超出图片范围、归一化坐标恰好为0或1导致边界计算歧义、图片与标签文件名不匹配。我一般会用一段Python脚本做快速检查找出标签文件为空或坐标越界的样本先修正再训练。3. 用这份数据集训练YOLOv5的完整流程3.1 环境准备安装YOLOv5及依赖YOLOv5本身的安装不算复杂但环境问题能让新手卡上一整天。首先克隆官方仓库git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txtrequirements.txt里包含了torch、torchvision、opencv-python、numpy等核心依赖。这里最需要留意的是PyTorch版本与CUDA版本的匹配。如果你的GPU是NVIDIA卡建议先确认驱动支持的CUDA版本再去PyTorch官网选择对应的安装命令。比如CUDA 11.8对应的常见安装命令是pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118如果不确定CUDA环境可以先在Python里跑一下import torch; print(torch.cuda.is_available())输出True说明GPU可用False就要回头检查CUDA、cuDNN和PyTorch版本。国内网络环境下直接pip下载大体积的torch包很容易超时。我一般在pip命令后面加-i https://pypi.tuna.tsinghua.edu.cn/simple或者用阿里的镜像速度提升很明显。还有一点如果只是想在CPU上跑通流程不追求训练速度那torch的CPU版本也够用但训练时间会非常感人不建议拿来做正经训练。3.2 编写data.yaml与启动训练训练前需要写好data.yaml它告诉YOLOv5数据在哪、要分几类、类别叫什么。文件内容如下train: track_anomaly/images/train val: track_anomaly/images/val test: track_anomaly/images/test nc: 5 names: [animal, car, person, stone, garbage]这里的train、val路径是相对于yolov5项目根目录的路径也可以写绝对路径。绝对路径方便但换机器后要改相对路径更灵活建议用相对路径并把数据集放在yolov5同级或内部目录下。nc必须和names长度一致否则训练时会直接报错。启动训练的命令我通常这样写python train.py \ --data track_anomaly.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --name track_anomaly_exp--weights参数建议直接指定yolov5s.pt预训练权重首次运行会自动下载。用预训练权重做迁移学习收敛速度比从零训练快很多最终精度也更高。如果显存有限可以把--weights换成yolov5n.pt模型更小更快如果追求精度则用yolov5m或yolov5l。img size的选择要权衡。轨道场景中小目标多理论上大分辨率有优势但显存占用跟着线性上升。640是YOLOv5的默认平衡点如果你的GPU是24GB显存且小目标漏检严重可以试1280配合--rect参数减少填充带来的无效计算。我这里用640起步跑通流程后再逐步验证更大分辨率的收益。3.3 看指标、调参数训练优化实战训练过程中YOLOv5会在终端打印每个epoch的loss、mAP、precision、recall等指标同时在runs/train/track_anomaly_exp目录下生成results.png这个图记录了训练全程的曲线变化。我判断模型是否正常主要看三点box_loss和obj_loss是否持续下降如果下降后反弹又下降说明学习率偏大或数据里存在较多样本噪声如果两个epoch后基本不下降可能是学习率太小。val精度曲线是否在后期出现震荡微幅震荡正常幅度持续加大就要考虑降低学习率。mAP50和mAP50-95的差距如果mAP50很高但mAP50-95偏低说明模型对目标的定位还不够精确边界框抖动明显可以通过提高分辨率或增加定位损失权重来改善。YOLOv5默认超参已经在COCO上调节得不错轨道场景数据量不算特别大时通常不需要大改。我做得最多的调整只有三个一是把epochs从100加到200让模型在小数据集上有更多轮次拟合二是把batch从16改为8或4配合梯度累积来稳定训练三是用--hyp hyp.scratch-low.yaml切换到较低的数据增强策略避免增强过猛把石头、垃圾这类本就模糊的目标变得更难学。如果训练结束后觉得某些类别精度特别低比如stone的AP只有30%而其他类别有70%最常见的原因是样本不均衡。解决方法是检查标注框数量对样本少的类别做重复采样或复制粘贴增强而不是简单粗暴地调高loss权重。后者容易导致该类的召回上去了精度却掉下来。4. 常见问题与避坑实录4.1 标注和路径相关的坑训练报错中有一类频繁出现但不难解决找不到标签文件。YOLOv5通过图片路径自动推导标签路径它会把/images/替换成/labels/把.jpg替换成.txt。如果你的目录结构和标准不一致比如图片在imgs下、标签在labels下就会报WARNING: Ignoring corrupted image and/or label。排查思路是先检查目录命名是否严格区分images和labels再确认标签文件名和图片名完全一致包括后缀前的编号。另一个隐蔽问题是标签文本里混入了中文字符或空格。有些标注工具导出的YOLO格式会在行尾带上不可见字符训练时不报错但会影响坐标解析。我习惯在处理完数据后用一段脚本把标签文件统一清洗一遍去除空行、去除行首行尾空格、检查每行是否恰好5个数值。这套检查跑完训练时的标签类报错能杀掉大半。标注框坐标越界也值得专门说明。某些标注工具在图片被裁剪后没有同步更新标注会出现框的范围超出图片尺寸的情况。YOLOv5本身对轻微越界有容错但越界太严重会导致训练loss异常或推理时框跑到图像外面。建议写个脚本检测值小于0或大于1的标注行根据实际场景选择截断到边界还是直接删除该框。4.2 显存、收敛与推理结果的排查显存溢出CUDA out of memory是最常见的训练中断原因。我遇到过好几次不是batch设大了而是显存被其他进程占了一部分。解决方法一个是降低batch到8或4另一个是开启--cache参数将数据缓存到内存中减少DataLoader的CPU-GPU交换开销。还有一个容易忽略的点图像尺寸较大且开启了多尺度训练时实际生效的输入尺寸会周期性变大瞬时显存峰值会明显高于固定640的配置。排查显存问题时不要只看log里的batch size。再说说Nan loss。模型输出NaN一般来自学习率过高、梯度爆炸或标注数据异常。如果你用的是预训练权重通常不会随机出现NaN如果出现了先检查标签文件里是否存在无穷大的坐标值再看数据图像是否有全黑或损坏文件。我曾经遇到一批从视频抽帧得到的图片里混了几张全黑的帧对应的标签却是正常框导致obj_loss计算出现异常。把所有图片尺寸统一验证一遍这个坑就能避免。推理阶段输出很多重复框或置信度极低通常是NMS参数的问题。轨道场景目标小且密集默认的NMS阈值0.45有时会保留过多重叠框可以适当调到0.5或0.55如果检测框明显位置不准优先怀疑置信度阈值太低把Conf_thres提升到0.3以上会有改善。4.3 从数据集到真实部署的扩展建议训练好的模型最终要落到实际监控系统里这一步的坑比训练还多。轨道沿线的摄像头实时画面尺寸通常很大直接喂给模型推理会非常慢需要先对输入做缩放或区域裁剪保证每秒处理帧数达标。以YOLOv5s模型在NVIDIA Jetson Orin Nano上的表现为例FP16推理、输入640分辨率时大约能跑到30-40 FPS基本满足实时监控的需求如果用的是普通x86工控机建议先用TensorRT或ONNX Runtime做加速。部署环境的光照和天气变化是模型泛化的最大敌人。训练集如果以白天晴天为主到了夜间或者雨天漏检率会明显上升。针对这个问题可以按时间段或光线条件准备两个模型一个白天、一个夜间在推理前根据时间戳切换或者把原始图像的直方图均衡化版本也输入网络做成多分支输入。前者实现简单效果立竿见影推荐优先尝试。数据集本身也可以持续迭代。我常用的做法是把部署过程中误检和漏检的图片收集起来定期优化标注并重新训练。对于石头和垃圾这类目标还可以用当前模型对大量未标注的历史视频做预标注人工复核后再加入训练集。这样跑上几个版本模型对部署点位的适应性会越来越好从一开始离线训练的“通用能力”逐步变成贴合现场环境的“专用能力”。整套思路走下来你会发现数据集的整理和校验虽然枯燥但它的回报完全值得投入。一次严谨的标注检查和目录规范能省下后面几十次训练排错的时间。对轨道异物识别这个场景来说模型结构反而不是最大的瓶颈真正的决胜点在于数据是否贴近现场、标注是否干净、训练流程是否稳定可控。先把手头这份带标注的数据集用扎实了后面的优化才谈得上有的放矢。本文还有配套的精品资源点击获取
返回列表