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

主要应用场景包括:
– 自动驾驶系统的环境感知
– 街景语义分割模型训练
– 计算机视觉算法基准测试
官方下载渠道为Cityscapes 官网,需要注册账号并同意使用协议。
痛点分析
国内开发者在使用 Cityscapes 数据集时常见问题包括:
- 下载速度慢:官方服务器位于国外,直连下载速度通常只有 100-500KB/s
- 数据格式复杂:包含多种标注类型(gtFine、gtCoarse、leftImg8bit 等)和目录结构
- 预处理繁琐:需要处理 JSON 格式的 polygon 标注,转换为训练可用的 mask
- 存储空间大:完整数据集约 70GB,对本地存储有较高要求
- 版本管理困难:不同年份发布的数据集存在细微差异
技术方案:下载优化
官方下载(推荐学术用途)
- 访问官网注册账号
- 在 Downloads 页面选择需要的版本(推荐下载
gtFine_trainvaltest.zip和leftImg8bit_trainvaltest.zip) - 使用官方提供的下载脚本或直接下载
国内镜像加速(推荐工程开发)
-
清华 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
存储优化
-
使用符号链接:将数据集放在大容量磁盘,在项目目录创建软链接
ln -s /mnt/big_disk/cityscapes ./data/cityscapes -
压缩存储:对不常用的验证集 / 测试集使用 zip 压缩(可节省约 40% 空间)
-
使用 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...)
避坑指南
常见问题与解决方案
- 标注文件缺失
- 现象:加载时报 ”FileNotFoundError”
- 检查:确认 gtFine 和 leftImg8bit 目录结构一致
-
解决:重新下载缺失的文件
-
内存不足
- 现象:处理大图像时 OOM
-
优化:
- 使用
cv2.IMREAD_REDUCED_COLOR_2降低分辨率加载 - 改为流式处理而非全量加载
- 使用
-
类别不平衡
- 现象:小物体(如交通灯)识别效果差
-
解决:
- 使用类别加权损失函数
- 在数据增强中增加小物体出现概率
-
多 GPU 训练同步问题
- 现象:验证指标波动大
- 解决:确保所有 worker 设置相同随机种子
def worker_init_fn(worker_id): np.random.seed(42 + worker_id)
性能优化建议
-
使用内存映射:对于频繁访问的数据
mmap = np.memmap('data.npy', dtype='uint8', mode='r', shape=(5000,1024,2048,3)) -
预生成 mask:首次运行时将 JSON 标注转换为 numpy 格式缓存
-
使用 DALI 加速:NVIDIA 数据加载库可提升 3 - 5 倍吞吐量
-
启用 pin_memory:
DataLoader(..., pin_memory=True, num_workers=4)
结语
Cityscapes 数据集作为自动驾驶领域的重要基准,其规范的使用方法能显著提升研发效率。本文介绍的方法在实际项目中经过验证,特别是在处理大规模街景数据时,合理的预处理和加载策略可以节省大量时间。建议读者根据自身硬件条件选择适合的优化方案,并始终注意保持数据集版本的一致性。
