交通灯检测数据集构建与应用:从数据清洗到YOLO/MMDetection模型训练全流程

发布时间:2026/9/3 5:47:11
交通灯检测数据集构建与应用:从数据清洗到YOLO/MMDetection模型训练全流程 简介本资源是一个面向智能交通与计算机视觉初学者的交通灯目标检测专用数据集适用于YOLO、Faster R-CNN等主流检测模型的训练与验证。数据集基于真实车载影像采集涵盖红、黄、绿及未亮四种状态的交通灯样本已统一转换为标准COCO格式开箱即用显著降低数据预处理门槛。压缩包共含2000个文件主体为1996张JPEG图像含标注的2226张与无标注的45张辅以2个Python工具脚本支持JSON合并与按比例拆分及2个关键标注文件train.json/eval.json整体大小658.84MB。目录结构清晰按images、annotations、code、img_without_anno分层组织便于快速定位训练/验证子集与扩展未标注数据。目前已有92人学习下载配套脚本与完整标签统计如训练集含红灯1304例、绿灯1744例等可直接支撑模型训练、类别平衡分析与泛化能力评估。1. 项目缘起为什么我们需要一个专门的交通灯检测数据集在计算机视觉和自动驾驶领域目标检测是一个基础且核心的任务。我们见过太多关于车辆、行人、交通标志的数据集比如大名鼎鼎的COCO、PASCAL VOC还有专门针对自动驾驶的KITTI、Cityscapes。但当我真正着手去做一个城市道路场景下的感知项目时发现了一个尴尬的缺口交通灯。是的就是那个每天开车都会遇到无数次红黄绿三色的小东西。你可能觉得交通灯检测不就是目标检测吗用YOLO、Faster R-CNN训一个不就行了一开始我也是这么想的直到在实际项目中碰了一鼻子灰。通用数据集里的交通灯样本太少而且形态、光照、背景极其单一。你训出来的模型在晴朗白天、正面视角下可能表现还行一旦遇到傍晚逆光、雨天玻璃反光、侧面视角、或者远处的小灯误检和漏检率就高得离谱。更别提有些地区的交通灯是横向排列的有些是竖向的有些是圆形有些是箭头形还有读秒倒计时牌。这种场景的多样性和复杂性不是一个通用数据集能覆盖的。这就是我决定整理并分享这个“交通灯检测数据集-zip”的初衷。它不是一个从零开始标注的巨型数据集而是一个经过清洗、筛选、格式统一和增强的“弹药包”。里面汇集了从多个开源渠道获取的、包含交通灯的图像和视频帧并全部转换成了主流的Pascal VOC或COCO标注格式。目的是让研究者、开发者尤其是那些正在做自动驾驶、高级辅助驾驶ADAS或者智慧交通项目的朋友能有一个质量相对可靠、场景相对丰富的起点快速验证算法原型省去前期繁琐的数据收集和整理时间。2. 数据集内容深度拆解里面到底有什么这个ZIP包解压后绝不是一堆胡乱命名的图片和文本文件。为了确保实用性我按照一个标准数据集的目录结构进行了组织并尽可能补充了元信息。下面我们一层层来看。2.1 核心文件结构与格式traffic_light_dataset/ ├── images/ │ ├── train/ │ │ ├── day_clear_001.jpg │ │ ├── day_rain_002.jpg │ │ ├── night_001.jpg │ │ └── ... │ ├── val/ │ └── test/ ├── annotations/ │ ├── train/ │ │ ├── day_clear_001.xml # Pascal VOC格式 │ │ ├── day_rain_002.xml │ │ └── ... │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ │ ├── day_clear_001.txt # YOLO格式 (可选) │ │ └── ... │ └── ... ├── dataset_meta.yaml └── README.mdimages/: 存放所有图像文件并按训练集train、验证集val、测试集test划分。划分比例大致为7:2:1。图像来源多样包括行车记录仪、公开自动驾驶数据集如BDD100K、ApolloScape的截取、以及部分模拟器如CARLA生成的图像。annotations/: 这是核心之一存放Pascal VOC格式的XML标注文件。每个XML文件对应一张图片包含以下关键信息filename: 图像名称。size: 图像的宽度、高度和通道数。object: 每个检测目标。对于交通灯我们进一步细化了属性name: 类别标签。这里不是简单的“traffic_light”而是更精细的例如tl_red,tl_green,tl_yellow,tl_red_left,tl_green_arrow等。区分颜色和方向对于自动驾驶决策至关重要。bndbox: 目标的边界框坐标 (xmin, ymin, xmax, ymax)。difficult和truncated: 标记困难样本和被截断的样本这在模型训练中可以作为权重参考。attributes(扩展): 部分样本添加了自定义属性如occlusion遮挡程度012、time_of_dayday, night, dusk。labels/: 为了兼容YOLO等需要TXT格式的框架提供了转换好的标签文件。每行格式为class_id center_x center_y width height坐标是相对于图像宽高的归一化值。dataset_meta.yaml: 一个配置文件用YAML格式清晰定义了数据集的元信息这是很多现代训练框架如MMDetection, Detectron2推荐的做法。内容示例path: /path/to/traffic_light_dataset train: images/train val: images/val test: images/test nc: 6 # 类别数量 names: [tl_red, tl_green, tl_yellow, tl_red_left, tl_green_arrow, tl_off] # 类别名称列表这个文件极大方便了数据集的加载和配置管理。2.2 数据集的场景覆盖与挑战性一个数据集的价值很大程度上取决于它覆盖的 corner cases边缘案例有多广。在整理时我特别注重纳入以下具有挑战性的场景光照与天气变化强光与逆光正午阳光直射导致灯罩过曝变成一片白色亮斑颜色信息几乎丢失。低光照与夜间夜间图像噪声大交通灯本身是光源与背景的对比度模式与白天完全不同。刹车灯、路灯、广告牌等光源极易造成干扰。恶劣天气雨滴附着在相机镜头或灯罩上形成光晕和模糊雾天导致对比度下降。视角与尺度变化极端视角车辆在左转或右转车道看到的交通灯几乎是侧面甚至背面。此时灯框形状发生透视畸变。远距离小目标在宽阔路口或高速路入口交通灯在图像中可能只有十几个像素大小特征提取极其困难。遮挡被树木、电线杆、前方大型车辆部分或完全遮挡。目标本身多样性形态多样圆形灯、箭头灯、行人按钮灯、倒计时数字屏。状态多样亮灯红、黄、绿、熄灯状态。熄灯状态的检测同样重要因为自动驾驶系统需要知道“那里有个交通灯但它没亮”而不是“那里没东西”。排列多样竖向排列、横向排列、单独悬挂、与标志牌集成。在数据集中我通过文件名前缀或目录结构对部分场景进行了粗略分类如night_,rain_,occluded_方便使用者进行有针对性的数据采样或分析模型弱点。2.3 标注质量与一致性处理数据质量是模型的“天花板”。原始收集的数据标注标准不一我主要做了以下几项清洗和统一工作边界框校准对于模糊或标注粗糙的框我重新进行了审视和调整。交通灯的边界框应紧密贴合灯框包括黑色边框而不是只框住发光的灯芯。类别统一将来源数据中五花八门的标签如“red_traffic_light”, “signal_red”, “红绿灯-红”统一为预设的、简洁的类别名。难例标注对于上述提到的那些挑战性样本手动标记了difficult1。在评估时可以选择是否将这些难例计入mAP计算从而更细致地衡量模型性能。错误剔除删除了明显标注错误的样本例如框选了红色汽车尾灯、或者框选了非交通灯区域的红色物体。注意没有任何一个数据集是完美的。这个数据集虽然经过清洗但仍可能存在个别有歧义的标注。我建议你在使用前用可视化脚本比如用OpenCV或matplotlib画框随机抽查一部分特别是验证集和测试集感受一下数据的“质感”并建立对标注质量的信任。3. 如何使用这个数据集从下载到训练的全流程拿到数据只是第一步如何高效地用它来炼丹训练模型才是关键。这里我以最常用的YOLOv8PyTorch和MMDetection框架为例给出一个完整的操作路径。3.1 环境准备与数据放置首先假设你使用的是Linux系统并已安装好Python、PyTorch等基础环境。下载与解压# 假设你从网盘或代码仓库下载了文件 traffic_light_dataset.zip unzip traffic_light_dataset.zip -d /path/to/your/workspace/ cd /path/to/your/workspace/理解结构进入目录你会看到上一节描述的结构。确认dataset_meta.yaml文件中的path指向是否正确。你可以修改这个YAML文件或者更常见的做法是在代码中指定绝对路径。3.2 使用YOLOv8进行训练YOLOv8因其易用性和性能成为很多人的首选。它原生支持YAML格式的数据集配置。安装Ultralytics包pip install ultralytics准备数据集YAML文件你可以直接使用我提供的dataset_meta.yaml但需要检查路径。也可以新建一个traffic_light.yaml# traffic_light.yaml path: /path/to/your/workspace/traffic_light_dataset # 数据集根目录 train: images/train # 训练集路径相对于 path val: images/val # 验证集路径相对于 path test: images/test # 测试集路径可选 # 类别数 nc: 6 # 类别名称列表必须与 annotations/labels 里的 class_id 顺序对应 names: [tl_red, tl_green, tl_yellow, tl_red_left, tl_green_arrow, tl_off]开始训练一行命令即可启动。这里选择YOLOv8s模型它在精度和速度间有较好平衡。yolo detect train datatraffic_light.yaml modelyolov8s.pt epochs100 imgsz640 batch16data: 指定我们的数据集配置文件。model: 指定预训练模型使用yolov8s.pt能利用在COCO上的知识进行迁移学习加速收敛。epochs: 迭代轮数根据数据集大小调整100是一个常见的起点。imgsz: 输入图像尺寸。交通灯是小目标适当提高分辨率如640有助于检测但会增加计算量。batch: 批大小根据你的GPU内存调整。验证与测试# 使用训练好的最佳模型在验证集上评估 yolo detect val modelruns/detect/train/weights/best.pt datatraffic_light.yaml # 对单张图片进行推理 yolo detect predict modelruns/detect/train/weights/best.pt sourcepath/to/test_image.jpg3.3 使用MMDetection进行训练如果你需要更灵活的网络结构、更丰富的训练技巧MMDetection是工业界和学术界的另一个主流选择。步骤稍多但可控性更强。安装MMDetection请参照其 官方文档 进行安装。通常包括安装PyTorch、MMCV和MMDetection本身。数据格式转换MMDetection通常使用COCO格式或自定义数据集。我们需要将Pascal VOC格式转换为COCO格式。可以使用tools/dataset_converters中的脚本或者自己写一个简单的转换脚本。这里提供一个思路import xml.etree.ElementTree as ET import json import os from PIL import Image # 遍历所有XML解析并构建COCO格式的json字典 # 包括 images, annotations, categories 三个主要字段 # 注意需要将VOC的类别名映射到连续的id0,1,2...由于篇幅不展开完整代码。转换后你会得到一个instances_train.json和instances_val.json。配置模型MMDetection采用配置文件驱动。你可以找一个基础模型如Faster R-CNN、RetinaNet或Cascade R-CNN的配置文件修改其中的data_root、ann_file、img_prefix以及num_classes。# 在配置文件中修改数据部分 data dict( traindict( typeCocoDataset, ann_filedata/traffic_light/annotations/instances_train.json, img_prefixdata/traffic_light/images/train/, # ... 其他参数 ), valdict(...), # ... 修改类别数 modeldict( roi_headdict( bbox_headdict(num_classes6)), # 修改为你的类别数 ) )启动训练./tools/dist_train.sh configs/your_config.py 8 # 8卡训练 # 或单卡训练 python tools/train.py configs/your_config.py3.4 关键训练技巧与调参心得直接拿默认参数训练效果可能一般。针对交通灯检测这个小目标、多场景的任务有几个调参点值得关注数据增强Data Augmentation这是提升模型泛化能力的廉价且有效的方法。务必使用强增强。Mosaic和MixUpYOLOv8默认启用能有效提升小目标检测能力。随机透视变换Random Perspective模拟不同视角对应对交通灯的侧面、仰视等情况。色彩抖动HSV-Hue/Saturation/Value模拟不同光照和天气下的颜色变化对交通灯颜色识别至关重要。CutOut或RandomErasing随机遮挡图像部分区域提高模型对遮挡的鲁棒性。锚框Anchor优化交通灯通常是高大于宽的长方形。默认的锚框尺寸可能不匹配。建议在训练前在你的数据集上运行聚类算法如K-means重新计算锚框尺寸。YOLOv5/v8的代码库中通常有相关脚本。损失函数权重对于小目标可以适当增加分类损失或CIoU损失的权重让模型更关注小目标的定位和分类。多尺度训练Multi-Scale Training在训练时随机改变输入图像的尺寸如320到640之间让模型学会在不同尺度下检测目标。这对于检测远处的小交通灯特别有帮助。针对“难例”的过采样如果发现模型在夜间或雨天数据上表现差可以在训练数据加载时给这些类别的样本更高的采样概率让模型更多地“看到”它们。4. 模型评估与结果分析不只是看mAP训练完成后在测试集上跑出mAPmean Average Precision当然重要但绝不能只看这一个数字。对于交通灯检测这种安全关键型应用我们需要更细致的分析。4.1 构建一个全面的评估看板不要只满足于跑完yolo val后打印的那几行结果。我习惯做以下几件事按类别分析AP模型对tl_red、tl_green、tl_yellow的检测精度是否均衡有没有哪个颜色特别难检测通常红色和绿色由于对比度强可能比黄色和熄灭状态更好检。按场景分析将测试集按“白天/夜晚”、“晴天/雨天”、“遮挡/无遮挡”等维度划分分别计算各个子集上的mAP。这能精准定位模型的弱点。例如你可能会发现模型在夜间场景的mAP比白天低15个百分点这就指明了改进方向。误差分析利用工具如YOLOv8自带的验证结果图片或MMDet的分析工具查看哪些样本被误检或漏检。漏检False Negative是目标太小光照太暗被严重遮挡还是和背景太像误检False Positive是把刹车灯、广告牌红灯误认为交通灯了吗还是把同一个交通灯重复检测了多次4.2 可视化与定性评估数字是冰冷的图像是直观的。写一个简单的可视化脚本将模型预测框和真实标注框画在同一张图上特别是那些模型出错的图片。import cv2 import json def visualize_detections(img_path, pred_boxes, gt_boxes): img cv2.imread(img_path) # 用红色画预测框 (BGR格式: (0,0,255)) for box in pred_boxes: x1, y1, x2, y2, conf, cls box cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (0, 0, 255), 2) cv2.putText(img, f{cls}:{conf:.2f}, (int(x1), int(y1)-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2) # 用绿色画真实框 (0,255,0) for box in gt_boxes: x1, y1, x2, y2, cls box cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2) cv2.putText(img, fGT:{cls}, (int(x1), int(y1)-30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2) cv2.imshow(Result, img) cv2.waitKey(0)通过大量浏览这些可视化结果你能获得对模型性能最直接的“感觉”这种直觉对于后续调优和数据补充至关重要。4.3 性能与速度的权衡在自动驾驶的嵌入式平台上推理速度FPS和精度mAP同样重要。你需要根据应用场景做权衡红绿灯识别Traffic Light Recognition如果只是识别红绿灯状态可能不需要非常精确的边界框分类正确更重要。可以选用轻量级分类网络或单阶段检测器如YOLO Nano, MobileNet-SSD追求高帧率。高精地图众包或数据标注需要非常精确的边界框位置可能用于生成地图要素。这时精度优先可以选择更复杂的模型如Cascade R-CNN牺牲一些速度。在测试时务必在目标硬件如Jetson AGX Orin, NVIDIA DRIVE平台或模拟其算力的环境下测量FPS而不仅仅在强大的训练服务器上。5. 从数据集到实际应用还有哪些坑要填有了一个在测试集上表现不错的模型是不是就能直接上车了远非如此。实验室到现实道路隔着一条巨大的“仿真到现实”Sim2Real鸿沟。5.1 领域差异与持续学习你用的这个数据集可能主要来自中国、美国或欧洲的某几个城市。但不同国家、甚至不同城市的交通灯设计规范、安装高度、排列方式都存在差异。直接将模型部署到一个新城市性能必然下降。解决方案是持续的数据迭代主动收集在目标地区进行路采获取新的图像数据。主动学习Active Learning用现有模型对新数据做初步推理筛选出那些模型“不确定”的如置信度不高、不同类别分数接近、或者直接漏检/误检的样本交给人工进行标注。用最少的人工标注成本最大化提升模型在新领域的性能。领域自适应Domain Adaptation如果无法获得大量新标注数据可以尝试无监督或半监督的领域自适应方法让模型学习将源域原有数据集的知识迁移到目标域新城市数据上。5.2 时序信息与状态判定静态图像检测只是第一步。真实的交通灯是动态的有状态切换红-绿-黄。对于自动驾驶来说不仅要检测到灯还要判断其当前状态甚至预测其状态变化。这就需要引入时序信息多帧融合连续几帧的检测结果进行关联和滤波如卡尔曼滤波可以稳定检测框减少闪烁并利用历史信息判断当前状态例如连续5帧都是红色可以更确信是红灯。状态机模型为每个交通灯建立一个简单的状态机红-绿-黄-红利用时序检测结果来驱动状态转移可以纠正单帧的误分类比如某一帧因为反光被误判为绿色但前后帧都是红色则维持红灯状态。5.3 系统集成与工程化在一个完整的自动驾驶感知模块中交通灯检测器不是孤立的。它需要与目标检测模块检测车辆、行人以理解路口全局场景。车道线检测/高精地图模块知道当前车道对应的是哪个方向的交通灯是直行灯还是左转灯。这通常需要将图像中的2D检测框通过相机标定和投影变换关联到3D地图上的具体信号灯组。追踪模块对连续帧中的同一个交通灯进行ID关联维持其轨迹。此外工程上要考虑模型的轻量化、推理引擎的优化TensorRT, OpenVINO等、多模型流水线的延迟等问题。这些都是在数据集和模型训练之外需要投入大量精力的“硬骨头”。整理和分享这个数据集是希望为大家节省在数据准备上的重复劳动提供一个还算不错的基准。但我也必须坦诚它只是一个起点而非终点。实际应用中的挑战远超一个静态数据集所能涵盖。最好的模型永远是在真实世界的反馈循环中不断迭代进化出来的。希望这个“弹药包”能帮你更快地打出第一发子弹在实战中积累属于你自己的数据和经验。本文还有配套的精品资源点击获取