共计 2423 个字符,预计需要花费 7 分钟才能阅读完成。
BDD100K 数据集图像分割下载实战指南
背景介绍
BDD100K 数据集是伯克利大学发布的用于自动驾驶研究的大规模数据集,包含 10 万张高清图像。它在计算机视觉领域,特别是语义分割、实例分割等任务中具有重要价值。数据集覆盖了多样化的天气、光照和场景条件,能够很好地测试模型的泛化能力。

然而,使用这个数据集时,开发者通常会遇到几个痛点:
- 数据量大(总大小超过 1TB),下载时间长且容易中断
- 复杂的目录结构和标注格式增加了使用难度
- 高分辨率图像(1280×720)导致内存消耗大
- 缺乏标准化的预处理流程
数据获取
官方下载渠道
BDD100K 数据集可以通过官方网站(https://bdd-data.berkeley.edu/)获取。需要注册账号并填写使用目的后才能获取下载链接。
高效下载技巧
使用 wget 进行批量下载:
wget -c -i file_list.txt
其中 -c 参数支持断点续传,-i参数指定包含所有下载链接的文本文件。
更推荐使用 aria2 进行多线程下载:
aria2c -x16 -s16 -c -i file_list.txt
-x16:最多使用 16 个连接-s16:将文件分成 16 个部分并行下载-c:支持断点续传
数据校验
下载完成后,建议进行 MD5 校验:
md5sum -c checksums.md5
数据集结构解析
BDD100K 数据集包含以下主要目录:
images/:存放所有图片,分为train/、val/、test/三个子集labels/:包含语义分割、实例分割等标注文件drivable_maps/:可行驶区域标注
标注文件采用 JSON 格式,包含以下关键字段:
{
"name": "图片文件名",
"attributes": {
"weather": "晴天 / 雨天等",
"scene": "城市 / 高速等"
},
"labels": [
{
"category": "物体类别",
"box2d": {"x1": 0, "y1": 0, "x2": 100, "y2": 100},
"poly2d": [{"vertices": [[x1,y1],...], "types": "LLLL"}]
}
]
}
预处理代码示例
加载和解析标注文件
import json
import cv2
import numpy as np
# 加载标注文件
with open('bdd100k/labels/sem_seg/train/0000f77c-62c2a288.json') as f:
annotation = json.load(f)
# 创建空白 mask
height, width = 720, 1280
mask = np.zeros((height, width), dtype=np.uint8)
# 解析多边形标注并绘制 mask
for obj in annotation['labels']:
if 'poly2d' in obj:
vertices = np.array(obj['poly2d'][0]['vertices'], dtype=np.int32)
cv2.fillPoly(mask, [vertices], color=CATEGORY_ID[obj['category']])
可视化示例
import matplotlib.pyplot as plt
# 加载图片和 mask
image = cv2.imread('bdd100k/images/train/0000f77c-62c2a288.jpg')
mask = cv2.imread('bdd100k/labels/sem_seg/train/0000f77c-62c2a288.png', 0)
# 可视化
plt.figure(figsize=(12, 6))
plt.subplot(121)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.subplot(122)
plt.imshow(mask, cmap='jet')
plt.show()
数据增强
import albumentations as A
# 定义增强管道
transform = A.Compose([A.RandomCrop(height=512, width=512),
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.2),
], additional_targets={'mask': 'mask'})
# 应用增强
transformed = transform(image=image, mask=mask)
image_aug = transformed['image']
mask_aug = transformed['mask']
避坑指南
常见下载问题
- 下载中断 :使用
-c参数支持断点续传 - 速度慢:尝试更换下载工具(如 aria2)或镜像源
- 校验失败:重新下载损坏的分片
内存优化
- 使用生成器 (Generator) 逐批加载数据
- 将大图像切分成小块处理
- 使用
dtype=np.float16减少内存占用
多进程预处理
from multiprocessing import Pool
def process_image(args):
img_path, label_path = args
# 处理逻辑
return processed_data
with Pool(4) as p: # 使用 4 个进程
results = p.map(process_image, file_pairs)
性能考量
预处理速度对比
| 方法 | 100 张图像处理时间 |
|---|---|
| 单线程 | 45.3s |
| 4 进程 | 12.1s |
| GPU 加速 | 8.7s |
内存优化技巧
- 使用
del及时释放不再使用的变量 - 使用
gc.collect()手动触发垃圾回收 - 对于大数组,优先使用
np.memmap
结语
BDD100K 数据集为自动驾驶研究提供了丰富的素材,虽然数据量大、处理复杂,但通过合理的下载策略和预处理流程,可以高效地将其应用于实际项目中。建议读者尝试在自己的项目中应用这些技巧,并根据具体需求调整预处理流程。
如果你在使用过程中发现其他实用技巧,欢迎分享你的实践经验!
正文完
