YOLOv5铁路异物检测实战:从数据准备到边缘部署的完整指南

发布时间:2026/10/14 12:10:08
YOLOv5铁路异物检测实战:从数据准备到边缘部署的完整指南 简介这是一套基于Yolov5的铁路轨道异物检测项目源码面向目标检测开发者、铁路智能运维研究人员以及希望搭建完整深度学习训练流程的初学者。项目数据来自1861张合成图像覆盖人、障碍物、动物、车辆、摩托车、火车六类轨道异物标注同时提供VOC与YOLO格式方便直接训练与验证。源码压缩包共12个文件以训练、预测等Python脚本为核心配合YAML配置、依赖清单、README说明等辅助文件整体仅16KB结构紧凑便于快速阅读与二次开发。目前已有111人学习内容精炼但流程完整。通过研读代码可以掌握自定义数据集类的创建方法、YOLOv5训练参数配置、模型评估思路以及从数据准备到部署运行的完整步骤对推动铁路运输安全智能化、减少人工巡检压力具有直接参考价值也为其他目标检测场景提供了可复用的工程范式。1. 铁路异物检测的落地现状YOLOv5为什么成了首选方案做铁路异物检测之前我最担心的不是模型效果而是项目能不能真的落地。落石、断枝、误入的人或牲畜每一项漏检都可能酿成事故而监控视频数量庞大纯靠人工盯屏幕根本盯不过来。真正把YOLOv5放进铁路异物检测之后我发现这条路比预想的要顺利部署成本低一台普通工控机能带多路视频流迭代速度快从数据准备到训练出可用模型一周左右。这篇笔记会沿着选型理由、数据准备、训练调参、踩坑记录和边缘部署完整走一遍把可复现的细节和参数都列出来。适合正在做轨道安全监控的开发者也适合刚接触目标检测、想用一个真实场景练手的人。2. YOLOv5检测原理与选型对比铁路场景到底需要什么2.1 单阶段检测的推理逻辑一次前向就同时给出位置和类别YOLOv5把目标检测当成一个回归问题。输入一张640×640的图像经过Backbone提取特征后在3个不同尺度的特征图上生成候选框每个框预测一组属性目标中心坐标、宽高、置信度和类别概率。最后靠非极大值抑制把重叠的框压缩掉留下最可信的检测结果。网络结构上值得关注的是Backbone里的C3模块它借鉴了跨阶段局部网络的思想将特征图分成两个分支一个分支做卷积变换另一个分支保留原特征再把两个分支拼接。这样在增加感受野的同时控制了计算量这也是YOLOv5在嵌入式设备上能跑得动的重要原因。Neck部分采用PANet结构通过自顶向下和自底向上两条路径融合不同尺度的语义信息让大特征图保留足够的位置细节来检测小目标。在铁路异物检测的实际画面里轨道近处的碎石在图像上可能占30×30像素远处钢轨上的树枝可能只有12×12像素。YOLOv5的3个尺度输出头分别对应不同大小的目标小目标由大特征图负责检测这种设计正好匹配铁路监控画面上目标尺度差异大的特点。2.2 和Faster R-CNN、SSD比了一圈为什么最后还是选了YOLOv5我在项目预研阶段分别用Faster R-CNN、SSD和YOLOv5做了一轮对比实验。Faster R-CNN的检测精度确实高两阶段结构对目标的错漏报控制得很好但在CPU推理时单帧耗时普遍超过150毫秒在GPU上也只有20 FPS左右占用资源太多很难跑多路视频流。SSD虽然有速度优势但默认框的尺寸比例是固定的面对铁路场景里长条形的钢轨物件和细小的掉块召回率明显不够。YOLOv5的模型家族从n、s、m、l、x五个尺寸覆盖了从极轻量到高精度的需求区间。铁路异物检测一般用s或m就够了YOLOv5s的权重只有14MB左右单帧推理在边缘设备上可以压到50毫秒以内。它还有两个让我决定使用的工程化理由一是源码自带Mosaic、MixUp等数据增强策略不用自己写二是训练、验证、导出、推理链路全部打通从标注数据到部署不需要跨多个框架。2.3 铁路异物数据的特点背景高度重复目标边界模糊铁路监控和通用目标检测的最大区别在背景。轨道、道砟、接触网这些元素在每一帧里高度相似模型很容易把“背景纹理”当成特征来记忆一旦光照或天气变化检测性能就会剧烈下降。因此训练数据必须覆盖不同时段和天气而不是简单地堆积相同场景的图片。还有一个容易被忽略的点是类别定义。项目组一开始把异物分成落石、树枝、施工工具、动物、行人五类训完之后发现落石和施工工具经常互相误判原因是两者在远距离下轮廓相似。后面我们把类别收敛成人员、车辆、硬质异物、软质异物四类把语义相近的目标合并整体精确率和召回率明显回升。这段经验让我养成一个习惯先定类别边界再开始标注别急着堆框。3. 训练环境与数据集准备从零到能开训的完整配置3.1 环境版本怎么搭少折腾一周的安装组合YOLOv5的官方代码库依赖不复杂但版本组合不对就会出现各种诡异错误。我实测下来最省心的组合是Python 3.9、PyTorch 1.13.1cu116、CUDA 11.6、NVIDIA驱动460以上。这个组合和官方requirements.txt里的依赖兼容性最好。创建环境的命令如下conda create -n yolo5env python3.9 conda activate yolo5env pip install torch1.13.1cu116 torchvision0.14.1cu116 --index-url https://download.pytorch.org/whl/cu116 git clone https://github.com/ultralytics/yolov5.git pip install -r yolov5/requirements.txt说明一下这里锁死PyTorch版本是为了避免libtorch与CUDA版本不匹配导致GIL锁死或显存分配失败。requirements.txt会安装opencv-python、numpy、matplotlib、pandas等库如果网络不好可以把pip源换成国内镜像站加快安装速度。环境装好后先用官方示例做一次冒烟测试确认检测流程本身没问题再替换成自己的数据集。cd yolov5 python detect.py --weights yolov5s.pt --source data/images/bus.jpg如果能在输出目录生成带检测框的结果图说明环境没问题接下来就可以放心折腾自己的数据了。3.2 VOC标注转YOLO格式一个可以直接套用的转换脚本铁路异物数据集的标注常见做法是先使用LabelImg或CVAT标注导出成VOC格式的XML文件再转成YOLOv5训练需要的TXT格式。YOLO格式的一行是类别索引、归一化中心x坐标、归一化中心y坐标、归一化宽度、归一化高度。下面是我在项目里用过的转换脚本功能是把VOC XML批量转成YOLO TXTimport os import xml.etree.ElementTree as ET def voc_to_yolo(annotation_dir, output_dir, class_map): os.makedirs(output_dir, exist_okTrue) for xml_file in os.listdir(annotation_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(annotation_dir, xml_file)) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) txt_path os.path.join(output_dir, xml_file.replace(.xml, .txt)) with open(txt_path, w) as f: for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in class_map: continue box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) cx (xmin xmax) / 2.0 / img_w cy (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h cls_idx class_map[cls_name] f.write(f{cls_idx} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}\n)脚本里的class_map是类别名到索引的映射比如{person: 0, vehicle: 1, hard_obstacle: 2, soft_obstacle: 3}。转换的核心是归一化所有坐标都要除以图像宽高。很多第一次做的开发者会直接用像素坐标写进TXT训练出来的损失曲线会剧烈震荡这时基本可以断定是标注格式的问题。标注质量直接影响模型上限。我对标注有一条硬性要求小于16×16像素的目标直接丢弃不要去标。YOLOv5最大特征图对应到原图的步长至少是8倍过滤掉这些小目标反而能减少标签噪声。3.3 数据集目录结构和data.yaml训练前最后一道工序YOLOv5约定数据集按下面方式组织railway_obstacle/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ ├── train.txt ├── val.txt └── data.yamldata.yaml内容模板train: /absolute/path/to/railway_obstacle/train.txt val: /absolute/path/to/railway_obstacle/val.txt nc: 4 names: [person, vehicle, hard_obstacle, soft_obstacle]这里最关键的是train.txt和val.txt里保存的是图片绝对路径。我用代码生成这两个文件避免手动维护出错find /path/to/railway_obstacle/images/train -name *.jpg train.txt find /path/to/railway_obstacle/images/val -name *.jpg val.txt注意图片文件和同名标签文件必须在对应的images和labels目录里。YOLOv5训练时会根据图片路径自动关联到标签路径它默认把路径中的images替换成labels、把.jpg替换成.txt。所以只要文件命名一致目录结构就能对上。4. 训练命令与关键参数调优让模型在轨道上稳定输出4.1 从YOLOv5s起步的训练命令分类和标注都准备好后我通常基于官方预训练权重开始训练而不是随机初始化。这样收敛快尤其是数据量不足5000张时迁移学习的优势非常明显。训练命令如下cd yolov5 python train.py \ --weights yolov5s.pt \ --data data.yaml \ --epochs 200 \ --batch-size 16 \ --imgsz 640 \ --device 0 \ --hyp hyp.scratch-low.yaml参数含义weights指定预训练权重data指向前面创建的data.yamlepochs是训练轮数batch-size是每批图像数根据显卡显存调节imgsz是输入分辨率默认640如果小目标多可以提到960但训练时间会变大hyp指定超参数文件。提示batch-size尽量调到显卡能承受的最大值。如果训练时报CUDA out of memory先把batch-size减半同时把workers设小。显存不足不一定要换卡也可以开启梯度累积但不如直接调batch-size省事。4.2 五个必调参数绝对影响铁路场景检测效果第一是imgsz。铁路异物很多是小目标把imgsz从640提到960小目标召回率可能会提升到10个百分点以上。代价是训练时间大约翻倍推理时间也会增加。我的建议是先640跑一个基线再用960微调对比看收益是否值得增加延迟。第二是mosaic增强。YOLOv5默认开启mosaic它把4张图拼成一张训练能显著提升小目标检测能力。但在铁路场景里mosaic会让模型看到很多不自然的拼接边缘有时候会造成误检。后期微调时我会把mosaic关闭只用旋转、平移、色彩抖动这些常规增强。第三是loss权重。data.yaml里可以给每个类别设置不同的loss权重比如人员检测权重设为1.0硬质异物设为0.8这样即便两类样本数量不平衡模型也不会完全偏向多数的类别。第四是学习率。默认初始学习率0.01对微调来说偏高容易把预训练权重冲乱。用官方预训练权重时我习惯把lr0改成0.005配合余弦退火策略收敛更平稳。第五是epoch数。不要机械地跑300轮。我一般先用早停机制训练观察验证集mAP连续30轮不上升就自动停止省时间也避免过拟合。4.3 怎么判断模型好不好别只盯着一个mAP跑完训练后我会先看验证集上的三个指标mAP0.5、mAP0.5:0.95、以及混淆矩阵。mAP0.5表示IoU阈值0.5下的平均精度铁路异物检测场景用它做主要衡量是合理的因为我们不需要像素级精准的框。mAP0.5:0.95是更严格的指标框稍微偏一点就会掉很多分。真正落地时我更关注的是混淆矩阵——它直接告诉我哪两类目标在互相误识别。如果混淆矩阵显示硬质异物被频繁识别成软质异物说明这两个类别在视觉上太接近要么补充更多边界样本的标注要么考虑合并类别。另外一定要看置信度阈值下的精确率和召回率平衡点。把置信度阈值从0.25提高到0.4误检会下降但漏检可能增多要根据现场可接受的风险方向来调。我在铁路项目里的经验是宁愿多误报也不要漏报。因为误报可以让值守人员二次确认漏报则是直接的安全隐患。所以最终部署时置信度阈值我会设为0.3而不是官方默认的0.25。5. 铁路异物检测常见问题排查五个反复出现的坑5.1 小目标检测基本失灵现象、原因与对策现象轨道远端落了一根钢钎检测结果里完全没有框。原因YOLOv5下采样倍数高小目标在特征图上只占很少的像素加上训练数据里小目标占比低模型根本没学会提取这种特征。解决第一把imgsz提高到960或更高给小目标更多有效像素第二从训练数据里筛选出小目标样本单独做复制粘贴增强第三引入切图策略把大图按滑窗切成小图训练和推理检测完再把框映射回原图。5.2 误检率居高不下背景噪声被当成了异物现象道砟、轨道扣件、甚至钢轨反光都被框成硬质异物监控墙上全是误报。原因模型学习到了背景纹理的特征而训练数据里缺少“难负样本”的标注。解决从验证集里把高置信度的误检结果抽出来手动整理成一张“负样本图片列表”放到训练集对应目录里并标记为空背景图片。YOLOv5的训练逻辑允许目录中存在没有标签TXT的图片它们会被当作纯背景参与训练。5.3 训练到一半显存爆掉不一定是卡不够好现象训练前几十个epoch正常某个时间点突然CUDA out of memory。原因mosaic增强在训练后期仍然执行了高分辨率拼接加上batch-size过大导致显存突发占用。解决减小batch-size关闭mosaic增强或者把imgsz降到原先值。如果还想保持数据增强强度可以用缓存的mosaic但注意这不能完全消除峰值波动。5.4 类别样本严重不均衡少数类永远学不好现象人员类别有8000个框软质异物只有400个框训练结果里软质异物基本检测不到。原因模型被多数类主导少数类的梯度贡献被淹没。解决一是调整data.yaml中每个类别的loss权重直接把软质异物的权重拉高到2.0二是对少数类样本做过采样同一张图片在训练列表里重复出现三是用数据增强生成更多少数类的变体比如把树枝旋转、翻转、调亮度。5.5 预测框抖动得厉害单帧检测的固有问题现象同一段视频里静止的落石框在相邻帧之间来回跳动看起来很不稳定。原因单帧目标检测对每帧独立推理框的微小偏移和置信度波动在相邻帧里被放大。解决引入目标跟踪算法做时序平滑常见做法是用ByteTrack或DeepSORT把检测结果关联成轨迹然后对轨迹内的框做EMA平滑。这样不仅框稳定了还能实现“持续存在的异物才告警”的业务逻辑滤掉瞬时误报。6. 部署到边缘设备的实战技巧导出、加速与告警联动6.1 模型导出从PyTorch权重到ONNX再到TensorRT训练好的权重不能直接搬到工控机上跑我习惯先导出成ONNX再转TensorRT这样推理速度能再涨一截。python export.py --weights runs/train/exp/weights/best.pt --include onnx --imgsz 640 trtexec --onnxbest.onnx --saveEnginebest.engine --fp16导出ONNX的时候注意把imgsz固定成训练时的分辨率。转TensorRT时开fp16精度在铁路监控这种场景下精度损失可以忽略但推理速度能提升2到3倍。我在实际工控机上测试过YOLOv5s在TensorRT引擎下单帧推理可以稳定在20毫秒以内四路视频同时分析也没压力。6.2 和多路监控告警系统联动去掉无效告警模型输出的检测框要转换成业务告警信号还需要加一层区域判断。铁路监控画面里存在一些天然干扰区域比如天空中偶尔飞过的鸟、防护网外的行人这些都不属于轨道异物。我在部署代码里加了一个ROI掩膜只对轨道区域内的检测框做告警区域外的直接忽略。import cv2 import numpy as np mask np.zeros((h, w), dtypenp.uint8) cv2.fillPoly(mask, [roi_points], 255) for det in predictions: cx, cy int(det[0]), int(det[1]) if mask[cy, cx] 255: trigger_alarm(det)ROI多边形在可视化配置工具里画一次保存成坐标文件即可。这一步能消掉接近一半的无效告警是落地部署里性价比最高的过滤逻辑。6.3 模型持续迭代的一种做法在线难例收集部署上线后不要停止收集数据。我在推理进程里加了一个难例筛子当连续5帧检测到同一个目标且置信度低于0.5时自动把这几个帧截图保存到指定的待标注目录。每隔一周人工标一批难例合并进训练集重新训练。这是让铁路异物检测系统长期稳定必不可少的一环。环境会变——树的影子长短、道砟颜色深浅、不同季节的光照角度都会让模型性能慢慢下降。我自己经历过一个印象很深的教训夏天训好的模型到了冬天把钢轨上的冰霜反光当成硬质异物误报率翻了好几倍。后来靠这个难例回喂机制每周迭代一次才把误报率重新压下来。如果你准备在这个方向上投入我的建议是从小处入手先固定好类别边界再准备数据最后用YOLOv5s跑通基线。不用一开始就追求最复杂的模型先把链路打通、把误报率压住后续再逐步迭代。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询