ACDC自动驾驶数据集入门指南:从数据解析到模型训练实战

1次阅读
没有评论

共计 2585 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景痛点:为什么选择 ACDC 数据集

ACDC(Adverse Conditions Dataset with Correspondences)是自动驾驶领域针对恶劣天气场景的重要基准测试集。相比 KITTI 和 Cityscapes 等传统数据集,它的核心价值在于:

ACDC 自动驾驶数据集入门指南:从数据解析到模型训练实战

  • 极端天气覆盖:专门收集雨、雪、雾、夜间的驾驶场景(占全部 46 小时数据的 60% 以上)
  • 像素级标注:提供与 Cityscapes 兼容的 19 类语义标签,但增加了水渍、积雪等特殊标注
  • 多模态同步:所有帧均包含前置摄像头 RGB 图像、语义分割标注(semantic segmentation)和立体深度信息

新手常见踩坑点:

  1. 数据对齐困难:同一场景的 RGB 图像、深度图和标注文件分散在不同子目录
  2. 标签歧义:反射 / 积水区域(reflection/puddle)在雨雪天容易误标
  3. 内存瓶颈: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.Imagereduce方法降低分辨率
    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)

延伸思考

  1. 时序信息利用:ACDC 包含连续帧,可尝试 3D 卷积或光流网络
  2. 跨天气域适应:用晴天数据预训练,在雨雪数据上微调
  3. 多任务学习:联合优化语义分割和深度估计

下一步行动清单

  • [] 从官网下载数据集(需注册)
  • [] 运行示例代码验证数据加载
  • [] 尝试在 ResNet-50 基础上训练基线模型
  • [] 提交结果到 ACDC 评估服务器

经验总结

通过实践发现,处理 ACDC 数据集时特别需要注意不同天气条件下标注质量的变化。例如雪天场景中,积雪覆盖道路边缘会导致标注不准确。建议在训练时对这些困难样本增加损失权重。另外,官方提供的视差图对于理解场景几何结构很有帮助,可以作为辅助输入提升模型性能。

正文完
 0
评论(没有评论)