ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLOv8交通信号灯识别与通行规则推理系统

YOLOv8交通信号灯识别与通行规则推理系统 简介本资源是一套基于YOLOv8实现的路口交通信号灯通行规则识别系统面向人工智能、自动化、电子信息等专业学生及初阶开发者解决交通场景中红绿灯状态判别与通行逻辑解析的实际问题适用于课程设计、毕业设计、项目立项演示及深度学习入门实践。压缩包共18个文件含11个Python源码覆盖模型训练、推理预测、结果可视化与数据处理等核心模块、2个文本说明文件含环境依赖与授权信息、2张效果示意图、1个配置文件config.yaml、1个Markdown文档README及1个.gitignore整体体积仅706KB轻量易部署。已有55人下载学习资源源自高分结题项目答辩95分代码经实测可直接运行配套完整文档与结构化目录便于理解YOLOv8在交通视觉任务中的工程落地路径并支持在此基础上拓展多目标识别或规则引擎优化。1. 把交通信号灯“看懂”再“判规”YOLOv8 不只是检测红黄绿而是理解“此时能否通行”的完整推理链路口摄像头拍到一个红灯YOLOv8 检出 bounding box —— 这只是起点。真正落地的智能交管系统要回答的是“当前相位下该车道车辆是否被允许通行依据是哪条规则是否与上一帧存在逻辑冲突”这份资源不是又一个“YOLOv8 检测红绿灯”的 demo而是一套闭环式交通通行规则识别系统它用 YOLOv8 做高精度信号灯状态识别红/黄/绿/灭/箭头再通过状态序列建模 相位逻辑校验 车道-信号映射表输出结构化通行决策如{lane_id: L3, signal_state: green_arrow, allowed: true, rule_ref: GB5768.2-2022_4.3.2}。项目已实测部署于 Ubuntu 20.04 CPU 环境无 GPU 也可跑通推理含完整标注规范、训练策略说明、规则引擎配置模板及三套真实路口视频验证集。适合正在做智慧路口边缘计算、交通事件分析或课程设计需要“检测逻辑标准落地”三层能力展示的工程师与学生——你不需要自己从零搭环境、写规则解析器、对齐国标条款所有 glue code 和 domain logic 都已封装进traffic_rule_engine.py。2. YOLOv8 模型选型与轻量化改造为什么不用原生 yolov8n而用自研的 traffic-yolov8s-lite2.1 交通场景下的模型瓶颈小目标、低对比度、强光照干扰普通 YOLOv8 检测红绿灯常在两类场景翻车一是远距离小目标50m 处信号灯仅占图像 8×8 像素二是正午强光下红灯反光导致色偏RGB 值接近白光。原生yolov8n.pt在自建测试集含 12 个不同角度/天气/时段路口视频抽帧上 mAP0.5 仅 68.3%漏检集中在黄灯过渡期和雨雾天。我们放弃直接微调转而重构 backbone用ShuffleNetV2 替换原生 CSPDarknet保留 Neck 的 PANet 结构但将 P3/P4/P5 输出通道数分别压缩至 64/96/128原为 128/256/512Head 层引入Light-DETR 式注意力门控非参数化仅用 sigmoid 加权特征图使模型在保持 2.1M 参数量前提下对 16×16 小目标召回率提升 23.7%。关键改动在models/yolo/traffic_yolov8s_lite.yaml# models/yolo/traffic_yolov8s_lite.yaml backbone: # 替换为 ShuffleNetV2 0.5x 版本输入 640x640 → 输出 C3/C4/C5 分辨率 - [-1, 1, ShuffleV2, [64, 128, 256]] # C3: 80x80, C4: 40x40, C5: 20x20 neck: - [[-1, 6], 1, CBAM, [128]] # 在 P4 输入前加通道空间双注意力轻量版 - [[-1, 4], 1, CBAM, [96]] # P3 同理 head: - [-1, 1, Detect, [nc, anchors]] # Detect 层内嵌 sigmoid 门控out out * torch.sigmoid(gate)提示CBAM 模块使用torch.nn.Sequential实现不依赖额外库gate 是 Head 中新增的 1×1 卷积层输出与特征图同尺寸避免引入可学习参数爆炸。2.2 训练策略多尺度 伪标签 规则引导损失数据增强不能只靠 Mosaic 和 MixUp——交通信号灯有强几何约束。我们在train.py中注入三项定制策略动态尺度裁剪按信号灯物理尺寸反推像素范围如 400mm 直径灯在 30m 处约 42px强制 resize 后短边 ≥ 48px伪标签迭代用初版模型对未标注视频抽帧生成 pseudo-label人工审核后加入训练集脚本tools/generate_pseudo_labels.py规则一致性损失在 loss 计算中增加L_rule λ * MSE(transition_prob, rule_transition_matrix)其中rule_transition_matrix来自《GB5768.2-2022》第 4 章相位转移表如红→绿合法红→黄非法transition_prob由模型输出的状态序列 softmax 得到。该损失项使模型学会“红灯后大概率接绿灯”而非孤立判断单帧。2.3 推理加速ONNX TensorRT 优化路径实测对比CPU 推理延迟是边缘设备落地的生命线。我们对比了三种部署方式输入 640×640 RGB 图像方式环境平均延迟ms内存占用是否支持 batch1PyTorch (FP32)Ubuntu 20.04, i5-8250U128.41.2GB✅ONNX Runtime (CPU)同上启用execution_modeORT_SEQUENTIAL42.7840MB✅TensorRT (FP16)Jetson Nano无 GPU 加速N/A—❌需 CUDA 10.2最终选择 ONNX Runtime它在不牺牲精度mAP0.5 仅降 0.3%前提下将单帧处理压到 43ms 以内满足 20fps 实时性要求。导出命令见export_onnx.py# export_onnx.py import torch from ultralytics import YOLO model YOLO(weights/traffic-yolov8s-lite.pt) model.export( formatonnx, dynamicTrue, # 支持变长 batch opset12, # 兼容旧版 ONNX Runtime simplifyTrue, # 启用 onnxsim 优化 imgsz[640, 640] ) # 输出traffic-yolov8s-lite.onnx注意simplifyTrue会自动合并 Conv-BN-ReLU 为单层但需提前pip install onnxsim若报错Unsupported operator BatchNormalization请降级 onnxsim 到 0.4.33。3. 通行规则引擎设计从“检测结果”到“能否通行”的三层推理3.1 状态识别层YOLOv8 输出 → 标准化信号状态码YOLOv8 原始输出是[x,y,w,h,conf,class_id]但交通规则需要语义化状态。我们在inference.py中定义映射表class_id原始类别名标准状态码说明0redS_RED圆形红灯1yellowS_YELLOW圆形黄灯2greenS_GREEN圆形绿灯3red_arrowS_RED_ARROW箭头红灯直行/左转/右转4green_arrowS_GREEN_ARROW箭头绿灯5offS_OFF灯灭故障或夜间模式关键逻辑在utils/traffic_state_parser.py对同一信号灯组如主路直行灯、辅路左转灯按物理位置聚类 bboxDBSCANeps150px对每个聚类取置信度最高 class_id 作为当前状态若连续 3 帧 class_id 变化如S_RED → S_YELLOW → S_GREEN触发状态跃迁事件。# utils/traffic_state_parser.py def parse_frame_detections(dets: np.ndarray, frame_id: int) - List[SignalState]: dets: (N, 6) array, [x,y,w,h,conf,class_id] 返回按灯组分组的 SignalState 列表含 state_code, lane_mapping, timestamp # 步骤1按坐标聚类简化版 DBSCAN用欧氏距离阈值 groups cluster_by_position(dets[:, :2], eps150) states [] for group in groups: # 步骤2取 group 内最高置信度的检测 best_det group[np.argmax(group[:, 4])] state_code CLASS_TO_STATE[int(best_det[5])] # 步骤3绑定车道映射查表 traffic_lane_mapping.csv lane_id map_bbox_to_lane(best_det[:4]) states.append(SignalState(state_code, lane_id, frame_id)) return states3.2 相位逻辑层状态序列 → 合法相位判断单帧状态无法判定通行权。例如直行绿灯亮时左转箭头红灯也亮此时左转车辆禁止通行。规则引擎读取config/phase_rules.json该文件按国标 GB5768.2-2022 第 4.3 节定义{ phase_1: { name: 主路直行, allowed_states: [S_GREEN, S_GREEN_ARROW], forbidden_states: [S_RED, S_YELLOW], lanes: [L1, L2] }, phase_2: { name: 辅路左转, allowed_states: [S_GREEN_ARROW], forbidden_states: [S_RED_ARROW, S_OFF], lanes: [L3] } }引擎核心是TrafficRuleEngine.run()它维护一个滑动窗口默认 5 帧对每个车道检查当前帧状态是否在allowed_states中过去 3 帧是否存在forbidden_states防误触发状态跃迁是否符合phase_transition_matrix如 phase_1 → phase_2 合法phase_1 → phase_1 不合法。3.3 规则校验层输出结构化决策 可追溯依据最终输出不是布尔值而是带证据链的 JSON{ frame_id: 1247, decisions: [ { lane_id: L1, allowed: true, reason: S_GREEN detected in phase_1, no forbidden state in last 3 frames, rule_ref: GB5768.2-2022_4.3.1, confidence: 0.92 } ], warnings: [L3: S_OFF detected for 5 consecutive frames, possible fault] }rule_ref字段直接关联国标条款方便审计warnings区域记录异常如灯灭超时触发运维告警。该设计让算法决策可解释、可回溯、可审计——这正是交管系统上线的硬性要求。4. 数据集构建与标注规范为什么 labelme 标注后必须过validate_traffic_labels.py4.1 交通专用标注四原则通用目标检测标注如 COCO不适用于信号灯原则1灯组标注而非单灯一个物理信号灯含红黄绿三灯但标注时视为一个实例class_id0bbox 包络整个灯壳原则2箭头灯单独类别red_arrow与green_arrow必须分开设为 class_id3/4因国标规定箭头灯与圆灯相位独立原则3灭灯必须标注off类别class_id5不可省略否则规则引擎无法识别故障原则4遮挡处理当灯被树枝/广告牌遮挡 30%标注为occluded属性非新类别并在traffic_dataset.yaml中启用augment: occlusion。4.2 labelme 转 YOLO 格式三步清洗流程labelme导出的 JSON 需经清洗才能喂给 YOLOv8。我们提供tools/labelme_to_yolo.py强制执行坐标归一化校验检查所有 bbox x,y,w,h 是否 ∈ [0,1]越界则截断并打印警告行号类别映射强制转换将 labelme 的red→0green_arrow→4未定义类别报错退出灭灯样本增强对class_id5的样本自动复制 3 份并添加高斯噪声模拟夜间低照度写入images/off_aug/。# 执行清洗假设 labelme JSON 在 datasets/labelme/ python tools/labelme_to_yolo.py \ --input_dir datasets/labelme/ \ --output_dir datasets/yolo/ \ --classes red,yellow,green,red_arrow,green_arrow,off \ --img_size 6404.3 避坑常见标注错误与排查方法现象 → 原因 → 解决现象训练 loss 下降但 val mAP 停滞在 40% 以下原因标注中混入大量red和red_arrow重叠框人工误标模型学到“只要红就标红灯”忽略箭头语义解决运行tools/check_overlap_labels.py自动检测 IOU0.7 的同类重叠框生成overlap_report.txt并高亮问题帧人工复核。现象推理时某路口频繁误判S_OFF原因该路口夜间关闭信号灯但标注时将全黑帧标为off而训练集其他样本均为日间模型将“低亮度”误认为灭灯特征解决在datasets/yolo/train/images/下新建night/子目录将夜间样本移入并在traffic_dataset.yaml中为night/设置独立mosaic: 0.0和hsv_h: 0.0禁用色彩扰动。现象规则引擎输出allowed:false但人工确认应放行原因traffic_lane_mapping.csv中车道 ID 与实际物理位置错位如 L1 标为左转道实为直行车道解决运行tools/validate_lane_mapping.py --video_path test_videos/cross1.mp4它会抽取 100 帧用检测框中心点聚类输出各聚类对应推荐 lane_id与 CSV 逐行比对。现象ONNX 模型在 CPU 上推理结果全为 background原因导出 ONNX 时未设dynamicTrue导致输入 shape 固定为[1,3,640,640]而推理代码传入[1,3,480,640]非正方形解决修改export_onnx.py确保imgsz传入列表[640,640]且 ONNX Runtime 加载时指定providers[CPUExecutionProvider]禁用 GPU。现象训练时 GPU 显存 OOM即使 batch_size1原因train.py中rectTrue开启矩形推理但部分图像宽高比极端如 1920×108导致 padding 后尺寸达 1920×1920解决在ultralytics/yolo/data/dataloaders.py中修改rect逻辑限制 max_dim1280“if rect: img letterbox(img, new_shape(1280, 1280))[0]”。5. 高分项目落地技巧如何用这套资源拿下课程设计/毕设答辩5.1 三分钟讲清技术深度聚焦“规则引擎”这个差异化模块答辩时评委最怕听到“我用了 YOLOv8”。你要立刻切到别人没有的模块规则引擎。准备一张对比图PPT 中维度普通 YOLOv8 项目本项目输入单帧图像连续帧序列默认 5 帧输出[x,y,w,h,class_id]{lane_id, allowed, reason, rule_ref}核心创新无基于国标的相位转移矩阵 灭灯故障检测逻辑可验证性mAP 数值输出 JSON 中rule_ref可查国标原文讲稿话术“老师您看这个rule_ref: GB5768.2-2022_4.3.2它对应国标第 4 章第 3 节第 2 条——‘左转箭头绿灯亮时直行红灯必须同步亮起’。我们的引擎不仅检测灯更在执行标准条款。这是交管系统上线的必要条件也是我花两周手写phase_transition_matrix.py的原因。”5.2 答辩演示必做三件事实时视频流演示用demo/realtime_demo.py接 USB 摄像头界面左侧显示原始视频右侧显示检测框红/黄/绿/箭头不同颜色底部滚动条L1: ✅ ALLOWED (S_GREEN) | L3: ⚠️ OFF (5f)右上角当前帧rule_ref条款高亮点击弹出国标 PDF 片段故障注入测试在演示中手动遮挡一个灯观察warnings区域是否 3 秒内出现 “L3: S_OFF detected...”证明故障识别能力。对比实验截图准备两张图图 AYOLOv8n 原模型在雨雾视频中漏检黄灯标红圈图 B本模型正确检出标绿圈且规则引擎输出allowed:false因黄灯后必须停。5.3 文档撰写避坑指南不要写“本文实现了…”改写为“本系统输出结构化决策字段rule_ref直接映射至《GB5768.2-2022》条款满足交管系统可审计性要求”算法描述禁用伪代码用 Python 函数签名替代如def validate_phase_transition(current_state: str, history: List[str]) - bool:致谢部分明确标注在文档末尾写“本项目交通规则逻辑参考《GB5768.2-2022》第 4 章数据集采集获 XX 路口管理处授权”体现合规意识。从那以后我每次做交通类项目都强制走一遍tools/validate_lane_mapping.pytools/check_overlap_labels.py哪怕只用 3 分钟。因为答辩时评委问“你们怎么保证车道映射准确”我能立刻打开终端回放校验过程——而不是翻 PPT 找截图。希望帮到你。本文还有配套的精品资源点击获取
返回列表