十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

交通灯检测未标注数据集获取与预处理实战指南

交通灯检测未标注数据集获取与预处理实战指南 简介目标检测是自动驾驶感知系统的核心技术之一而交通灯检测因地域信号灯样式差异大、标注规范不统一对数据集的灵活性和多样性提出了更高要求。公开的标注数据集往往存在场景局限、授权限制等问题未标注原始数据反而成为构建自定义数据集的关键资源。BDD100K、Waymo、nuScenes等自动驾驶数据集中的原始视频流以及LISA、Bosch、TT100K等学术数据集的原始图像均可提取大量未标注数据用于自监督预训练、区域适配和自定义标注。本文系统梳理了从数据来源筛选、抽帧去重、场景清洗到标签体系设计、标注工具选型的完整实操路径并针对YOLO系列模型训练中常见的负样本不足、同源泄漏等问题给出避坑建议帮助工程师和学生高效构建交通灯检测数据集。 做交通灯检测这个方向也有一段时间了前前后后帮团队处理和整理过好几批交通灯数据。最近不少同行问我网上能直接下的交通灯数据集到底哪些是带原始未标注文件的想拿去做预训练或者适配特定区域。这篇文章就把我踩过的坑和验证过的路子整理一下全是实操内容。先说个背景。交通灯检测在自动驾驶和辅助驾驶系统里属于基础感知能力但它的数据问题比车辆、行人检测更麻烦。车辆和行人的公开数据集已经很成熟拿来就能训交通灯涉及不同地区的安装规范、信号灯排列方式、颜色映射关系公开数据集又分散在各个学术机构手里应用起来总有一种“差一口气”的感觉。所以很多人最后都走上同一条路自己找未标注数据然后按自己的需求处理。这就体现出“未标注过的数据集”的价值了。这篇文章适合谁看如果你是正在做交通灯检测、信号灯状态识别、智能路口项目或者想给YOLO系列模型配一套自定义交通灯数据的工程师和学生下面的内容应该能帮你节省大量找数据的时间。1. 为什么大家都在找“未标注”的交通灯数据1.1 已标注数据集看着多真用起来全是限制我先聊聊为什么已有的公开“标注数据集”不能无脑直接用。公开数据集确实不少比如LISA、Bosch、TT100K、BDD100K、Waymo这些规模从几千张到几十万张不等看起来选择很多。但真拿到项目中你会发现几个很现实的问题。一是样式差异。不同国家和地区的交通灯安装方式完全不一样。美国很多灯是横排欧洲和中国有大量竖排灯信号灯的颜色排列顺序、灯罩大小、箭头形式也千差万别。一个在德国采集的交通灯数据集放到中国路口做测试误检率和漏检率会高得离谱。二是标注规范不统一。有些数据集把整个灯板看作一个目标有些只标发光的灯芯有些把所有箭头统一成一类有些则拆成左箭、直行、右箭、调头等十几个类别。一旦你要把多个数据集合并训练光是类别映射表就能让你调一整天。更麻烦的是标注框粒度不一致会直接影响模型输出头的设计。三是授权和商用问题。很多学术数据集只是允许研究使用商用要求签订额外协议甚至根本不放开。下载一个数据集前光看许可协议就可能劝退你。既然已有的“标注数据”不能放心用那“未标注数据”反而成了绕开这些限制的切入点因为它完全由你自己掌控想怎么标、标什么类别、是否商用自主权都在你手里。1.2 未标注数据到底能拿来做什么很多人把未标注数据理解成“需要花时间去标注的原始图”这是被动的理解。换个角度想未标注数据本身就是一种资产至少有五个用途。第一大规模预训练。你可以拿几万张甚至几十万张行车影像做自监督预训练或对比学习让骨干网络先学习“路面、车辆、行人、信号灯、天空”这类基础视觉语义之后再用少量标注数据微调小样本场景下提升明显。第二区域适配。比如你的车要在中国某几个城市跑但公开数据集多是欧美场景。你只需要采集或下载这些城市的未标注行车视频做主动学习或者伪标签生成就能把模型往目标区域方向拉一把不需要一张张人工标注。第三自定义标注。这是最直接的用法。自己定标签词典自己定框粒度甚至可以把“灯板”和“颜色状态”拆开标完全匹配你后端的决策逻辑。第四负样本扩充。未标注视频里有大量不含交通灯的帧比如前车尾灯、路侧广告牌、反光点这些帧是天然的难例负样本。用它们压制误检非常有效。第五模型评测。拿未标注的连续视频流直接跑推理统计每秒误检率和漏检率比拿标注集计算mAP更接近真实部署体验。这些用途决定了“未标注”不是半成品而是比标注数据更原始、更灵活、可用面更广的一手资源。2. 未标注交通灯数据的几个主要来源2.1 综合自动驾驶数据集里的“原始层”很多大型自动驾驶数据集真正供下载的不只是那几万张标注好的图片而是完整的“原始数据包”或“采样视频”。交通灯数据就可以从这些原始层里挖出来。我常用的几个来源BDD100K伯克利发布的驾驶视频数据集包含约10万段行车视频每段约40秒。官方标注是单独下发的所以原始视频流本身属于“未标注”状态。Waymo Open Dataset超过1000个驾驶场景每个场景约20秒5个高清相机覆盖不同视角。原始传感器数据权限开放后你可以直接提取任意一帧的原始相机图像。nuScenes覆盖波士顿和新加坡的1000个场景每个场景约20秒环视相机原始图可以按需导出。两个城市的交通环境差异很大对地域泛化测试很有价值。KITTI年代虽久但raw data开放得很彻底不少人做交通灯检测的老论文就是从KITTI原始视频里自己切帧的。需要提醒一句这些数据集虽然给你未标注原始数据但授权协议仍然存在下载前要看清楚研究条款和商用条款。下载量通常很大需要耐心。2.2 专用于交通灯识别的学术数据集拆出未标注部分专门做交通灯识别的学术数据集其实很多都不是只给裁剪好的小块图而是“完整场景图 独立标注文件”的结构。这类数据集的原始图天然就是未标注状态。拿几个典型的来说LISA Traffic Light Dataset美国圣迭戈的路口视频和场景图标注是独立文件你可以只用原图Bosch Small Traffic Lights Dataset德国市区场景原图是完整前视行车画面标注为xml文件单独给TT100K清华和腾讯的街景全景图本身就是未标注原图标注框单独提供LaRA Traffic Light Recognition Dataset法国的城市道路视频标注与视频文件分离。这类数据集的优势是场景集中、画质稳定、目标都是交通灯专门用来做算法调参和预训练非常好。缺点是总量有限整体规模不大要靠它们撑起一个百万级数据训练不太现实。2.3 行车记录视频与街景图源如果你想覆盖更多天气、光线和区域差异第三类来源是公开的行车记录视频和街景图源。这个方向操作空间最大但约束也最多。常见的做法有开放街景平台例如Mapillary有大量街道级图片。可以通过公开接口按区域、关键词筛选下载原始jpg。街景图包含大量交通灯信息尤其城区路口分布密集。行车记录仪爱好者在公开平台发布的原始视频选择创作共用授权或可商用授权的片段自己抽帧。有条件的团队会用自己采集车或者众包设备录制目标城市的路口视频这是最理想的数据来源完全无版权问题。实操心得街景数据要按经纬度网格做去重否则同一条街每隔几米拍一张训练集严重冗余模型对那条街严重过拟合。行车记录视频则优先选无强后期调色、无平台水印、镜头干净的片段这类视频抽帧出来质量最高。2.4 用模拟器生成无标注图像现实世界数据凑不齐的极端场景比如大雪、夜间强逆光、低照度、特殊视角可以通过仿真引擎补。常用工具有CARLA、AirSim还有人用GTA V的Mod生成。以CARLA为例它是开源的自动驾驶仿真器你可以自由放置交通灯、控制天气和时段、调节车流密度输出任意相机位姿的RGB图像。只要你不保存官方提供的语义分割层或GroundTruth层输出就是未标注的原始图而且生成数据的版权由你掌握商用没有任何负担。经验之谈模拟器生成数据时一定不要偷懒用固定视角。同一个路口把相机高度、偏航角、俯仰角、光照条件全部随机化多样性才够。不然模型会对渲染视点过拟合真实场景一到就“见光死”。合成数据更适合作为辅助数据和真实数据混合使用。3. 主流交通灯数据集逐个拆解规模、结构与获取方式3.1 BDD100KBDD100K是目前最综合的驾驶视频数据集之一。它提供了约10万段行车视频每段约40秒总时长超过1000小时。官方单独下发的标注文件主要是目标检测框但视频流本身不包含标注。这意味着你可以只下载video部分不下载带标注的image包直接获得海量未标注数据。值得说的是它的场景覆盖面城区、高速、居民区、晴天、阴天、雨天、雪天、白天、黑夜基本都有。交通灯目标在画面中属于中小目标但不至于特别难找。获取方式上需要先到官网注册说明用途官方会给你下载脚本。视频包体量很大建议按区域子集下载不要一次全拉。我用的时候是分段下载校验完MD5再解压避免因为网络中断导致压缩包损坏。3.2 Waymo Open DatasetWaymo的数据集感知质量是最高的那一档。1000多个驾驶序列每个序列约20秒5个高清相机覆盖前视、前侧方、后侧方等视角原始画面分辨率在1920x1280左右画质比BDD100K细腻很多。官方提供“raw sensor data”下载标签单独提供原始相机图属于未标注状态。需要注意Waymo的数据格式不是普通jpg/png而是TensorFlow Record格式需要配合官方工具包解析提取图片。如果不熟悉这个流程前半小时多半在处理“装依赖、解数据”的问题上预留一些时间。许可协议方面注册下载时必须签署条款商用限制和BDD不同要仔细阅读。如果只是算法研究或者毕设问题不大。3.3 nuScenesnuScenes是另一个重量级开源数据集覆盖波士顿和新加坡两个城市各1000个场景左右每个场景约20秒。它的多相机环视系统能捕捉车辆周围360度的画面前视相机清晰度较高可以看到远处的交通灯状态。交通灯样式上新加坡的灯和北美、欧洲、中国差异很大经常在同一个门架上挂着多个灯组颜色深浅和箭头形状也有区别。如果你要用nuScenes的未标注数据做域泛化测试这个对比能暴露很多模型在“没见过”的路口上的表现。获取方式是注册后在官网下载有mini版和full版。第一次建议先下mini版验证整个解析流程再把full版拉下来。3.4 LISA Traffic Light DatasetLISA数据集来自加州大学圣迭戈分校是较早发布的交通灯检测数据集。它包含圣迭戈多个路口的视频序列、完整场景图和独立的标注文件。标注状态信息很细分包括红、黄、绿、左箭头、右箭头等这对后续细粒度识别人很有吸引力。原始图片是传统摄像头拍摄分辨率不高但好处是标注文件与图片完全分离你完全可以只使用未标注原图。数据规模不算大但覆盖面集中在真实路口且包含多个形态的交通灯适合做小规模快速迭代。3.5 Bosch Small Traffic Lights Dataset博世发布的德国交通灯数据集最大的特色是目标非常小。很多交通灯在画面里只有几十个像素甚至几个像素相当考验小目标检测能力。原图是完整行车前视画面标注为xml文件单独提供未标注原图可以直接获取。整个数据集量级不大约5000多张图片1万多个标注框但其中包含大量远距离、小尺寸、低照度下的交通灯样例对小目标检测算法的调优价值很高。特别提醒德国的交通灯外形、灯板和背板颜色与中国、美国差异明显。直接用这个数据集训练再部署到国内路口效果会打折扣适合作为难例补充集而不建议作为主训练集。3.6 TT100KTT100K是清华和腾讯联合发布的街景数据集包含约10万张全景图覆盖多个中国城市。交通灯标注框单独提供原始全景图本身就是未标注数据。全景图分辨率非常高一张图能到几千乘几千像素但交通灯目标在整幅图里占比很小通常需要把全景图切块patch后训练否则直接缩放到小分辨率会丢失目标。这个数据集是国内交通灯场景覆盖度很高的选择尤其适合训练和验证针对中国路口的检测模型。未标注原图可以从官方渠道申请下载数据量较大预先规划存储空间。3.7 LaRALaRA数据集来自法国包含8段城市行车视频和对应的标注信息。它的内容规模不大只有几万帧但视频画面相对干净对欧洲风格的信号灯形态有代表性。标注以掩码形式给出如果你只想用原始视频帧标注文件可以完全不理会。这个数据集现在用得没那么多了主要是因为规模小、年代比较早。但如果你需要补充欧洲风格交通灯样本它可以作为一个小而专的补充来源。3.8 CARLA合成数据灵活度最高的其实是CARLA。在CARLA里配置一个或几个路口设置不同天气、时间、车流密度然后用相机传感器采集RGB图像。默认输出就是未标注图像除非你额外启用了标签保存。我实践时的配置思路是三四个不同风格的路口模型每个路口跑若干遍每次随机改变天气参数、时段、相机偏航角、车辆速度最终能稳定生成几万张带多样性的真实感图像。配合真实未标注数据混合训练对夜间、雨天场景的提升比较明显。4. 拿到未标注数据先做的四步预处理4.1 抽帧别一上来就用所有帧视频数据拿回来第一步是抽帧。但不要一上来就按25fps或30fps全量抽交通灯状态变化不会那么快相邻帧高度相似全量抽帧只会浪费存储和训练时间。我一般按1fps到2fps抽如果视频场景变化剧烈可以适当提高到5fps。用ffmpeg操作很简单ffmpeg -i input_video.mp4 -vf fps1/2 -q:v 2 -start_number 0 output/frame_%05d.jpg这里“fps1/2”表示每2秒抽一帧。如果针对的是夜间或高速路段可以调成“fps1”。抽完帧后可以再用SSIM或直方图计算相邻帧相似度把相似度高于0.95的帧再次剔除进一步降低冗余。4.2 场景去重避免同一条路反复出现直接对抽帧结果训练会遇到一个隐蔽的问题同一路口在不同时间被反复拍到看起来数据量巨大实际多样化程度很低。甚至同一辆车停在同一个红灯下几秒内抽出来的十几帧在视觉上几乎一模一样。建议给每张图计算感知哈希pHash再根据哈希距离做去重。哈希汉明距离小于8可以认为视觉高度相似直接剔除一张。一个简单的Python示例import imagehash from PIL import Image import os hash_dict {} for img_path in sorted(os.listdir(frames)): h imagehash.phash(Image.open(fframes/{img_path})) similar False for existing_hash in hash_dict.values(): if h - existing_hash 8: similar True break if not similar: hash_dict[img_path] h如果你数据来自街景图源最好同时用GPS坐标做网格去重同一条街每隔几十米只保留一个采样点。这个步骤能显著提升数据集的“有效多样度”。4.3 清洗把“没有灯”和“看不清灯”的帧过滤掉过滤掉“无交通灯”的帧是整个流程里最容易低估工作量的环节。如果直接拿所有未标注帧开标你会发现不少视频帧里压根没有交通灯标注人员会在一堆无意义背景上浪费时间。我的做法是先用一个现成的交通灯检测模型对全量图像做一次粗推理只保留模型“有置信度检测到疑似交通灯”的帧。模型可以是之前训练过的YOLO也可以用公开的检测模型。置信度阈值不要设太高0.1到0.2就够目标是召回尽量全面的候选帧宁可多留一些假阳也不要漏掉难例。清洗之后再把光照异常、极度模糊、严重过曝的帧挑出来扔掉。交通灯检测本身就对光照敏感如果训练集里充满无法判断的红黄绿噪点模型会学到很多噪声特征。4.4 划分数据集时别犯同源泄漏的错误数据划分是一个老生常谈但很容易翻车的环节。很多人直接对全量图像随机打散划分train/val/test这会导致同一个视频短片段里的帧同时出现在训练集和验证集中。正确的操作是分别按“视频片段”或“街景采集路段”作为最小单位去划分。比如把BDD100K按视频文件名分组或者把街景按经纬度路段分组保证同一来源的数据尽量只出现在训练集或验证集中的一个。同时还要注意天气和时段的分布。训练集全放晴天白天、验证集全放夜间雨天这种划分只会让你怀疑模型是不是太脆实际上只是数据分布不匹配。5. 自己标注一套交通灯数据最省心的流程5.1 标注工具选型未标注数据清洗完成之后就是标注环节。选对工具能省一半力气。我的推荐是小规模数据几百到一两千张LabelImg免费、单机可用支持Pascal VOC和YOLO格式导出适合快速灵活标注。中大规模数据几千张以上CVAT网页版支持多人协作能管理标注任务支持自动跟踪插值。尤其适合视频序列抽帧数据第一帧标好后后续帧自动补框人工微调就行。如果团队对隐私要求高不想传第三方平台CVAT也可以做私有化部署数据不出内网。我实际使用最多的还是CVAT。原因是交通灯标注里很多是连续视频帧目标位置变化不大用跟踪模式能自动生成相当部分候选框效率明显更高。5.2 标签词典怎么定交通灯检测的标签体系决定了模型最终能输出什么。只标一个“traffic_light”最简单但训练出来的模型只能告诉你哪里有交通灯不能告诉你现在是什么灯色对后端决策帮助有限。我的建议是最低限度分为三类redyellowgreen如果业务需要识别箭头可以再增加red_leftgreen_leftred_rightgreen_right另可增加一个off熄灯类别用于处理故障灯或不亮状态。类别数量不要一上来就搞十几个尤其数据量不够时类别细分会加剧样本不均衡降低模型精度。数据量低于5000张时先按红黄绿三态标注即可。5.3 框粒度框灯板还是框灯芯交通灯标注最常见的争议是框整个灯板还是框单个灯芯。两种方式各有取舍框灯板目标更大更容易检测但颜色状态信息丢失后端还得依赖图像裁剪二次判断颜色框灯芯状态信息直接绑定目标但灯芯通常很小对检测器的小目标能力要求很高我的推荐是“灯板框 状态标签”也就是框住整个灯板类别用红/黄/绿状态表示。这样目标大小适中类别又能体现信号状态整体最均衡。如果两个灯板挨得非常近不要把它们合并成一个框。合并大框会把多个不同状态的灯塞进同一个目标造成类别歧义训练时模型会困惑。5.4 质检流程不能省标注完成后至少要做两轮质检。第一轮是机器质检写脚本检查标注框是否越界、类别是否合法、目标面积是否过小。这里有一个常见坑某些标注工具导出时会把坐标归一化到0到1不同数据集合并时容易搞混绝对坐标和归一化坐标脚本里务必校验一遍。第二轮是人工抽检随机抽10%到20%的图重点看夜间、雨天、逆光场景下的状态标签是否正确。我见过一个团队因为夜间红色交通灯和前车尾灯混标模型误检率怎么调都下不去。如果数据里前车尾灯出现频率高一定要单独收集一批“红灯误检”的负样本帧加入到训练集抑制误报。6. 常见问题与避坑速查6.1 问题速查表现象可能原因解决办法下载的视频包或图片包文件损坏浏览器断点续传不稳定用命令行下载工具下载后校验MD5哈希未标注图片和标注文件时间戳对不上数据集版本不一致对比官方校验文件重新下载对应版本验证集mAP高但实测路口掉点明显数据划分泄漏或场景单一按视频序列/路段划分增加天气和时段多样性模型把红色尾灯当红灯负样本太少训练集缺少尾灯场景单独收集前车尾灯/刹车灯负样本加入训练夜间远距离小交通灯漏检目标过小输入分辨率不够提高输入分辨率或者用SAHI切图检测小目标CARLA合成数据训完真实场景效果差渲染域和真实域差异大用真实未标注数据做域适应合成数据只作为辅助数据集总类特别多但有效帧很少过于追求全量下载未按场景筛选先跑粗检测模型过滤用有效数据量评估充足度6.2 关于“最全”的误解很多人以为“全”就是把网上能搜到的公开数据集全部下载一遍堆成一座数据大山。我踩过这个坑之后现在更认同的观点是交通灯检测项目的瓶颈往往不是总量不够而是有效数据不够。什么叫有效简单说就是“交通灯目标清晰可辨、场景分布合理、与你目标部署区域匹配度高的帧”。如果下载回来的数据100%都跟你目标城市道路风格不一致那再大也无济于事。收集数据之前先花一点时间明确你的车主要跑什么道路什么天气什么时段然后按这个图谱去筛选数据源。还有一个很容易被忽视的问题就是下载数据的版权状态。数据集的下载页面通常都会说明授权类型比如Apache License 2.0允许比较宽松的使用CC BY-NC则限制商业用途还有一些数据集只开放给学术单位内部申请。如果你打算商用在下载前就必须确认清楚别等模型都上线了才发现授权不合规。这个环节没办法靠技术绕过去只能老老实实看条款。6.3 几个能提升效率的小习惯最后分享几个我在实际操作中积累的小习惯数据文件命名尽量带上来源和场景标识比如bdd_rain_night_0001.jpg后续排查问题时能一眼看出这张图来自哪个批次每一批未标注数据都做一个数据目录文件记录来源、时间范围、天气、路段和清洗状态虽然前期多花一点功夫后期调试模型和写复盘报告都省事抽帧后先跑一个快速的预检测模型把“疑似交通灯”帧和“无交通灯”帧分流前者进标注流水线后者统一归档成负样本池这样能避免标注人员在不含目标的高占比帧上浪费时间对连续视频序列记得记录原始时间戳方便后续做伪标签时序平滑和多帧融合。最后再分享一点体会我在实际项目中最大的感受是找未标注数据本身并没有多复杂麻烦都在后面的筛选和治理上。你可能花两周时间下载和整理一批数据最终真正进入模型的可能不到三分之一这是常态。与其拼命堆数据量不如花时间把每一批数据的来源、场景标签、时间天气信息都记录下来形成自己的数据资产目录。后续你每次调模型、剖析误例、做数据集迭代都能从这里快速找到线索比临时翻原始文件高效得多。另外补充一个小技巧如果你手头有已标注的少量数据不妨先训练一个粗略的交通灯检测模型然后把所有未标注的图批量推理一遍把高置信度预测框导出成“伪标签”供人工快速确认。这种方式比从零开始框选要快不少特别是在连续视频抽帧场景下标注效率能提升一倍以上。交通灯检测的数据工作没有太多捷径但只要方法对完全可以少走很多弯路。本文还有配套的精品资源点击获取
返回列表