Cityscapes数据集下载与使用全指南:从数据获取到模型训练

1次阅读
没有评论

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

image.webp

Cityscapes 数据集简介

Cityscapes 数据集是 2016 年由奔驰等公司联合发布的自动驾驶场景理解数据集,包含 50 个城市街道场景的 5000 张精细标注图片(2975 训练、500 验证、1525 测试)和 20000 张粗标注图片。其特点包括:

Cityscapes 数据集下载与使用全指南:从数据获取到模型训练

  • 高分辨率图像:所有图片均为 2048×1024 像素
  • 精细语义分割:涵盖 30 个类别(19 类用于评估)
  • 立体视觉支持:提供双目图像对
  • 多任务标注:包含实例分割、深度信息等

官方下载方式

  1. 访问 官网
  2. 注册账号并填写研究用途申请表
  3. 等待邮件批准(通常 1 - 2 个工作日)
  4. 登录后下载以下核心文件:
  5. gtFine_trainvaltest.zip(精细标注)
  6. leftImg8bit_trainvaltest.zip(原始图像)
  7. disparity_trainvaltest.zip(视差图)

国内开发者痛点分析

下载速度问题

  • 官方服务器位于德国,国内直连下载速度常低于 100KB/s
  • 大文件(如 leftImg8bit_trainvaltest.zip 约 70GB)下载易中断

数据格式复杂性

  • 目录结构嵌套层级深(如gtFine/train/aachen/aachen_000000_000019_gtFine_labelIds.png
  • 不同标注类型使用不同文件后缀(_labelIds.png, _instanceIds.png 等)
  • 需要自行划分 train/val 集

加速下载方案对比

国内镜像源

来源 地址 更新频率 校验方式
清华 TUNA https://mirrors.tuna.tsinghua.edu.cn/ 每周同步 SHA256 校验文件
阿里云镜像 https://mirrors.aliyun.com/ 每日同步 MD5 校验
华为云镜像 https://mirrors.huaweicloud.com/ 手动同步 官方哈希对照

下载工具推荐

  1. Aria2 多线程下载

    aria2c -x16 -s16 -c https://mirror.example.com/file.zip

  2. IDM 工具(Windows 平台)

  3. 支持断点续传
  4. 自动捕获下载链接

数据加载实战(PyTorch 实现)

目录结构预处理

建议重组为标准格式:

Cityscapes/
├── leftImg8bit/
│   ├── train/
│   ├── val/
│   └── test/
└── gtFine/
    ├── train/
    ├── val/
    └── test/

核心代码实现

import os
import torch
from torch.utils.data import Dataset
from PIL import Image
import numpy as np

class CityscapesDataset(Dataset):
    """
    参数说明:
        root: 数据集根目录
        split: 'train', 'val' 或 'test'
        transform: 图像增强方法
        target_transform: 标注增强方法
    """def __init__(self, root, split='train', transform=None, target_transform=None):
        self.root = root
        self.split = split
        self.transform = transform
        self.target_transform = target_transform

        # 自动收集图像 - 标注对
        self.images = []
        self.targets = []
        img_dir = os.path.join(root, 'leftImg8bit', split)
        label_dir = os.path.join(root, 'gtFine', split)

        for city in os.listdir(img_dir):
            img_city_dir = os.path.join(img_dir, city)
            label_city_dir = os.path.join(label_dir, city)

            for img_name in os.listdir(img_city_dir):
                if img_name.endswith('_leftImg8bit.png'):
                    base_name = img_name.replace('_leftImg8bit.png', '')
                    label_name = f"{base_name}_gtFine_labelIds.png"

                    self.images.append(os.path.join(img_city_dir, img_name))
                    self.targets.append(os.path.join(label_city_dir, label_name))

    def __len__(self):
        return len(self.images)

    def __getitem__(self, idx):
        image = Image.open(self.images[idx]).convert('RGB')
        target = Image.open(self.targets[idx])

        if self.transform:
            image = self.transform(image)
        if self.target_transform:
            target = self.target_transform(target)

        return image, target

性能优化建议

存储优化

  1. 使用符号链接(Linux/macOS)

    ln -s /mnt/ssd/cityscapes ./datasets/cityscapes

  2. 转换为 HDF5 格式

  3. 减少小文件 IO 开销
  4. 示例转换代码:
    import h5py
    
    with h5py.File('cityscapes.h5', 'w') as f:
        for img_path, label_path in zip(dataset.images, dataset.targets):
            img = np.array(Image.open(img_path))
            label = np.array(Image.open(label_path))
    
            group = f.create_group(os.path.basename(img_path))
            group.create_dataset('image', data=img, compression='gzip')
            group.create_dataset('label', data=label, compression='gzip')

训练加速

  • 启用 pin_memory
    DataLoader(..., pin_memory=True, num_workers=4)
  • 使用混合精度训练
    scaler = torch.cuda.amp.GradScaler()
    
    with torch.cuda.amp.autocast():
        outputs = model(inputs)
        loss = criterion(outputs, targets)
    
    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()

常见问题解决方案

标注不对齐问题

现象:预测结果与图像出现偏移

解决方法
1. 检查是否误用了 _polygons.json 文件
2. 确认加载的是 _labelIds.png 而非_instanceIds.png
3. 验证图像和标注的文件名严格匹配

内存不足处理

  1. 降低分辨率

    transform = Compose([Resize((1024, 512)),  # 长宽保持 2:1 比例
        ToTensor()])

  2. 使用迭代式加载

    for batch in DataLoader(..., batch_size=4):
        process(batch)
        torch.cuda.empty_cache()

版本控制建议

  1. 使用 dvc 管理数据版本

    dvc add data/cityscapes
    git add data/cityscapes.dvc

  2. 记录数据集哈希值

    import hashlib
    
    def get_dir_hash(path):
        hash_md5 = hashlib.md5()
        for root, _, files in os.walk(path):
            for file in sorted(files):
                with open(os.path.join(root, file), "rb") as f:
                    hash_md5.update(f.read())
        return hash_md5.hexdigest()

结语

Cityscapes 数据集作为自动驾驶领域的重要基准,其规范的使用方法能显著提升研发效率。本文介绍的方法在多个实际项目中验证有效,特别是国内镜像加速方案可将下载时间从数天缩短至数小时。建议开发者建立规范的数据管理流程,这对团队协作和实验复现至关重要。

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