简介:一份系统梳理计算机视觉与轨道交通交叉应用的docx技术文档,面向人工智能、智慧交通领域的工程师、科研人员及高校学生,契合当前人工智能与大模型技术加速落地背景,适合作为技术综述与选题调研参考。资源包仅1个Word文档,大小约170KB,排版清晰、目录完整,可直接阅读或按章节查阅。正文先介绍计算机视觉技术概况、图像处理原理、深度学习算法与目标检测识别方法,以及软硬件系统构成;随后分三类场景展开:信号系统部分涵盖信号灯状态自动识别、列车位置检测与闭塞状态监测;线路维护部分涉及轨距与轨道变形、轨道表面缺陷、道岔关键部件缺陷、桥梁变形与隧道裂缝检测;运营管理部分包含客流量实时监测等。各模块均配有研究背景、国内外现状与安全性能评估思路,章节结构层层递进,既能帮助从零入门,也可为实际项目方案提供索引。已有31人学习下载,值得从事轨道交通智能化改造或视觉算法应用的相关人员收藏。
1. 计算机视觉技术在轨道交通应用里的位置与门槛
地铁站台门和列车门之间那道三十多厘米的缝隙,每天都在上演人与时间赛跑。屏蔽门防夹靠的是红外和激光雷达,但雨伞、裙摆、盲杖这类细长物体经常让传统传感器漏判;轨道巡检工每天走十几公里看钢轨和扣件,人眼疲劳后的漏检率并不低。把计算机视觉技术放进轨道交通,解决的正是这类“看得见但来不及反应”的问题:用摄像头和算法替代一部分人工目视,让异常检测从人眼疲劳的随机抽查,变成每帧都在执行的确定性检查。
这件事的难点不在模型精度,而在于轨道交通对“稳定”的要求远高于对“聪明”的要求。地铁环境光照剧烈变化、震动、灰尘、遮挡,任何一项都是通用视觉算法在现场崩掉的常见原因。这篇文按“任务与选型 → 数据与训练 → 边缘部署 → 参数调优”的顺序讲一套可落地的做法,覆盖从模型选型到现场调参的完整路径。适合做轨交智能化项目的算法工程师、集成商技术负责人,以及想评估视觉方案可行性的运维管理者。
2. 轨道交通视觉任务的任务定型与训练数据管线
2.1 轨道交通视觉任务不是通用目标检测的简化版
把通用目标检测模型直接搬到站台和隧道里,最大的坑就是“任务定型错了”。通用检测的目标是“把物体框出来”,但轨道交通里的视觉任务,绝大多数不是目标检测,而是异常事件检测和状态识别。以屏蔽门防夹为例,要判断的不是“门缝里有什么”,而是“门关到哪个位置了、夹缝里有没有异物”。前者是检测问题,后者是语义分割加时序判断的问题。两者用到的模型、标签方式和判定逻辑都完全不同。
另一个常见误区是照搬自动驾驶的方案。轨道交通线路固定、运行图固定,摄像头位置固定,这决定了视觉系统可以用更强的先验:场景背景几乎不变,物体运动轨迹有明确的物理约束。这意味着可以大量使用背景建模、轨道区域掩膜、速度预测这类方法大幅降低误报率。通用检测模型在这里反而会因为“过于通用”而产生大量无意义的候选框。
先把任务按四个维度分类定型和选型:
| 任务类型 | 典型场景 | 建议模型方向 | 输出形式 |
|---|---|---|---|
| 目标检测 | 轨行区人员入侵、遗留物检测 | YOLO系(v8/v11) | 边界框+类别 |
| 实例分割 | 屏蔽门夹缝异物、车底异物 | Mask R-CNN、YOLO-seg | 像素级掩膜 |
| 语义分割 | 道床裂缝、钢轨表面缺陷 | U-Net、DeepLabV3+ | 像素级分类 |
| 异常检测 | 接触网异物、烟雾 | PatchCore、视频异常检测 | 分数+局部定位 |
这里没有把姿态估计列进去,因为轨道交通里对“人的动作”识别需求较少,站台门区域的判断更依赖轮廓而非骨骼点。选型时优先用检测或分割,实在需要判断“是否摔倒”再引入姿态模型,减少一层推理就少一层失败概率。
2.2 样本不是从网上爬的,是从现场录的再抽的
通用模型可以用公开数据集起步,轨道交通不行。站台门形状、隧道光照、列车外观都具有强烈的场景特异性,公开数据训练出来的模型在现场基本不可用。我做轨交项目,样本来源就一个:现场安装的摄像头原始录像。
原始录像不能直接拿来训练,需要先做抽帧和清洗。最常见的做法是按时间间隔抽帧,再用CLIP或感知哈希去掉重复帧,最后人工标注。抽帧这一步看似简单,但间隔设错了会直接影响模型效果:地铁进站约30秒,如果你每秒抽1帧,能拿到约30帧,而列车门关闭过程只有3到5秒,有效帧可能就10帧出头。抽帧间隔设成5秒甚至10秒,关门瞬间大概率被跳过,模型永远学不到“夹物”的视觉特征。
import os import cv2 from pathlib import Path video_path = Path("raw/station_cam_01.mp4") out_dir = Path("frames/20240511") out_dir.mkdir(parents=True, exist_ok=True) cap = cv2.VideoCapture(str(video_path)) fps = cap.get(cv2.CAP_PROP_FPS) # 大多数现场摄像头为25fps interval = int(fps * 1.0) # 每1秒取1帧,进站事件可不遗漏 frame_id = 0 saved = 0 while True: ret, frame = cap.read() if not ret: break if frame_id % interval == 0: # 保存前先压缩,减少标注平台加载压力 cv2.imwrite(str(out_dir / f"{video_path.stem}_{saved:06d}.jpg"), frame, [cv2.IMWRITE_JPEG_QUALITY, 90]) saved += 1 frame_id += 1 cap.release() print(f"saved {saved} frames from {fps:.2f} fps video")这段代码的关键参数是interval = int(fps * 1.0),即按1秒1帧抽。如果做隧道裂缝检测,车行速度快,抽帧间隔要缩短到0.2秒以下,否则裂缝目标在相邻帧之间位移过大,标注时难以确认同一裂缝的不同形态。压缩质量设为90也是刻意的,现场录像原盘体积大,训练对画质不敏感,但太低的压缩率会在裂缝这类细纹理任务上产生伪影,模型学到的是压缩噪声。
标注阶段建议用矩形框加多边形混合:屏蔽门异物标注用多边形(物体形状不规则),轨道入侵人与遗留物用矩形框(目标相对完整)。标注类别要克制,类别越少越好,两三个类别足够时不要扩到五六个。轨道交通场景样本密度低,类别多了每类的样本量都不够,模型容易在类别间混淆。
2.3 数据平衡:正样本太多,负样本不够
训练数据里“没有异物的正常画面”约占九成,这会导致模型把“什么都不做”学得很好,把真正的异常事件当成噪声忽略。解决思路不是删正常帧,而是引入“难负样本”:在正常场景里手动放入可能引起误判的物体,比如报纸、塑料袋、反光的水渍。这些样本让模型学会区分“看着像异物但实际无害”的情况,比单纯堆异常样本更能压误报。
另一个有效做法是时间维度上的连续帧标签。轨道交通异常往往是一个过程,比如人翻越屏蔽门,有跨坐、跳下、落地三个瞬间,单帧标注只能让模型识别静态特征,而带上前后帧可以让模型学到动作的连贯性。实践中我会把抽帧后的连续5帧打包成一个样本单元,标注时只标关键帧,但在训练时把前后帧作为上下文输入,模型对“正在发生的异常”的判断明显更稳。
3. 边缘端推理部署:从ONNX导出到国产化工控平台
3.1 算力边界决定了模型不能只图准
轨道交通的摄像头点位分散在车站、隧道、车辆段,不可能把每路视频都传到机房做GPU推理。常见做法是轨旁机柜放一台边缘计算盒子,单台设备接入2到8路摄像头,在设备上完成推理,只把结果和关键帧上传。这就引出一个硬约束:模型必须跑在边缘设备的算力范围内。
以常见的边缘盒子为例,配置从几十TOPS的NPU到低功耗x86工控机都有。如果你的推理后端是英伟达系列,模型导出TensorRT是通用路径;如果你面对的是龙芯、飞腾这类国产平台,就得走ONNX Runtime或OpenVINO兼容层。把PyTorch模型转成ONNX是第一步,这一步谁都要做。
import torch import torch.onnx model = torch.load("best.pt", map_location="cpu")["model"].float() model.eval() # 固定输入尺寸,避免动态尺寸带来的导出警告和推理抖动 dummy_input = torch.randn(1, 3, 640, 640) torch.onnx.export( model, dummy_input, "best.onnx", opset_version=17, input_names=["images"], output_names=["output0"], dynamic_axes={"images": {0: "batch"}} # 推理时按batch=1跑,动态维只留batch ) print("ONNX exported")注意这里把输入分辨率固定为640x640,这是轨道交通现场部署最常见的做法。不要用动态分辨率,边缘设备的显存(或内存)有限,推理框架在动态分辨率下容易因为输入尺寸变化触发重新分配内存,导致推理耗时抖动。dynamic_axes只留下batch维度,保证一张图和四张图走同一个模型图,又不会因为分辨率变化拖慢速度。
导出后要立刻用ONNX Runtime验证输出是否与PyTorch一致。差值的容忍度取决于任务:检测任务允许坐标有几像素偏差,但分割任务要求像素级一致,否则现场轮廓判断会出问题。
3.2 TensorRT与OpenVINO的转换参数选择
如果边缘盒子带N卡,TensorRT是首选推理后端;如果面对的是国产CPU加集显方案,OpenVINO是更稳的选择。两者的转换命令并不复杂,难在参数搭配。
用TensorRT做INT8量化时,校准数据集必须来自现场,不能用COCO或城市道路数据。轨道交通场景的色彩分布和交通场景差异极大,隧道里整体偏暗偏黄,站台区高亮偏白,校准数据代表不了现场,INT8量化后的精度损失可能超过3%,这个损失在异物检测里就是漏报。
# TensorRT通过trtexec转换,核心是--calib和--fp16/int8 trtexec --onnx=best.onnx \ --saveEngine=best_fp16.engine \ --fp16 \ --workspace=2048 # OpenVINO通过mo转换,--scale控制输入归一化 mo --input_model=best.onnx \ --input_shape=[1,3,640,640] \ --scale=255 \ --mean_values=[0,0,0] \ --output_dir=ir_model--fp16在这里是推荐默认值。很多工程师一上来就追求INT8,但INT8在轨交这类小目标多、对比度低的场景里,精度掉得比预期快。我一般建议先用FP16跑通全流程,再回过来测INT8,如果精度掉点小于1%再切。OpenVINO侧--scale=255对应训练时的归一化策略,如果训练代码用的是/255.0,这里就是255;如果用了ImageNet的mean和std,就要换成对应的三组值。这步错位是模型在转IR后精度骤降的最常见原因,而且报错信息不会提示,只能通过对比推理结果才能发现。
3.3 国产化工控平台上的部署形态
热词里提到的龙芯2K3000赋能AFC系统,其实代表了轨道交通行业的一个明确趋势:核心设备和工控平台逐步国产化。AFC是自动售检票系统,表面上是闸机、二维码扫描、票卡读写,和计算机视觉没有直接关系,但闸机通道里的人体检测、尾随判定、行李识别,已经在往视觉方案迁移。也就是说,视觉算法要跑的不只是轨旁机柜,还包括闸机内置的国产化工控模块。
这类平台的共性是CPU基于MIPS或ARM架构,没有独立GPU,内存带宽有限。在这种硬件上跑视觉模型,三个做法比较实际:一是模型轻量化,换用YOLO-nano或MobileNetV3作为backbone;二是用OpenVINO的CPU推理路径,并开启多线程;三是把预处理(缩放、归一化)放到推理框架里,避免Python层的逐帧拷贝。真上项目时,还需要确认编译器版本和指令集支持。龙芯平台对OpenVINO的兼容性不如x86成熟,需要先用CPU推理跑通基准,再决定是否启用自研向量指令优化。这里建议在项目启动的第一周就做一次目标平台的推理实测,不要等模型训完再移植,否则优化时间不够,项目排期会被这个“最后一公里”吃掉大半。
4. 现场误报控制的3个必调参数与两类难样本
4.1 置信度阈值看场景,不看模型
模型训练完,第一个要调的参数就是置信度阈值。轨道交通场景对此极其敏感:屏蔽门防夹,漏报一次就可能造成安全事故,阈值要压低,宁可多报几次让站务员确认;但遗留物检测如果阈值太低,站台每趟车到站都会报警,站务员很快就会对报警麻木,反而把真报警忽略了。阈值不是模型参数,是运营策略参数。
我的做法是按“每路摄像头每小时可接受报警数”反过来定阈值。站台门区域每小时3次以内误报可以接受,那就先设0.3跑一整天的历史录像,统计误报次数,高了上调到0.4,低了再降。这个过程必须用历史录像回放做,不能在现场边运营边调,否则每一次误报都是在消耗站务员的信任。
4.2 NMS参数和跟踪缓冲的配合
目标检测后处理经常被忽略,但NMS参数直接决定了“同一目标是否被重复报警”。轨道交通场景里,摄像头固定,行人目标小,如果NMS的IoU阈值设得过高,同一行人可能被输出成两个相邻框,触发两次报警。常用经验值如下:
| 参数 | 默认值 | 轨交场景建议值 | 说明 |
|---|---|---|---|
| confidence_threshold | 0.25 | 0.30~0.45 | 按运营阈值策略调整 |
| NMS IoU threshold | 0.45 | 0.50 | 小目标密集场景适当调高 |
| 报警帧连续数 | 1帧 | 连续5~10帧 | 过滤瞬时闪烁 |
| 报警冷却时间 | 无 | 30~60秒 | 避免同一事件重复报警 |
连续帧判断是降误报最有效的手段。现场摄像头25fps,一个行人走过站台至少停留几秒,目标不会只出现一帧。要求目标连续出现N帧才触发报警,可以过滤掉飞鸟、落叶、光影变化这类单帧噪声。但N不能太大,屏蔽门关门只有3秒,如果要求连续10帧确认,等确认完门已经关上了。给这个场景的建议值是5帧,约0.2秒,人眼还没反应过来,算法已经完成确认。
import collections frame_buffer = collections.deque(maxlen=5) def on_track_result(frame_id, detections): # detections: [(class_id, conf, x1,y1,x2,y2)] frame_buffer.append((frame_id, detections)) # 检查连续5帧内同一位置是否都有检出 if len(frame_buffer) < 5: return None base_frame, base_dets = frame_buffer[0] current_frame, current_dets = frame_buffer[-1] if current_frame - base_frame > 10: frame_buffer.popleft() return None # 这里简化处理:判断当前帧的目标是否与第一帧重合 for det in current_dets: for ref in base_dets: iou = compute_iou(det[2:], ref[2:]) if iou > 0.5: return det # 连续5帧都有,触发报警 return None这段代码是报警缓冲的骨架。maxlen=5规定了必须连续5帧都检测到同一位置目标才放行;同时用current_frame - base_frame > 10限定了总时间跨度,超过10帧则重新累积。关键点在于IOU比较的是第一帧和当前帧,而不是相邻帧。如果比较相邻帧,目标缓慢移动时会因为每一帧都有重叠而触发,但目标其实已经走了很远;比较首尾帧可以约束“目标必须一直停留在报警区域内”。
4.3 两类难样本:雨雾干扰与遮挡截断
轨道交通现场最难处理的不是“目标太小”,而是“环境让目标变得不像目标”。雨天玻璃反光、隧道内车灯过曝、站台门半透明反光,都是误报源。反光导致的前景区域没有纹理特征,模型容易产生高置信度的错误候选框。
对于雨雾,可以用图像增强做预处理,但不要用深度学习增强网络,那种方法在边缘设备上跑不动。OpenCV的直方图均衡化或带色彩恢复的多尺度Retinex就够用,代价是每帧多2到3毫秒,在边缘设备上可以接受。遮挡问题更麻烦:行人被立柱挡住一半,检测框只有半个,模型往往会因为训练集里完整样本太多而把半个目标判为低置信度。解决办法在训练层面,标注的时候就要把“截断目标”也标出来,比如人被柱子挡住一半,依然标记完整框,让模型学会“只看到一半也能判断是个人”。
5. 用历史录像回放验证模型的实战技巧
回放验证是整个项目交付前最重要的环节,但很多人做得太随意:拉一段当天录像,跑一遍看几个报警,然后写报告。正确的做法是建立一个固定的测试集和回放脚本,让每次模型更新后都能在同样的数据上对比。
# 用ffmpeg把指定时间段的录像切出来作为回放测试集 ffmpeg -ss 06:30:00 -i station_cam_01.mp4 -t 1800 -c copy test_set/20240511_morning.mp4 # 批量回放测试:跑推理并把结果存成JSON,方便对比 python replay_test.py --video test_set/20240511_morning.mp4 \ --model best.engine \ --output result/20240511_morning.json \ --confidence 0.35回放脚本会逐帧跑推理,输出每帧的检测框和置信度。重点是把每次更新模型后的推理结果保存下来,做帧级对比。对比时关注三个指标:检出率(人工标注过的异常帧有多少被检出)、误报率(正常帧有多少被误报)、报警时间差(异常发生到系统报警延迟几秒)。时间差是轨道交通里常被忽视的指标,异物检测要求2秒内报警,回放测试时用暂停键人工计时,测试标准就是异常出现到画面出现报警框之间不超过2秒。
测试集里要专门放一批“阴雨天、夜间、强光”的样本,这些是现场最容易出问题的时段。如果阴雨天数据不足,可以等一个雨天专门录制,不要用图像增强去模拟雨天,模拟出来的效果和真实雨雾差异太大,验证结果没有参考价值。
还有一个实用技巧:把误报的画面按周汇总做成台账。这个台账比任何测试报告都有用。画面里反复出现某一类误报,说明某个现场条件没有被训练集覆盖,要么补样本,要么加规则过滤。比如某个站台在午后特定时间会有大面积光影移动,视觉上很像行人,这种情况与其硬调模型,不如在时间策略上做限制。轨道交通的视觉项目,最终交付的不只是一个模型,而是一套“模型+规则+运营策略”的组合,回放验证就是把这套组合逐步调到现场可用的过程。
本文还有配套的精品资源,点击获取