共计 2859 个字符,预计需要花费 8 分钟才能阅读完成。
背景与痛点
Cityscapes 数据集是自动驾驶和计算机视觉领域的重要基准数据集,包含来自 50 个不同城市的街景图像,涵盖了各种天气和光照条件。该数据集因其高质量的标注和多样化的场景而备受研究者青睐。然而,许多开发者在实际使用过程中会遇到一些常见挑战:

- 标注格式复杂,包含多种 ID 类型(如 labelIds、instanceIds)
- 数据量庞大(5000 张精细标注图像和 20000 张粗略标注图像),导致加载和处理效率低下
- 不同任务(语义分割、实例分割)需要不同的预处理方式
- 官方提供的评估脚本使用门槛较高
数据格式解析
Cityscapes 数据集的结构组织得非常清晰,主要包含以下几个关键目录:
leftImg8bit:包含所有的 RGB 图像,按城市分组gtFine:包含精细标注,每个图像对应多个标注文件gtCoarse:包含粗略标注
在 gtFine 目录中,最重要的两个标注文件是:
_labelIds.png:每个像素值对应一个语义类别 ID_instanceIds.png:每个像素值包含实例信息(类别 ID*1000 + 实例 ID)
理解这些标注格式对于正确解析数据至关重要。例如,在 instanceIds 文件中,像素值 12345 表示类别 ID 为 12,实例 ID 为 345。
代码实现
安装官方工具
首先需要安装 Cityscapes 官方提供的脚本工具:
pip install cityscapesscripts
标注可视化
使用官方工具可以方便地查看标注效果:
from cityscapesscripts.visualization import showLabels
showLabels("path/to/image.png", "path/to/labelIds.png")
自定义 PyTorch Dataset
下面是一个完整的 PyTorch Dataset 实现:
import os
import torch
from torch.utils.data import Dataset
from PIL import Image
import numpy as np
class CityscapesDataset(Dataset):
def __init__(self, root, split='train', transforms=None):
self.root = root
self.split = split
self.transforms = transforms
# 收集所有图像和标注路径
self.images = []
self.labels = []
cities = os.listdir(os.path.join(root, 'leftImg8bit', split))
for city in cities:
city_img_dir = os.path.join(root, 'leftImg8bit', split, city)
city_label_dir = os.path.join(root, 'gtFine', split, 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 = base_name + '_gtFine_labelIds.png'
self.images.append(os.path.join(city_img_dir, img_name))
self.labels.append(os.path.join(city_label_dir, label_name))
def __len__(self):
return len(self.images)
def __getitem__(self, idx):
img_path = self.images[idx]
label_path = self.labels[idx]
image = Image.open(img_path).convert('RGB')
label = Image.open(label_path)
# 转换为 numpy 数组
image = np.array(image)
label = np.array(label)
if self.transforms:
augmented = self.transforms(image=image, mask=label)
image = augmented['image']
label = augmented['mask']
return image, label
数据增强策略
针对街景图像,推荐使用以下数据增强:
import albumentations as A
transform = A.Compose([A.RandomCrop(height=512, width=1024),
A.HorizontalFlip(p=0.5),
A.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1, p=0.5),
A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225))
])
性能优化
处理大规模数据集时,性能优化至关重要:
- 使用 LMDB 数据库:将图像和标注存储在 LMDB 中可以显著提高 IO 速度
- 多进程加载 :设置 DataLoader 的
num_workers参数为 CPU 核心数 - 预加载:对于小数据集,可以先将所有数据加载到内存
- 批处理:尽量使用大的 batch size 以减少 IO 次数
避坑指南
- 忽略 train_extra 子集:许多开发者只使用精细标注数据,忽略了 2 万张粗略标注图像,这会降低模型泛化能力
- 错误处理 ignoreInEval 标签:评估时需要忽略某些标签(如车辆内部),否则会影响评估结果
- 混淆 labelIds 和 instanceIds:语义分割和实例分割需要不同的标注文件
- 内存不足:处理全分辨率图像(2048×1024)需要大量内存,建议先调整为较小尺寸
- 评估指标选择:Cityscapes 官方使用 IoU 指标,但某些应用可能需要其他指标
模型适配建议
语义分割任务(如 PSPNet)
- 预处理时需要将 labelIds 映射到连续的训练 ID(0-18)
- 建议使用较大的输入尺寸(1024×512 或更大)
- 类别不平衡问题严重,建议使用加权交叉熵损失
实例分割任务(如 Mask R-CNN)
- 需要同时处理 labelIds 和 instanceIds
- 建议使用官方的
cityscapesscripts工具将 instanceIds 转换为 COCO 格式 - 小目标较多,建议使用 FPN 结构
结语
Cityscapes 数据集虽然使用门槛较高,但一旦掌握了正确的处理方法,就能为自动驾驶研究提供强有力的支持。在实际应用中,我们还需要思考一些问题:如何设计更适合 Cityscapes 的评估指标?如何处理数据集中的长尾分布问题?如何利用半监督学习方法更好地利用粗略标注数据?这些问题的探索将推动计算机视觉在自动驾驶领域的进一步发展。
正文完
发表至: 计算机视觉
近一天内
