基于python铁路信号机视频自动识别与仿真系统源码+训练好的模型+GUI界面

YOLOv5 铁路信号机视频自动识别与仿真系统

基于 YOLOv5 目标检测 + DeepSort 目标跟踪 + PyQt5 可视化界面的铁路信号机智能识别系统


目录


项目简介

本项目是一款面向铁路行车安全场景的智能辅助系统,核心目标是对列车运行过程中前方信号机进行实时检测、跟踪与筛选,并通过 PyQt5 可视化界面将结果直观呈现给司机,以缓解司机视觉疲劳、降低误判风险、提升行车安全性。

系统主要具备以下三大功能:

  1. 图片检测:对单张铁路场景图片进行信号机目标检测
  2. 视频检测:对铁路行车录像进行离线信号机检测与跟踪
  3. 实时检测:接入摄像头进行实时信号机检测与跟踪

支持检测的信号机类别如下:

信号机种类 检测类别名称 说明
红色 red 停车,禁止越过信号机
绿色 green 允许越过该信号机
单黄色 s_yellow 减速,或指示正线停车
双黄色 d_yellow 指示侧线停车
月白色 white 引导信号,或允许越过该信号机调车
蓝色 blue 禁止越过该信号机调车

算法原理

1. YOLOv5 目标检测

YOLOv5(You Only Look Once v5)是一种单阶段目标检测算法,其核心思想是将目标检测问题转化为回归问题,在一次前向传播中同时预测目标的边界框和类别概率。

本系统基于 YOLOv5s(small)模型,并针对铁路信号机检测场景进行了以下改进:

  • Mosaic9 数据增强:在原有 Mosaic4(4 张图拼接)基础上扩展为 9 张图拼接,大幅增加训练样本的背景多样性,提升模型对小目标的感知能力。
  • 带边缘扩展的 Copy-Paste 数据增强:将目标实例从原图中抠出并粘贴到其他背景图像上,同时对目标边缘进行适当扩展,增强模型对信号机目标的特征学习能力。
  • 小目标检测层:在原有 3 个检测头(P3/P4/P5)基础上增加更高分辨率的 P2 检测头,专门用于捕捉小目标信号机,显著提升远距离信号机的检出率。

2. DeepSort 目标跟踪

DeepSort 是一种基于"检测后跟踪"(Tracking-by-Detection)范式的多目标跟踪算法,其工作流程如下:

  1. 卡尔曼滤波预测:利用卡尔曼滤波器对每个目标的下一帧位置进行预测,缩小匹配搜索范围
  2. 特征提取:使用深度卷积网络(ReID 模型)提取每个目标的外观特征向量
  3. 级联匹配:结合马氏距离(运动信息)和余弦距离(外观特征)进行匈牙利算法匹配
  4. 轨迹管理:对未匹配目标建立新轨迹,对已消失轨迹进行删除

在本项目中,DeepSort 用于对 YOLOv5 检测出的信号机进行实时跟踪,获取同一信号机在连续帧中的轨迹信息,为后续的多信号机筛选提供数据基础。

3. 多信号机筛选(MultiSignalFilter)

在实际铁路场景中,司机视野内可能同时出现多个信号机,但只有指示本列车运行的信号机才是有效目标。MultiSignalFilter 模块基于信号机连续轨迹的运动特征,对多个候选信号机进行筛选,输出与列车运行相关的有效信号机检测结果。


环境要求

环境 版本要求
操作系统 Windows 10/11
Python 3.8(推荐)
PyTorch ≥ 1.12.0
CUDA 11.x(推荐,需与 PyTorch 版本匹配)
cuDNN 与 CUDA 版本对应
显卡 NVIDIA GPU(显存 ≥ 4GB,推荐 6GB 以上)

说明:CPU 模式可运行但速度较慢,强烈建议使用 GPU 环境。


安装步骤

第一步:安装 CUDA 和 cuDNN

前往 NVIDIA 官网下载并安装与显卡驱动匹配的 CUDA Toolkit,并配置对应版本的 cuDNN。

第二步:安装 PyTorch

根据 CUDA 版本从 PyTorch 历史版本页面 选择对应命令安装,例如 CUDA 11.6:

bash 复制代码
pip install torch==1.12.0+cu116 torchvision==0.13.0+cu116 --extra-index-url https://download.pytorch.org/whl/cu116

第三步:克隆项目并安装依赖

bash 复制代码
# 克隆项目代码
git clone <your-repo-url>
cd yolov5-5.0

# 安装项目依赖
pip install -r requirements.txt

主要依赖说明:

  • torch / torchvision:深度学习框架
  • opencv-python:图像处理
  • numpy / scipy / matplotlib:数值计算与可视化
  • PyQt5:图形界面框架
  • PyYAML:配置文件解析
  • tensorboard:训练日志可视化
  • tqdm:进度条显示
  • openpyxl / pandas:数据导出处理
  • easydict / Cython:DeepSort 依赖

运行步骤

启动图形界面(推荐)

bash 复制代码
python mainwindow.py

启动后将进入系统主界面,界面包含以下功能区域:

  • 参数设置模块:调整检测置信度、IoU 阈值、推理图片尺寸等参数
  • 功能选择模块:切换图片检测 / 视频检测 / 实时检测模式
  • 结果显示模块:展示检测结果、检测类别与置信度
  • 视频播放模块:实时播放检测视频流
  • 轨迹显示模块:动态展示 DeepSort 跟踪的实时轨迹
  • 用时显示模块 :显示单帧检测耗时

命令行推理(可选)

bash 复制代码
# 对单张图片进行检测
python detect.py --source data/images/bus.jpg --weights weights/train_signal500.pt --conf 0.4

# 对视频进行检测
python detect.py --source path/to/video.mp4 --weights weights/train_signal500.pt --conf 0.4

# 使用摄像头实时检测
python detect.py --source 0 --weights weights/train_signal500.pt --conf 0.4

模型训练(可选)

bash 复制代码
python train.py --data data/train_signal.yaml --cfg models/yolov5s_improved.yaml --weights weights/yolov5s.pt --epochs 100 --batch-size 16 --img-size 640

注意事项

  1. GPU 显存不足 :若训练时出现 CUDA out of memory 错误,请适当减小 --batch-size--img-size 参数。
  2. PyTorch 与 CUDA 版本匹配:请务必确认 PyTorch 版本与 CUDA 版本兼容,否则 GPU 加速将无法生效。
  3. 权重文件weights/ 目录下已提供预训练权重,其中 train_signal500.pt 为最优模型(mAP@0.5:0.95 = 0.8204),推荐优先使用。
  4. 摄像头权限:使用实时检测功能时,需确保系统已授予摄像头访问权限。
  5. 视频格式 :视频检测支持常见格式(.mp4.avi.mov 等),建议使用 H.264 编码的 MP4 文件。
  6. 路径中不要包含中文:部分第三方库对中文路径支持不佳,建议将项目放置在纯英文路径下。
  7. 数据集格式 :自定义训练时,数据集需采用 YOLO 格式标注(class x_center y_center width height,归一化到 0-1)。
  8. DeepSort 权重 :DeepSort 的 ReID 权重文件位于 deep_sort_pytorch/deep_sort/deep/checkpoint/ckpt.t7,请确保该文件存在。

文件夹结构

复制代码
yolov5-5.0/
├── data/                           # 数据配置目录
│   ├── images/                     # 示例图片(bus.jpg、zidane.jpg)
│   ├── scripts/                    # 数据集下载脚本(COCO、VOC、Argoverse)
│   ├── coco.yaml                   # COCO 数据集配置
│   ├── voc.yaml                    # VOC 数据集配置
│   ├── road_signal.yaml            # 公路信号机数据集配置
│   ├── train_signal.yaml           # 铁路信号机数据集配置
│   ├── train_signal500.yaml        # 铁路信号机(500张)数据集配置
│   ├── hyp.scratch.yaml            # 从头训练的超参数配置
│   └── hyp.finetune.yaml           # 微调训练的超参数配置
│
├── models/                         # 模型定义目录
│   ├── hub/                        # 各类模型变体配置(YOLOv3/5/6系列)
│   ├── common.py                   # 通用模块(卷积、残差块等基础组件定义)
│   ├── yolo.py                     # YOLO 模型主体构建逻辑
│   ├── export.py                   # 模型导出工具(ONNX、TorchScript等)
│   ├── experimental.py             # 实验性功能(模型加载辅助)
│   ├── yolov5s.yaml                # YOLOv5s 模型结构配置
│   └── yolov5s_improved.yaml       # YOLOv5s 改进版模型结构配置(含小目标检测层)
│
├── utils/                          # 工具函数目录
│   ├── aws/                        # AWS 云部署脚本
│   ├── google_app_engine/          # Google App Engine 部署配置
│   ├── wandb_logging/              # Weights & Biases 日志集成
│   ├── datasets.py                 # 数据集加载与预处理
│   ├── general.py                  # 通用工具函数(NMS、坐标转换等)
│   ├── loss.py                     # 损失函数定义
│   ├── metrics.py                  # 评估指标计算(mAP等)
│   ├── plots.py                    # 可视化工具(绘制检测框、结果图等)
│   ├── torch_utils.py              # PyTorch 工具函数(设备选择、模型EMA等)
│   ├── autoanchor.py               # 自适应锚框计算
│   └── activations.py              # 激活函数定义
│
├── deep_sort_pytorch/              # DeepSort 目标跟踪模块
│   ├── configs/
│   │   └── deep_sort.yaml          # DeepSort 跟踪参数配置
│   ├── deep_sort/
│   │   ├── deep/                   # ReID 特征提取网络
│   │   │   ├── checkpoint/
│   │   │   │   └── ckpt.t7         # ReID 预训练权重
│   │   │   ├── model.py            # ReID 网络结构定义
│   │   │   └── feature_extractor.py# 特征提取器封装
│   │   ├── sort/                   # Sort 跟踪核心算法
│   │   │   ├── kalman_filter.py    # 卡尔曼滤波器
│   │   │   ├── linear_assignment.py# 匈牙利匹配算法
│   │   │   ├── nn_matching.py      # 最近邻匹配
│   │   │   ├── track.py            # 轨迹类定义
│   │   │   └── tracker.py          # 跟踪器主逻辑
│   │   └── deep_sort.py            # DeepSort 整体封装
│   └── utils/                      # DeepSort 辅助工具
│
├── Datasets_Processing/            # 数据集处理工具
│   ├── datasets_statistic.py       # 数据集统计分析
│   ├── reformat.py                 # 数据集格式转换
│   ├── rename.py                   # 文件批量重命名
│   └── SuperfluousFilesSearch.py   # 冗余文件查找
│
├── weights/                        # 模型权重目录
│   ├── yolov5s.pt                  # YOLOv5s 预训练权重
│   ├── coco128.pt                  # COCO128 训练权重
│   ├── road_signal.pt              # 公路信号机训练权重
│   ├── train_signal.pt             # 铁路信号机训练权重
│   └── train_signal500.pt          # 铁路信号机(500张)最优权重
│
├── log/                            # 运行日志目录
│   ├── position_log.xlsx           # 信号机位置日志
│   ├── time_log.xlsx               # 检测时间日志
│   └── position_log.png            # 位置日志可视化
│
├── resource/                       # UI 资源目录(图标、背景图等)
├── UiMainwindow.py                 # 主窗口 UI 代码(由 .ui 文件生成)
├── UiMainwindow.ui                 # 主窗口 Qt Designer 文件
├── mainwindow.py                   # 主程序入口(启动图形界面)
├── model_load.py                   # 模型加载封装
├── multi_signal_filter.py          # 多信号机筛选模块
├── my_window_effect.py             # 窗口特效(毛玻璃效果等)
├── resource.qrc                    # Qt 资源描述文件
├── resource_rc.py                  # Qt 资源编译后的 Python 文件
├── signal.yaml                     # 信号机类别配置
├── detect.py                       # 推理检测脚本
├── train.py                        # 模型训练脚本
├── test.py                         # 模型测试/评估脚本
└── requirements.txt                # 项目依赖清单

模型权重参考

模型文件 训练数据集 输入尺寸 mAP@0.5:0.95
coco128.pt COCO128 640×640 0.7996
road_signal.pt road_signal 640×640 0.7516
train_signal.pt train_signal 640×640 0.7805
train_signal500.pt train_signal500 640×640 0.8204