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

1次阅读
没有评论

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

image.webp

背景介绍

Cityscapes 数据集是计算机视觉领域广泛使用的语义分割基准数据集,专注于城市街景场景理解。该数据集包含 50 个城市在不同季节、天气条件下采集的 5000 张精细标注图像(其中 2975 张训练集,500 张验证集,1525 张测试集)和 20000 张粗略标注图像。所有图像分辨率均为 2048×1024,涵盖 30 个语义类别(如道路、车辆、行人等)。

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

主要应用场景包括:
– 自动驾驶系统的环境感知
– 街景语义分割模型训练
– 计算机视觉算法基准测试

官方下载渠道为Cityscapes 官网,需要注册账号并同意使用协议。

痛点分析

国内开发者在使用 Cityscapes 数据集时常见问题包括:

  1. 下载速度慢:官方服务器位于国外,直连下载速度通常只有 100-500KB/s
  2. 数据格式复杂:包含多种标注类型(gtFine、gtCoarse、leftImg8bit 等)和目录结构
  3. 预处理繁琐:需要处理 JSON 格式的 polygon 标注,转换为训练可用的 mask
  4. 存储空间大:完整数据集约 70GB,对本地存储有较高要求
  5. 版本管理困难:不同年份发布的数据集存在细微差异

技术方案:下载优化

官方下载(推荐学术用途)

  1. 访问官网注册账号
  2. 在 Downloads 页面选择需要的版本(推荐下载 gtFine_trainvaltest.zip 和leftImg8bit_trainvaltest.zip)
  3. 使用官方提供的下载脚本或直接下载

国内镜像加速(推荐工程开发)

  • 清华 TUNA 镜像(定期同步):

    wget https://mirrors.tuna.tsinghua.edu.cn/cityscapes/leftImg8bit_trainvaltest.zip

  • 百度云备份(需自行搜索最新链接)

下载方式对比:

方式 速度 稳定性 完整性校验 适用场景
官方 慢 高 有 学术研究
清华镜像 快(10M+) 高 有 快速部署
百度云 中等 依赖会员 无 小文件下载

代码示例:PyTorch 数据加载

目录结构说明

cityscapes/
├── gtFine/
│   ├── train/
│   │   ├── aachen/
│   │   │   ├── aachen_000000_000019_gtFine_color.png
│   │   │   ├── aachen_000000_000019_gtFine_instanceIds.png
│   │   │   └── aachen_000000_000019_gtFine_polygons.json
│   ├── val/
│   └── test/
└── leftImg8bit/
    ├── train/
    ├── val/
    └── test/

完整数据加载代码

import os
import torch
import cv2
import numpy as np
from torch.utils.data import Dataset

class CityscapesDataset(Dataset):
    """
    Cityscapes 语义分割数据集加载器
    支持自动将 polygon 标注转换为 mask
    """def __init__(self, root, split='train', transform=None):"""
        Args:
            root: 数据集根目录
            split: train/val/test
            transform: 数据增强
        """
        self.root = root
        self.split = split
        self.transform = 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):
            city_img_dir = os.path.join(img_dir, city)
            city_label_dir = os.path.join(label_dir, city)

            for img_name in os.listdir(city_img_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(city_img_dir, img_name))
                    self.targets.append(os.path.join(city_label_dir, label_name))

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

    def __getitem__(self, idx):
        """
        返回:
            image: (H,W,3) RGB 图像
            target: (H,W) 语义标签
        """
        image = cv2.cvtColor(cv2.imread(self.images[idx]), cv2.COLOR_BGR2RGB)
        target = cv2.imread(self.targets[idx], cv2.IMREAD_GRAYSCALE)

        if self.transform:
            augmented = self.transform(image=image, mask=target)
            image = augmented['image']
            target = augmented['mask']

        return image, target

最佳实践

数据校验

下载完成后建议进行完整性校验:

# 检查文件数量
find leftImg8bit/train -name "*.png" | wc -l  # 应返回 2975
find gtFine/train -name "*labelIds.png" | wc -l  # 应返回 2975

存储优化

  1. 使用符号链接:将数据集放在大容量磁盘,在项目目录创建软链接

    ln -s /mnt/big_disk/cityscapes ./data/cityscapes

  2. 压缩存储:对不常用的验证集 / 测试集使用 zip 压缩(可节省约 40% 空间)

  3. 使用 Zstandard 压缩:比传统 zip 有更好的压缩比和速度

    zstd --train -r ./leftImg8bit -o cityscapes.zst

版本管理

建议在项目 README 中明确记录使用的数据集版本:

Dataset: Cityscapes
Version: 2021-01-01
Files:
- leftImg8bit_trainvaltest.zip (md5: 4d8e6e2c3...)
- gtFine_trainvaltest.zip (md5: 6fbf7a999...)

避坑指南

常见问题与解决方案

  1. 标注文件缺失
  2. 现象:加载时报 ”FileNotFoundError”
  3. 检查:确认 gtFine 和 leftImg8bit 目录结构一致
  4. 解决:重新下载缺失的文件

  5. 内存不足

  6. 现象:处理大图像时 OOM
  7. 优化:

    • 使用 cv2.IMREAD_REDUCED_COLOR_2 降低分辨率加载
    • 改为流式处理而非全量加载
  8. 类别不平衡

  9. 现象:小物体(如交通灯)识别效果差
  10. 解决:

    • 使用类别加权损失函数
    • 在数据增强中增加小物体出现概率
  11. 多 GPU 训练同步问题

  12. 现象:验证指标波动大
  13. 解决:确保所有 worker 设置相同随机种子
    def worker_init_fn(worker_id):
        np.random.seed(42 + worker_id)

性能优化建议

  1. 使用内存映射:对于频繁访问的数据

    mmap = np.memmap('data.npy', dtype='uint8', mode='r', shape=(5000,1024,2048,3))

  2. 预生成 mask:首次运行时将 JSON 标注转换为 numpy 格式缓存

  3. 使用 DALI 加速:NVIDIA 数据加载库可提升 3 - 5 倍吞吐量

  4. 启用 pin_memory:

    DataLoader(..., pin_memory=True, num_workers=4)

结语

Cityscapes 数据集作为自动驾驶领域的重要基准,其规范的使用方法能显著提升研发效率。本文介绍的方法在实际项目中经过验证,特别是在处理大规模街景数据时,合理的预处理和加载策略可以节省大量时间。建议读者根据自身硬件条件选择适合的优化方案,并始终注意保持数据集版本的一致性。

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