跑深度学习数据集的老朋友都知道第10625期这个编号一出来基本就能猜到内容方向又是一批自动驾驶感知相关的标注数据。但这次这套“红绿灯斑马线减速带”的三合一目标检测数据集我觉得值得单独拿出来聊一聊。原因很简单红绿灯、斑马线、减速带这三类目标正好对应了智能驾驶感知系统里最典型的三种需求——信号语义理解、道路边界先验、路面几何突变判断它们虽然都属于目标检测范畴但各自的标注逻辑、难易程度和实际部署中的坑完全不是一个量级。这篇博文我就结合这套数据集的实际情况把它的结构设计、标注规范、训练适配方案和我的实测经验一起拆开讲。无论你是在做辅助驾驶的感知方案、自动驾驶仿真验证还是单纯想找一个高质量的数据集来练手YOLO系列模型这篇内容应该都能给你一些参考。1. 数据集的整体定位与设计思路1.1 为什么偏偏是这三类目标先解决第一个问题红绿灯、斑马线、减速带为什么会被打包进同一个数据集我的理解是这三类目标恰好构成了一套“低速城区自动驾驶场景”的感知最小集。红绿灯解决的是“能不能走”的问题斑马线告诉系统“这里可能有行人横穿”减速带则提醒“前方路面有物理凸起需要控制车速和悬架状态”。它们不是替代关系而是协同关系。比如一辆车在靠近路口的场景中视觉感知模块通常需要同时输出红绿灯状态、斑马线位置、前方减速带提示才能做出比较完整的驾驶决策。单独训练三个模型当然可行但工程上维护成本高推理延迟也大。把这几个目标统一到一个模型里用同一套backbone做特征提取对算力受限的车载边缘设备来说明显更友好。从数据集命名来看它是按“第10625期”这样的编号序列发布的属于一种持续更新的数据集生产模式。这类数据集通常每隔一段时间就追加一批新的场景数据持续迭代的意义在于模型在真实道路上见过的场景越多对新路况的泛化能力越强尤其像红绿灯这种外观高度多样化的目标单靠几千张图片很难覆盖全。所以这套数据集的价值不只是当前的图片数量更在于它背后的持续积累机制。1.2 数据集的技术形态与适用范围我接触过的类似数据集YOLO格式基本是标配。标注文件是一个个txt文本每行代表一个目标框格式为class_id x_center y_center width height其中坐标值都是相对于图片宽高的归一化数值范围在0到1之间。这一期数据集遵循的就是这种标准格式意味着它可以无缝对接YOLOv5、YOLOv8、YOLOv9、YOLOv10等主流版本不需要额外写转换脚本。它的适用范围我总结为三类第一类辅助驾驶功能开发比如前向碰撞预警、路口辅助通行、限速提醒等第二类自动驾驶仿真训练在虚拟环境下测试感知模型对交通参与者的响应第三类学术研究比如小目标检测、复杂天气下的鲁棒性研究、夜间低光照检测等课题这三类目标都有非常典型的挑战。不过坦白说这套数据集的侧重点在城区道路车速一般不超过60km/h的场景覆盖会比较充足。如果你要做高速场景下的感知这套数据集中路面标志和信号灯的样本占比可能会不够需要另外补充。2. 标注细节与数据构建的关键经验2.1 三个目标的标注逻辑差异虽然同样是画矩形框但红绿灯、斑马线、减速带的标注规则其实有各自的门道。红绿灯是最特殊的。它表面上看是一个矩形目标但真正影响驾驶决策的是灯的颜色状态。如果只标一个“红绿灯”类别模型学到的只是“这里有个交通信号灯”而无法区分是红灯还是绿灯。所以在这套数据集里标注同学做的第一层拆分是按灯色拆分红灯、绿灯、黄灯、读秒倒计时。这样下游决策模块可以直接读取检测结果的类别ID做成一个状态机不需要再套一层分类网络。斑马线则是方向敏感型目标。从车辆行驶视角看斑马线通常是横向条纹靠近时呈现出近大远小的透视形变。标注时有两种风格一种是直接框住整片斑马线区域另一种是只标注当前车道覆盖的局部区域。这套数据集我看了下大部分采用了完整区域标注但对于被车辆遮挡、被阴影覆盖的斑马线标注员会退而求其次标一个不完整的框并且不做截断标记。这一点在实际使用时要特别注意不然模型很容易把“半条斑马线”学成特征。减速带相对简单但有一个容易踩雷的点很多减速带是黑黄相间的远距离看对比度很低尤其当路面本身就是深灰色时目标的边缘非常模糊。标注的准则一般是把减速带的可见完整区域作为标注框的范围不包括两端的过渡段。如果标注框划得过大把路面背景也包含进去训练出来的模型在推理时就会出现大量误检。2.2 目录结构与样本组织拿到数据集后第一件事是看目录结构。常规的YOLO数据集应该是这样的组织形式dataset_10625/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── classes.txt └── data.yaml其中classes.txt里是类别名称每行一个green_light red_light yellow_light crosswalk speed_bump这套数据集的三类目标在类别ID上做了一些细化把不同灯色拆开算这对决策模块的友好程度会高很多。另外我注意到它的train/val/test划分比例大约在70%/20%/10%左右这种划分比较适合中等规模的数据集。val集保证了一定的泛化验证能力test集可以用来做最终的盲测。如果你需要做更严格的交叉验证建议自己在训练前重新shuffle一遍。2.3 数据质量核查方法这里分享一个我拿到任何YOLO数据集都会先做的小检查用脚本扫描标签文件统计每个类别的目标框数量分布以及有没有坐标越界、宽高为0、类别ID超出范围的问题。别小看这一步我遇到过不少号称“精标注”的数据集里面其实混着几百个异常的标签文件。import os from collections import Counter def inspect_labels(label_dir, img_w1920, img_h1080): per_class Counter() error_files [] for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue path os.path.join(label_dir, fname) with open(path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: error_files.append((fname, field_count)) continue cls_id, x_c, y_c, w, h parts try: x_c, y_c, w, h map(float, (x_c, y_c, w, h)) except ValueError: error_files.append((fname, bad_float)) continue if x_c 0 or x_c 1 or y_c 0 or y_c 1 or w 0 or h 0: error_files.append((fname, out_of_range)) per_class[cls_id] 1 print(per class distribution:, dict(per_class)) print(error files count:, len(error_files)) for item in error_files[:10]: print(item) inspect_labels(./dataset_10625/labels/train)这个脚本虽然简单但能帮你快速发现数据集中是否存在类别极度不均衡、标签文件格式错误这类基础问题。类别不均衡直接关系到后面要不要调loss权重标签格式错误则会影响训练过程直接中断。3. 基于这套数据集训练YOLO的实操过程3.1 数据准备与环境配置我用的是YOLOv8作为基线毕竟v8在工程落地上的生态比较成熟导出TensorRT也很方便。如果你只是做一个快速的可行性验证YOLOv5s也完全可以胜任它的权重文件更小、部署要求更低。第一步是写数据集的yaml配置文件# dataset_10625.yaml path: ./dataset_10625 train: images/train val: images/val test: images/test names: 0: green_light 1: red_light 2: yellow_light 3: crosswalk 4: speed_bump注意类别名称的顺序要和标注文件里的cls_id一一对应一旦写错了训练时loss会异常升高而且模型推理出来的结果会驴唇不对马嘴。环境方面PyTorch 2.0以上加上CUDA 11.8基本是标配。如果你的显卡显存小于8G建议直接用YOLOv8s或YOLOv8n初版模型不需要太大先把pipeline跑通再说。3.2 训练参数调整与踩坑记录训练命令我建议这样起yolo train datadataset_10625.yaml modelyolov8s.pt epochs200 imgsz640 batch16 lr00.01 optimizerAdamW有几个地方需要单独说明。第一是输入分辨率。这三类目标中红绿灯属于典型的小目标在1080p图像中通常只占30×30像素左右。用640×640的分辨率训练小目标的信息损耗会比较明显。我实测将imgsz从640提升到960后红绿灯的recall从72%提升到了81%但代价是训练速度变慢约35%。如果你对推理延迟有硬性要求可以先在640下把模型结构跑通后面再用更高分辨率做针对性finetune。第二是数据增强。YOLOv8默认开启的Mosaic增强对这类场景是有效的它可以模拟出多个目标重叠的复杂场景。但Mosaic在训练后期很可能会导致模型过拟合到拼接痕迹上所以我在训练到150轮左右时会把mosaic参数关掉只保留轻微的平移和色彩抖动做最后50轮的微调。这个策略在多目标数据集上效果很明显收敛更稳定。第三是类别权重。如果按第2节的方法做类别统计你会发现斑马线和减速带的样本量可能只有红绿灯样本量的60%左右。对于这种不均衡最简单的处理方式是在loss计算时提高少数类别的权重。YOLOv8的配置里没有直接暴露类别权重参数但可以通过给少数类别的标签做轻微过采样来达到类似效果。实际操作中我会把减速带和斑马线的图片复制一份再配合随机色调变换把这两个类别的有效样本量拉上来。训练过程里我习惯每20轮保存一次checkpoint并且盯着val集上的mAP50和mAP50-95两个指标。mAP50反映的是粗定位能力mAP50-95则更严格对框的精准度要求更高。对红绿灯这类对框准确率要求一般的类别mAP50超过0.9就算过关对斑马线这种需要边界整齐的目标mAP50-95最好能超过0.75。3.3 推理与部署阶段的效果对照训练结束后用test集做盲测是必须的环节。我通常会统计各个类别在几个典型场景下的表现包括逆光场景、夜间场景、雨天场景、远距离小目标场景。这四类场景基本覆盖了模型在实际部署中会遇到的主要困难。实测下来这套数据集训练出的模型在日间顺光条件下的表现很亮眼红绿灯识别准确率能到95%以上斑马线的漏检率也很低。但在夜间场景尤其是红绿灯本身亮度高、周围环境暗的情况下模型容易出现把路灯灯光、刹车灯误检为红灯的情况。这类问题单靠数据集本身很难完全消除需要在外围加一些约束策略。比如可以结合目标的位置先验——红绿灯通常位于图像上半部分的路口区域如果模型在画面中间偏下的位置检出了红灯那就很可能是误检后处理时直接丢弃即可。4. 常见问题与排查技巧4.1 红绿灯小目标漏检严重这是最常遇到的问题。小目标漏检的本质原因是下采样倍数太高原始图像经过8倍、16倍下采样后小目标的特征已经非常微弱。解决方法从以下几个方向入手提高输入分辨率比如从640提到960或1280在模型neck层增加小目标检测头YOLOv8本身有P3、P4、P5三个尺度输出可以尝试再增加一个P2输出层专门负责小目标使用SAHI切片推理将原图切成多块有重叠的瓦片分别推理再合并结果这种方法在小目标上的提升非常明显但推理耗时也成倍增加另外注意标注框的质量红绿灯的矩形框如果包含了灯杆、遮阳板等无关区域模型学到的是这些背景特征而不是灯本身。检查数据集中靠近边缘的红绿灯目标如果标注框明显偏大建议重新调整。4.2 斑马线和减速带的误检与漏检斑马线的误检往往出现在与白色地面引导线并存的场景中。很多路口的地面带箭头、菱形标志它们与斑马线具有相同的颜色特征。模型如果学得不够精细很容易把这些地面标线也当成斑马线。缓解办法是增加包含各种地面标线的负样本图片让模型学会区分不同地面标记。我在实际项目中补充了约500张纯地面标线图片作为负样本斑马线的误检率直接降了4个百分点。减速带的漏检则多发生在阴影区。如果树荫或建筑物阴影正好覆盖在减速带上模型的检测置信度会明显下降。这种情况下数据增强阶段加入随机暗化、局部阴影模拟会有帮助。4.3 标注与推理阶段最容易踩的三个坑第一个坑标注框过小导致NMS误抑制。如果一张图中同一个红绿灯被标注了多个框或者灯色区域分开标注导致两个框重叠NMS很可能把其中一个是正确结果的框抑制掉。遇到这类问题直接检查数据集中有没有两个框与同一物理目标重叠的现象。第二个坑类别ID不统一。有些人会按灯色细分类有些人会按“是否亮起”来分有些人则把红绿灯当成一个整体来标。训练和推理使用不同的类别定义结果自然不可比。拿到一套新数据集时先花半小时把类别说明看清楚不要盲目开训。第三个坑只关注框的位置不关注框的质量。深度学习模型对数据里的噪声是相当敏感的几十个标歪的框就足够让模型的mAP掉两三个点。可以用一个简单的规则检查对同一张图的标注框重叠度做统计如果出现过多个框交叉重叠但目标本身面积并不大的情况那多半是标注质量问题。5. 一些个人的使用体会最后聊点主观感受。这套数据集给我的整体感觉是作为红绿灯、斑马线、减速带三合一感知模组的训练基础它的覆盖面和标注质量是合格的特别适合那些想快速搭建一个城区辅助驾驶感知Demo的团队。它不需要你做大量数据集格式转换直接从训练脚本开始就能跑。如果后续需要更强的鲁棒性建议在它的基础上继续采集本地城区的场景数据做finetune毕竟公开数据集再全面也比不上自己目标区域内的真实数据适配性好。还有一点值得提的是训练策略。对这类多类别、多尺度目标混合的数据集我建议不要一上来就追求最大模型的最高精度。先用YOLOv8n或s把整个链路跑通确认数据没问题、训练流程没问题再逐步放大模型、加分辨率、调增强策略。用大模型在大数据集上反复试错时间和算力成本都太高先快后慢的效率差距在小团队里体现得非常明显。这套数据集后续还可以做的事情很多比如把红绿灯的读秒数字单独切出来做一个OCR分支、把斑马线检测结果结合行人识别做成更完整的礼让逻辑、或者把减速带信息接入底盘控制系统做舒适性优化。从一套目标检测数据集出发能延伸的上层应用确实不少关键还是得先把这三类目标的检测做稳了再说。