共计 2585 个字符,预计需要花费 7 分钟才能阅读完成。
背景痛点:为什么选择 ACDC 数据集
ACDC(Adverse Conditions Dataset with Correspondences)是自动驾驶领域针对恶劣天气场景的重要基准测试集。相比 KITTI 和 Cityscapes 等传统数据集,它的核心价值在于:

- 极端天气覆盖:专门收集雨、雪、雾、夜间的驾驶场景(占全部 46 小时数据的 60% 以上)
- 像素级标注:提供与 Cityscapes 兼容的 19 类语义标签,但增加了水渍、积雪等特殊标注
- 多模态同步:所有帧均包含前置摄像头 RGB 图像、语义分割标注(semantic segmentation)和立体深度信息
新手常见踩坑点:
- 数据对齐困难:同一场景的 RGB 图像、深度图和标注文件分散在不同子目录
- 标签歧义:反射 / 积水区域(reflection/puddle)在雨雪天容易误标
- 内存瓶颈:4000×6000 超高分辨率图像直接加载会导致 OOM(内存不足)
技术方案:数据目录结构解析
ACDC 采用以下目录结构(简化版):
acdc/
├── rgb_anon/ # 原始 RGB 图像
│ ├── rain/ # 雨天场景
│ │ ├── 0001.png
│ │ └── ...
│ └── snow/ # 雪天场景
├── gt_anon/ # 标注文件
│ ├── rain/
│ │ ├── 0001_gt_labelIds.png
│ │ └── ...
└── disparity_anon/ # 视差图
├── rain/
└── snow/
与其他数据集对比的关键差异:
| 特性 | ACDC | Cityscapes | KITTI |
|---|---|---|---|
| 天气条件 | 雨 / 雪 / 雾 / 夜 | 晴朗 | 晴朗为主 |
| 分辨率 | 3840×2160 | 2048×1024 | 1242×375 |
| 标注类型 | 语义 + 深度 | 语义 + 实例 | 3D 框 + 语义 |
| 场景动态性 | 中 | 低 | 高 |
代码实现:PyTorch 数据管道
1. 基础数据加载器
import os
import torch
from PIL import Image
from torch.utils.data import Dataset
class ACDCDataset(Dataset):
"""关键步骤 1:实现__getitem__正确处理文件路径"""
def __init__(self, root_dir, split='train', transform=None):
self.rgb_dir = os.path.join(root_dir, f'rgb_anon/{split}')
self.gt_dir = os.path.join(root_dir, f'gt_anon/{split}')
self.samples = [f for f in os.listdir(self.rgb_dir) if f.endswith('.png')]
self.transform = transform
# 标签映射表(将 Cityscapes 的 19 类 ID 映射到连续索引)self.label_map = {...}
def __len__(self):
return len(self.samples)
def __getitem__(self, idx):
rgb_path = os.path.join(self.rgb_dir, self.samples[idx])
gt_path = os.path.join(self.gt_dir,
self.samples[idx].replace('.png', '_gt_labelIds.png'))
# 关键步骤 2:同步加载和校验
rgb = Image.open(rgb_path).convert('RGB')
gt = Image.open(gt_path)
assert rgb.size == gt.size, f"尺寸不匹配: {rgb_path}"
if self.transform:
rgb, gt = self.transform(rgb, gt)
return rgb, gt
2. 针对恶劣天气的数据增强
from albumentations import (
Compose, RandomBrightnessContrast,
RandomRain, RandomSnow
)
def get_augmentations(weather):
"""根据天气类型选择增强策略"""
base_aug = [RandomBrightnessContrast(p=0.3)]
if weather == 'rain':
base_aug.append(RandomRain(
rain_type='heavy',
blur_value=3, # 模拟雨滴模糊效果
p=0.5))
elif weather == 'snow':
base_aug.append(RandomSnow(
snow_point_lower=0.1,
snow_point_upper=0.3,
p=0.5))
return Compose(base_aug)
避坑指南
内存优化技巧
- 分块加载 :使用
PIL.Image的reduce方法降低分辨率rgb = Image.open(rgb_path).reduce(4) # 缩小 4 倍 - 延迟加载 :在
__getitem__中才读取文件,避免预加载所有数据
标注歧义处理
遇到反射区域(如积水倒影)时:
1. 检查 gt_labelIds.png 中对应像素的 ID 是否为label_map['reflection']
2. 通过形态学开运算(opening)消除小的噪声区域
分布式训练策略
使用torch.utils.data.distributed.DistributedSampler:
sampler = DistributedSampler(dataset, shuffle=True)
dataloader = DataLoader(dataset, batch_size=8, sampler=sampler)
延伸思考
- 时序信息利用:ACDC 包含连续帧,可尝试 3D 卷积或光流网络
- 跨天气域适应:用晴天数据预训练,在雨雪数据上微调
- 多任务学习:联合优化语义分割和深度估计
下一步行动清单
- [] 从官网下载数据集(需注册)
- [] 运行示例代码验证数据加载
- [] 尝试在 ResNet-50 基础上训练基线模型
- [] 提交结果到 ACDC 评估服务器
经验总结
通过实践发现,处理 ACDC 数据集时特别需要注意不同天气条件下标注质量的变化。例如雪天场景中,积雪覆盖道路边缘会导致标注不准确。建议在训练时对这些困难样本增加损失权重。另外,官方提供的视差图对于理解场景几何结构很有帮助,可以作为辅助输入提升模型性能。
正文完
