共计 2316 个字符,预计需要花费 6 分钟才能阅读完成。
为什么选择 Cityscapes 数据集
Cityscapes 是自动驾驶和计算机视觉领域最常用的街景语义分割数据集之一,由奔驰等公司在 2016 年联合发布。它包含来自 50 个不同城市的街景图像,涵盖各种天气、季节和交通状况。数据集的主要特点包括:

- 5000 张精细标注的图像(2975 训练,500 验证,1525 测试)
- 20000 张粗糙标注的附加图像
- 30 类语义标签(如道路、车辆、行人等)
- 高分辨率(2048×1024 像素)
这些特性使其成为评估语义分割算法性能的黄金标准。
数据集结构解析
下载并解压 Cityscapes 数据集后,你会看到以下目录结构:
cityscapes/
├── leftImg8bit/
│ ├── train/
│ ├── val/
│ └── test/
└── gtFine/
├── train/
├── val/
└── test/
关键文件夹说明:
leftImg8bit:存储原始 RGB 图像,按城市分目录gtFine:精细标注,包含以下文件类型:_color.png:可视化彩色标注图_instanceIds.png:实例 ID 图_labelIds.png:语义标签 ID 图_polygons.json:多边形标注的原始 JSON 文件
标注格式深度解析
Cityscapes 提供两种主要标注格式:
- JSON 格式:包含详细的多边形顶点坐标和对象属性
- PNG 格式:三种不同用途的标注图
语义分割主要使用_labelIds.png,其中每个像素值对应一个类别 ID。例如:
- 0:未标注
- 7:道路
- 24:人
- 26:汽车
实例分割则使用_instanceIds.png,其中:
- 低位字节表示类别 ID
- 高位字节表示实例编号
数据加载实战代码
以下是一个完整的 PyTorch 数据加载示例:
import os
import torch
import cv2
from torch.utils.data import Dataset
class CityscapesDataset(Dataset):
def __init__(self, root, split='train', transform=None):
self.root = root
self.split = split
self.transform = transform
self.images = []
self.masks = []
# 扫描数据目录
img_dir = os.path.join(root, 'leftImg8bit', split)
mask_dir = os.path.join(root, 'gtFine', split)
for city in os.listdir(img_dir):
city_img_dir = os.path.join(img_dir, city)
city_mask_dir = os.path.join(mask_dir, city)
for img_name in os.listdir(city_img_dir):
if img_name.endswith('_leftImg8bit.png'):
base_name = img_name.replace('_leftImg8bit.png', '')
mask_name = base_name + '_gtFine_labelIds.png'
self.images.append(os.path.join(city_img_dir, img_name))
self.masks.append(os.path.join(city_mask_dir, mask_name))
def __len__(self):
return len(self.images)
def __getitem__(self, idx):
image = cv2.imread(self.images[idx])
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
mask = cv2.imread(self.masks[idx], cv2.IMREAD_GRAYSCALE)
if self.transform:
augmented = self.transform(image=image, mask=mask)
image = augmented['image']
mask = augmented['mask']
return image, mask
新手避坑指南
- 忽略标签映射
- 问题:直接使用原始标签 ID 会导致类别不平衡
-
解决:使用官方提供的
trainId映射(如将原 ID 26 映射为训练 ID 13) -
图像尺寸处理不当
- 问题:Cityscapes 图像很大(2048×1024),直接训练会内存溢出
-
解决:训练时使用随机裁剪(如 512×512)或下采样
-
混淆实例与语义标注
- 问题:错误使用
_instanceIds.png进行语义分割 -
解决:语义分割任务应该使用
_labelIds.png -
忽略边界区域
- 问题:Cityscapes 包含
boundary标签,影响评估 -
解决:预处理时过滤边界像素或使用官方评估脚本
-
数据划分错误
- 问题:误用粗糙标注图像进行训练
- 解决:精细标注图像仅包含 2975 训练样本,注意区分
数据增强策略
针对 Cityscapes 的推荐增强组合:
- 几何变换:
- 随机水平翻转(p=0.5)
- 随机缩放(0.5-2.0)
-
随机裁剪
-
颜色变换:
- 亮度 / 对比度调整
-
添加高斯噪声
-
高级增强:
- 使用 Albumentations 库的 CutMix
- 天气模拟(添加雾效、雨滴)
进阶思考
- 如何利用粗糙标注的 20000 张图像提升模型性能?
- Cityscapes 的评估指标(如 mIoU)在真实自动驾驶场景中有哪些局限性?
- 如何设计一个同时处理语义分割和实例分割的多任务模型?
希望这篇指南能帮助你快速上手 Cityscapes 数据集。记住,实践出真知,遇到问题时不妨先查阅官方文档和论坛讨论。
正文完
发表至: 计算机视觉
近一天内
