共计 1549 个字符,预计需要花费 4 分钟才能阅读完成。
背景介绍
BDD100K 是伯克利大学发布的自动驾驶场景大规模数据集,包含 10 万张高清道路图像,涵盖昼夜、晴雨等多种驾驶场景。作为计算机视觉领域的基准数据集,它被广泛用于目标检测、语义分割、车道检测等任务。数据集提供 JSON 格式的标注文件,其中包含丰富的物体类别信息,但新手常因不熟悉标注顺序而遇到解析错误。

痛点分析
刚接触 BDD100K 时,开发者常遇到以下问题:
- 混淆检测框坐标与类别 ID 的对应关系
- 不确定类别顺序是固定还是随机排列
- 处理多任务(如同时做检测和分割)时类别映射不一致
- 误将‘traffic light’和‘traffic sign’归为同类
- 忽略‘rider’和‘person’的区分逻辑
核心解析
BDD100K 的 40 个标注类别按固定顺序排列,分为 6 大类:
- 交通工具类(0-9)
- 0: pedestrian
- 1: rider
- 2: car
- 3: truck
- 4: bus
- 5: train
- 6: motorcycle
- 7: bicycle
- 8: traffic light
-
9: traffic sign
-
交通设施类(10-18)
-
包含红绿灯状态、各类道路标志等
-
自然环境类(19-28)
-
如 sky、building、vegetation 等背景元素
-
路面标记类(29-35)
-
包括 lane、crosswalk 等地面标识
-
特殊物体类(36-38)
-
如 trailer、dynamic 物体
-
其他类(39)
- 未分类对象
代码示例
以下是通过 Python 加载标注文件的示例:
import json
import matplotlib.pyplot as plt
# 类别名称列表(按官方顺序)CLASS_NAMES = [
'pedestrian', 'rider', 'car', 'truck', 'bus',
'train', 'motorcycle', 'bicycle', 'traffic light', 'traffic sign',
# 完整列表见官方文档...
]
def load_bdd100k_labels(json_path):
"""加载并解析标注文件"""
with open(json_path) as f:
data = json.load(f)
annotations = []
for obj in data['frames'][0]['objects']:
category = CLASS_NAMES[obj['category']] # 关键:按索引映射类别
bbox = [obj['box2d']['x1'],
obj['box2d']['y1'],
obj['box2d']['x2'],
obj['box2d']['y2']
]
annotations.append((category, bbox))
return annotations
最佳实践
- 预处理建议
- 使用官方提供的
bdd100k工具包进行格式验证 - 对‘traffic light’按颜色(红 / 黄 / 绿)进一步细分
-
合并相似类别(如‘motorcycle’和‘bicycle’)时注意索引调整
-
可视化技巧
- 用 Seaborn 绘制类别分布直方图
-
标注样本时采用不同颜色区分大类
-
性能优化
- 将类别 ID 转换为 one-hot 编码时预先建立查找表
- 对 JSON 文件使用 ijson 库流式读取
避坑指南
常见错误及解决方案:
- 错误 1:直接使用 0 -39 外的数字
-
方案:添加
assert 0 <= cat_id < 40校验 -
错误 2:忽略‘rider’的特殊性(人 + 车组合)
-
方案:单独处理该类别或拆分为两个实例
-
错误 3:错误映射交通灯状态
- 方案:通过
attributes字段的trafficLightColor子属性判断
结语
掌握 BDD100K 的标注顺序后,建议尝试:
1. 构建自定义类别子集(如只检测车辆)
2. 与其他数据集(如 Cityscapes)的类别体系对比
3. 针对长尾分布问题设计重采样策略
数据集如同乐高积木,理解其内部结构才能搭建出理想的视觉系统。
正文完
