3、数据集与标注:行人、障碍物、交通标志公开数据集(KITTI、COCO、BDD100K、Cityscapes)及标注格式(VOC、COCO、YOLO)
在无人车感知系统的开发中,数据是驱动模型性能的基石。无论是行人检测、障碍物识别还是交通标志分类,模型的泛化能力与鲁棒性高度依赖于训练数据的规模、质量与多样性。本章将系统梳理无人车目标检测领域最常用的四个公开数据集——KITTI、COCO、BDD100K、Cityscapes,深入剖析它们的数据特点、适用场景与局限性,并详细讲解三种主流标注格式(VOC、COCO、YOLO)的存储结构与转换方法。理解这些内容,是进行模型选型、数据增强策略设计以及轻量化部署前数据准备的关键前提。
上图展示了四大数据集与三种标注格式的整体关系。在实际工程中,我们通常不会直接使用原始数据集,而是根据任务需求进行格式统一与数据清洗。下面将逐一展开分析。
3.1 核心数据集深度解析
3.1.1 KITTI:自动驾驶视觉基准的“鼻祖”
核心原理:KITTI由德国卡尔斯鲁厄理工学院与丰田美国技术研究院联合发布,是自动驾驶领域最早且最具影响力的公开数据集之一。其数据采集平台搭载了2台灰度摄像机、2台彩色摄像机、1台Velodyne 64线激光雷达以及GPS/IMU导航系统,能够提供同步的视觉与点云数据。对于目标检测任务,KITTI提供了7481张训练图像和7518张测试图像,标注类别主要聚焦于Car(汽车)、Pedestrian(行人)、Cyclist(骑行者)三类,同时包含2D边界框和3D边界框(含截断、遮挡等级属性)。
判断方法与适用场景:KITTI的标注质量较高,但数据采集时间较早(2011年),场景主要集中于德国卡尔斯鲁厄的中等城市交通环境。其图像分辨率约为1242×375,视野较窄。在工程实践中,KITTI更适合用于验证3D目标检测算法(如PointPillars、SECOND)以及多传感器融合方案。对于2D检测任务,KITTI的类别较少且场景单一,直接用于现代复杂路况的泛化能力有限。
3.1.2 COCO:通用物体检测的“万金油”
核心原理:COCO(Common Objects in Context)由微软发布,包含33万张图像、超过250万个标注实例,覆盖80个物体类别。虽然它不是专门的自动驾驶数据集,但其中包含了person(行人)、car、traffic light、stop sign等与驾驶强相关的类别。COCO的标注信息极为丰富,不仅包含边界框,还提供实例分割掩码、关键点(如人体骨骼点)、图像标题等,是评估现代检测器(如YOLO、DETR)性能的基准平台。
实战价值:在无人车项目中,COCO最大的用途是作为预训练数据集。由于COCO类别多样、场景丰富,模型在COCO上预训练后,再迁移到自动驾驶专用数据集(如BDD100K)上进行微调,能够显著提升小目标(如远处行人)和遮挡目标的检测精度。COCO的评估指标(mAP@0.5:0.95)也是业界公认的模型性能标尺。
| 数据集 | 图像数量 | 类别数 | 标注类型 | 主要优势 | 主要局限 |
|---|---|---|---|---|---|
| KITTI | 1.5万 | 3 | 2D+3D框 | 3D标注精确、多传感器同步 | 场景单一、类别少、数据较旧 |
| COCO | 33万 | 80 | 2D框+分割+关键点 | 类别丰富、预训练效果好 | 非驾驶场景、无3D信息 |
| BDD100K | 10万 | 10 | 2D框+可驾驶区域+车道线 | 驾驶场景多样、天气/时间属性 | 标注噪声较大、类别较少 |
| Cityscapes | 2.5万 | 8 | 像素级分割 | 分割精度高、城市场景真实 | 无2D框、不直接用于检测 |
3.1.3 BDD100K:驾驶场景的“大而全”
核心原理:BDD100K由伯克利大学发布,是目前规模最大的公开驾驶视频数据集,包含10万段高清视频(约40秒/段),从中抽帧得到10万张图像用于目标检测标注。其标注类别包括car、bus、person、bike、truck、traffic light、traffic sign等10类。BDD100K最大的特色在于属性标注:每张图像都记录了天气(晴天/雨天/雪天/雾天)、场景(城市/乡村/高速)、时间(白天/夜晚)等信息,这使得模型能够针对不同环境进行域适应训练。
操作流程建议:在构建无人车感知模型时,建议将BDD100K作为主训练集。具体操作:首先筛选出包含行人和交通标志的图像子集,然后根据部署地区的气候特点(如多雨或多雾)进行针对性采样。例如,若目标市场是重庆(多雾),则应加大BDD100K中雾天样本的采样权重。
3.1.4 Cityscapes:像素级理解的“精细工”
核心原理:Cityscapes专注于城市场景的语义分割,包含50个不同城市的街景图像,提供5000张精细标注图像(像素级)和20000张粗糙标注图像。其标注类别涵盖行人、车辆、交通标志、路面、建筑等19个类别。虽然它不直接提供2D边界框,但通过分割掩码可以轻松转换为检测框,且精度远高于人工绘制的矩形框。
应用场景:在轻量模型部署中,Cityscapes常用于训练语义分割辅助分支。例如,在YOLOP(同时检测目标、可驾驶区域和车道线)等多任务模型中,Cityscapes的分割数据能够帮助模型更好地理解道路边界与障碍物轮廓,从而提升检测的鲁棒性。
3.2 标注格式详解与转换实战
3.2.1 VOC格式:XML的“经典派”
VOC格式源自PASCAL VOC挑战赛,采用XML文件存储标注信息。每个XML文件对应一张图像,文件名与图像名一致。核心结构如下:
<annotation>
<folder>JPEGImages</folder>
<filename>000001.jpg</filename>
<size>
<width>1920</width>
<height>1080</height>
<depth>3</depth>
</size>
<object>
<name>pedestrian</name>
<bndbox>
<xmin>100</xmin>
<ymin>200</ymin>
<xmax>150</xmax>
<ymax>350</ymax>
</bndbox>
</object>
</annotation>
优缺点分析:VOC格式直观易读,适合小规模数据集和教学场景。但其缺点也很明显:文件数量多(一张图一个XML)、不支持分割多边形、解析速度慢。在轻量化部署流水线中,VOC格式通常需要转换为COCO或YOLO格式。
3.2.2 COCO格式:JSON的“全能王”
COCO格式将所有标注信息整合到一个JSON文件中,通过images、annotations、categories三个数组建立索引关系。其边界框表示为[x, y, width, height](左上角坐标+宽高),并额外提供area字段用于计算mAP。COCO格式支持分割多边形(segmentation)和关键点(keypoints),是当前学术研究与工业界最通用的格式。
{
"images": [{"id": 1, "file_name": "000001.jpg", "width": 1920, "height": 1080}],
"annotations": [{
"id": 1, "image_id": 1, "category_id": 1,
"bbox": [100, 200, 50, 150], "area": 7500,
"iscrowd": 0
}],
"categories": [{"id": 1, "name": "pedestrian"}]
}
3.2.3 YOLO格式:TXT的“极简派”
YOLO格式是Ultralytics YOLO系列(v5/v8)默认使用的格式,每张图像对应一个同名TXT文件,每行代表一个目标。格式为:class_id x_center y_center width height,其中坐标值均归一化到[0,1]区间。归一化公式为:x_center = (xmin + xmax) / 2 / width,w = (xmax - xmin) / width。
# 000001.txt
0 0.0651 0.2546 0.0260 0.1389
1 0.5234 0.4812 0.3125 0.3567
转换注意事项:YOLO格式不包含图像尺寸信息,因此训练时必须确保图像尺寸与标注时的尺寸一致。若进行图像缩放或填充,需同步更新TXT文件中的归一化坐标。
3.3 格式转换工具链与案例拆解
3.3.1 转换流程清单
- 需求分析:确定训练框架(如YOLOv8、MMDetection)所需的标注格式。
- 数据盘点:统计现有数据集的标注格式、类别分布、图像尺寸。
- 编写转换脚本:使用Python的
xml.etree.ElementTree或json库解析源文件。 - 坐标校验:转换后随机抽取100张图,可视化边界框与原图叠加,检查是否偏移。
- 类别映射:将不同数据集的类别名称统一映射到自定义的类别ID表。
3.3.2 实战案例:多源数据统一为YOLO格式
背景与约束:某无人配送小车项目需要检测行人、锥桶、减速带三类目标。团队收集了KITTI(有行人)、BDD100K(有行人+锥桶)和自采数据(有减速带)。但KITTI是VOC格式,BDD100K是COCO格式,自采数据是标注软件导出的VOC格式。训练框架选定为YOLOv8,需要将所有数据统一为YOLO格式。
初始现象与目标:直接混合训练导致模型loss震荡,检测精度mAP@0.5仅为0.62。分析发现:KITTI图像尺寸为1242×375,BDD100K为1280×720,自采数据为1920×1080,且三类数据的类别ID定义混乱(KITTI中行人ID=1,BDD100K中行人ID=0)。
分析判断过程:首先,统一图像尺寸至640×640(YOLOv8默认),采用letterbox填充。其次,编写映射字典:{'Pedestrian':'person', 'Car':'car', 'Truck':'truck'},将KITTI的3类映射到自定义的10类体系。最后,针对锥桶和减速带样本不足的问题,从BDD100K中筛选包含cone的帧,并利用数据增强(旋转、亮度变化)扩充至2000张。
实际操作步骤:
# 转换脚本核心逻辑(伪代码)
def voc_to_yolo(xml_path, img_w, img_h, class_map):
tree = ET.parse(xml_path)
lines = []
for obj in tree.findall('object'):
name = obj.find('name').text
if name not in class_map: continue
xmin = int(obj.find('bndbox/xmin').text)
ymin = int(obj.find('bndbox/ymin').text)
xmax = int(obj.find('bndbox/xmax').text)
ymax = int(obj.find('bndbox/ymax').text)
x_center = ((xmin + xmax) / 2) / img_w
y_center = ((ymin + ymax) / 2) / img_h
w = (xmax - xmin) / img_w
h = (ymax - ymin) / img_h
lines.append(f"{class_map[name]} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}")
return lines
结果对比:统一格式并清洗后,模型mAP@0.5提升至0.81,loss曲线收敛平稳。关键改进点在于:① 剔除了KITTI中遮挡等级为2(严重遮挡)的行人样本,减少标注噪声;② 对BDD100K的锥桶类别进行了二次人工复核,修正了约15%的错误框。
风险与代价:格式转换本身耗时约2人天,但最大的代价是数据清洗环节——人工复核锥桶标注花费了额外3天。复盘经验:在项目启动初期就应定义统一的类别体系,避免后期大规模映射。
3.4 常见误区与总结复盘
x_center写成了xmin,导致边界框偏移。务必在转换后执行可视化验证。
总结:数据集与标注是无人车感知的“地基”。KITTI适合3D感知研究,COCO是预训练利器,BDD100K最贴近真实驾驶场景,Cityscapes提供精细分割信息。在工程实践中,建议采用“COCO预训练 + BDD100K微调 + 自采数据增强”的三级策略。标注格式方面,YOLO格式因其简洁高效,已成为轻量部署的主流选择,但需严格把控坐标归一化与类别映射的正确性。最终,数据质量远比数据数量重要——一个经过精心清洗的5000张数据集,其训练效果往往优于未经处理的5万张噪声数据。