YOLOv11道岔异物检测与进站预警:从训练到Jetson Nano部署实战
简介这份PDF文档面向轨道交通运维人员、计算机视觉方向的学生与算法工程师围绕道岔异物检测与列车进站预警两大场景讲解如何用YOLOv11构建一套可落地的安全监测方案。资源包共1个PDF文件大小约1.93MB支持目录章节跳转与阅读器左侧大纲快速定位查阅方便。文档共27页内容涵盖轨道交通安全现状与挑战、YOLOv11算法原理与网络结构、道岔异物检测系统的硬件选型与软件模块设计、列车进站预警算法与系统集成开发并配有系统测试、优化策略及城市轨道交通与高铁站的应用案例分析。读者可从中获得从需求分析、架构设计到代码实现与部署测试的完整思路理解单阶段目标检测在安防监控、工业检测等场景中的高效与精准优势。目前已有90人学习适合作为课程设计、项目立项或技术选型的参考材料。1. 道岔异物检测与进站预警为什么值得用 YOLOv11 重做一遍道岔是轨道线路里最容易被异物“卡脖子”的位置。尖轨与基本轨之间的缝隙、辙叉心轨附近的槽口、转辙机拉杆周边的碎砟都可能让道岔无法正常密贴轻则晚点重则脱轨。传统做法靠人工巡道和定期查看监控问题是夜间、雨雾、逆光条件下人眼极易漏判等发现时列车已经接近进站区段。YOLOv11 道岔异物检测与列车进站预警系统要解决的就是把“看得见”变成“看得准、报得早”——在列车进入预警区段之前从既有监控画面里自动识别道岔区域的异物并联动进站预警逻辑。这套方案适合三类人一是做轨道交通智能运维的算法工程师手里有监控视频流但缺一套可落地的检测流程二是负责车站/区间安防的产品与集成人员需要判断 Jetson Nano 这类边缘设备能不能扛住 YOLOv11 的推理三是刚接触 YOLOv11 的开发者想找一个真实场景把环境配置、小目标优化、推理结果保存、部署整条链路跑通。它不追求论文级指标追求的是在有限算力下把漏报压下去、把预警提前量做出来。下面按“先立住原理、再动手复现、最后讲坑”的顺序展开中间会给可直接抄的命令和参数。2. YOLOv11 在道岔场景的选型与最小推理链路2.1 为什么是 YOLOv11而不是 v8 或两阶段检测道岔异物检测的难点不在“有没有目标”而在“目标小、背景杂、实时性要求高”。异物常见形态是石块、塑料布、金属片、树枝尺寸可能只占画面几十个像素道岔区域本身有大量钢轨反光、扣件、拉杆纹理干扰强。两阶段检测器精度够但推理慢在边缘设备上很难做到多路视频并发。YOLOv8 已经能跑但 YOLOv11 在网络结构上对特征提取和颈部融合做了调整同等算力下小目标召回通常更稳且官方工程链对导出 ONNX、TensorRT 更顺。选型时我一般看三个硬指标单帧推理延迟、小目标召回、导出部署难度。道岔预警要求从检测到报警控制在 300ms 内Jetson Nano 上 FP16 推理 YOLOv11n 大约能到 1525 FPS满足单路或双路轮询如果换成 YOLOv11m帧率会掉到个位数除非上 Orin 系列。所以标题里的“YOLOv11”落地时优先选 n 或 s 权重别一上来就上大模型。2.2 环境配置从零把 YOLOv11 跑起来的最小命令先给一套我在 Ubuntu 20.04/22.04 上反复用过的环境配置。Python 用 3.9 或 3.10CUDA 11.8 对应 PyTorch 2.1这是目前和 YOLOv11 兼容性最稳的组合。# 创建独立环境避免和系统包冲突 conda create -n yolo11 python3.10 -y conda activate yolo11 # 安装 PyTorchCUDA 11.8 版本按自己驱动调整 pip install torch2.1.2 torchvision0.16.2 --index-url https://download.pytorch.org/whl/cu118 # 安装 ultralyticsYOLOv11 官方工程入口 pip install ultralytics # 验证环境和权重能否加载 yolo checksyolo checks会打印 PyTorch、CUDA、设备信息。如果 CUDA 显示不可用先查驱动版本和nvidia-smi别急着改代码。权重文件用yolo11n.pt首次运行会自动下载。这里的关键参数是--device 0指定 GPU--imgsz 640是训练和推理的输入尺寸道岔小目标可以尝试 960 或 1280但边缘设备要权衡帧率。2.3 用已有权重做一次道岔视频推理并保存结果在正式训练前先用 COCO 预训练权重跑一段道岔监控视频确认整条链路通。热词里“yolov11保存推理结果”“yolov11预测后保存”说的就是这个环节。from ultralytics import YOLO # 加载预训练权重先验证推理链路 model YOLO(yolo11n.pt) # 对视频做推理saveTrue 会把带框视频写到 runs/detect/ 下 results model.predict( sourcedaocha.mp4, # 道岔监控视频路径 imgsz960, # 小目标场景适当放大输入 conf0.25, # 置信度阈值先保守 iou0.5, # NMS IoU 阈值 device0, # 使用 GPU saveTrue, # 保存可视化结果 save_txtTrue, # 保存检测框坐标到 txt projectruns/daocha, # 输出目录 nameexp1 )conf0.25是召回优先的起点道岔异物漏报代价远高于误报所以阈值可以压低后续再用验证集调。save_txtTrue会输出每帧的类别和归一化坐标方便和进站预警逻辑对接。imgsz960比默认 640 更能保住小目标但 Jetson Nano 上要实测帧率如果掉到 5 FPS 以下就退回 640 并配合切片推理。3. 道岔异物数据集构建与小目标优化3.1 数据标注道岔区域该框什么、不该框什么道岔异物检测的标注规范直接决定模型上限。我的经验是只框“侵入限界或影响道岔密贴”的物体不要把钢轨、扣件、拉杆、转辙机正常部件框进去。常见类别可以定为石块、塑料布、金属片、树枝、其他。标注时框要贴紧目标外沿但小目标不要小于 8×8 像素否则训练时下采样后信息几乎丢失。采集画面要覆盖白天、夜间红外、雨雾、逆光四类条件每类至少 300500 帧。道岔区域在画面里通常只占 1/4 到 1/3建议先做 ROI 裁剪把检测范围缩到道岔附近这样小目标相对像素更大背景干扰也少。裁剪后的数据集按 8:1:1 划分训练、验证、测试目录结构用 YOLO 标准格式。3.2 用 YOLOv11 训练道岔异物模型的关键参数数据准备好后写一个daocha.yaml描述数据集路径和类别然后启动训练。下面这套参数是我在 24G 显存上跑 YOLOv11s 的常用配置。# daocha.yaml path: /data/daocha train: images/train val: images/val test: images/test names: 0: stone 1: plastic 2: metal 3: branch 4: otheryolo detect train \ datadaocha.yaml \ modelyolo11s.pt \ epochs150 \ imgsz960 \ batch16 \ lr00.01 \ lrf0.01 \ patience30 \ mosaic1.0 \ close_mosaic10 \ device0 \ projectruns/daocha \ nametrain_v1imgsz960配合batch16在 24G 卡上比较稳显存不够就降 batch 或开ampTrue。mosaic1.0增强小目标上下文但最后 10 个 epoch 用close_mosaic10关掉让模型适应真实分布。patience30防止过拟合空跑。训练完看results.png里的mAP50-95和召回曲线道岔场景我更关注召回宁可误报也别漏报。3.3 小目标优化切片推理与输入尺寸的取舍热词里“yolov11小目标优化”是道岔场景的核心。除了放大imgsz常用手段是切片推理SAHI 思路把大图切成带重叠的小图分别检测再合并结果。代价是推理次数成倍增加边缘设备要算好预算。from ultralytics import YOLO import cv2 model YOLO(runs/daocha/train_v1/weights/best.pt) img cv2.imread(frame.jpg) h, w img.shape[:2] # 简单切片2x2 带 20% 重叠适合道岔 ROI 不大的场景 tiles [] step_h, step_w h // 2, w // 2 for y in range(0, h, int(step_h * 0.8)): for x in range(0, w, int(step_w * 0.8)): tile img[y:y step_h, x:x step_w] if tile.size 0: continue r model.predict(tile, imgsz640, conf0.2, verboseFalse)[0] for box in r.boxes: # 把切片坐标映射回原图 xyxy box.xyxy[0].cpu().numpy() xyxy[[0, 2]] x xyxy[[1, 3]] y tiles.append((xyxy, float(box.conf[0]), int(box.cls[0]))) # 后续对所有框做一次 NMS 合并 print(f合并前检测框数量: {len(tiles)})切片重叠率建议 0.20.3太低会切断目标太高推理量暴涨。合并阶段必须做全局 NMS否则同一目标会被重复框。Jetson Nano 上如果切片后帧率不够可以只对道岔 ROI 切片而不是全图。4. 列车进站预警逻辑与 Jetson Nano 部署4.1 从检测框到预警区域判定与时间窗检测到异物不等于要报警必须结合列车位置和进站时间窗。常见做法是在画面里标定道岔危险区多边形当异物框中心落入该区域且持续 N 帧才触发预警。列车进站信号可以从既有信号系统取也可以用车头检测模型判断。import numpy as np # 道岔危险区多边形按实际画面标定 danger_zone np.array([[320, 180], [960, 180], [980, 540], [300, 540]]) def in_zone(box_xyxy, zone): cx (box_xyxy[0] box_xyxy[2]) / 2 cy (box_xyxy[1] box_xyxy[3]) / 2 # 射线法判断点是否在多边形内 inside False n len(zone) for i in range(n): x1, y1 zone[i] x2, y2 zone[(i 1) % n] if ((y1 cy) ! (y2 cy)) and (cx (x2 - x1) * (cy - y1) / (y2 - y1) x1): inside not inside return inside # 连续 5 帧命中才报警抑制抖动 hit_count 0 def alarm_logic(boxes): global hit_count hit any(in_zone(b, danger_zone) for b in boxes) hit_count hit_count 1 if hit else 0 return hit_count 5危险区标定要避开正常列车部件和道岔动作区域否则转辙机一动就误报。连续帧阈值 5 是经验值帧率 25 FPS 时约 200ms既能抑制抖动又不会太迟钝。预警输出可以走继电器、声光报警或推送到车站终端具体接口按现场定。4.2 Jetson Nano 部署 YOLOv11 的详细步骤热词里“jetson nano 部署yolov11详细步骤”是很多人的卡点。Nano 算力有限必须走 TensorRT。先在训练机上导出 ONNX再在 Nano 上用trtexec转 engine。# 在训练机导出 ONNXimgsz 和训练一致 yolo export modelruns/daocha/train_v1/weights/best.pt formatonnx imgsz640 opset12 simplifyTrue # 在 Jetson Nano 上转 TensorRT engineFP16 /usr/src/tensorrt/bin/trtexec \ --onnxbest.onnx \ --saveEnginebest_fp16.engine \ --fp16 \ --workspace2048Nano 的 JetPack 版本决定 TensorRT 版本转 engine 时--workspace别超过显存。FP16 比 FP32 快近一倍精度损失在道岔异物上通常可接受。推理时用yolo export formatengine或直接加载 engine配合imgsz640单路能到 1015 FPS。如果要多路建议用 DeepStream 做流水线别在 Python 里硬扛。4.3 推理结果保存与预警日志对接热词里“yolov11保存推理结果”在部署阶段要落到日志和截图。每次触发预警保存当前帧、检测框坐标、时间戳和置信度方便事后复盘。import cv2, json, time def save_alarm(frame, boxes, pathalarm_log): ts time.strftime(%Y%m%d_%H%M%S) cv2.imwrite(f{path}/{ts}.jpg, frame) record { time: ts, boxes: [b.tolist() for b in boxes], source: daocha_cam01 } with open(f{path}/{ts}.json, w) as f: json.dump(record, f, ensure_asciiFalse)日志字段要包含摄像头编号和道岔编号否则多路部署后无法定位。截图分辨率别压缩太狠复盘时要能看清异物形态。存储周期按现场要求一般保留 30 天。5. 避坑与排查道岔异物检测最常见的 5 个翻车点5.1 夜间红外画面漏报严重现象白天 mAP 正常夜间红外视频几乎检不出异物。原因训练集里夜间样本太少且红外画面纹理和可见光差异大模型没学到红外特征。解决夜间样本至少占训练集 30%并在训练时开hsv_v和hsv_s增强必要时把红外和可见光分成两个模型按时间段切换。5.2 转辙机动作被误判为异物现象道岔转换时拉杆移动模型把拉杆框成金属异物频繁误报。原因训练集里包含了转辙机动作帧且标注时把移动部件框了进去。解决标注规范里明确转辙机正常部件不框训练前把转辙机动作帧剔除或单独标为忽略区域预警逻辑里加时间窗转辙机动作期间屏蔽报警。5.3 Jetson Nano 上 engine 推理结果和 PyTorch 不一致现象同一张图PyTorch 能检出TensorRT engine 漏检。原因导出 ONNX 时opset或simplify设置不当或者预处理归一化参数不一致。解决导出时固定opset12、simplifyTrue推理时确认 letterbox 的填充值和归一化系数与训练一致用同一张测试图对比 PyTorch 和 engine 的输出框逐层排查。5.4 小目标置信度普遍偏低现象石块、树枝这类小目标 conf 常在 0.10.2低于阈值被过滤。原因小目标在特征图上响应弱且正样本少。解决训练时开mosaic和copy_paste增强imgsz提到 960 或 1280推理时对道岔 ROI 单独切片阈值按类别设小目标类别用 0.15大目标用 0.3。5.5 预警延迟超过进站时间窗现象检测到异物时列车已经进站预警失去意义。原因推理帧率低、切片推理耗时、预警逻辑串行阻塞。解决用 TensorRT FP16 提速切片只对 ROI 做预警逻辑和推理解耦用队列异步处理提前量按列车速度和预警区段长度反推必要时把检测区段前移。6. 把预警提前量做出来的一个具体技巧道岔异物检测做到最后拼的不是模型结构而是“提前量”。我踩过的最大坑是模型指标很好看但预警总是慢半拍。后来我把检测区段从道岔本体前移到进站信号机外方 200 米用同一套 YOLOv11 模型检测更早的画面同时把道岔危险区判定改成“异物持续存在 列车接近”双条件。这样即使单帧漏检只要异物在后续帧被检出预警依然能在列车到达道岔前发出。具体做法是维护一个滑动窗口记录最近 2 秒内异物命中次数超过阈值就置位列车接近信号用轨道电路或车头检测给出。两者同时满足才触发一级预警只有异物没有列车时触发二级提示。这套逻辑在 Jetson Nano 上额外开销很小但把有效预警提前量从不足 3 秒拉到了 12 秒以上。预警等级触发条件输出方式一级异物持续 列车接近声光报警 车站终端二级仅异物持续日志 监控弹窗三级单帧异物仅记录不报警参数上滑动窗口长度按帧率算25 FPS 取 50 帧命中阈值取 1015 帧太低会误报太高会漏报。列车接近信号如果取不到可以用车头检测模型替代但要在同一 ROI 里做避免画面切换导致坐标错位。我现在的习惯是每换一个道岔点位先跑一周只记录不报警用真实数据回看漏报和误报再调阈值。道岔场景没有一劳永逸的参数只有不断对齐现场。希望帮到你。本文还有配套的精品资源点击获取