Cityscapes数据集深度解析:从数据标注到模型训练的全流程指南

1次阅读
没有评论

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

image.webp

背景与痛点

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

Cityscapes 数据集深度解析:从数据标注到模型训练的全流程指南

  • 标注格式复杂,包含多种 ID 类型(如 labelIds、instanceIds)
  • 数据量庞大(5000 张精细标注图像和 20000 张粗略标注图像),导致加载和处理效率低下
  • 不同任务(语义分割、实例分割)需要不同的预处理方式
  • 官方提供的评估脚本使用门槛较高

数据格式解析

Cityscapes 数据集的结构组织得非常清晰,主要包含以下几个关键目录:

  • leftImg8bit:包含所有的 RGB 图像,按城市分组
  • gtFine:包含精细标注,每个图像对应多个标注文件
  • gtCoarse:包含粗略标注

gtFine 目录中,最重要的两个标注文件是:

  1. _labelIds.png:每个像素值对应一个语义类别 ID
  2. _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))
])

性能优化

处理大规模数据集时,性能优化至关重要:

  1. 使用 LMDB 数据库:将图像和标注存储在 LMDB 中可以显著提高 IO 速度
  2. 多进程加载 :设置 DataLoader 的num_workers 参数为 CPU 核心数
  3. 预加载:对于小数据集,可以先将所有数据加载到内存
  4. 批处理:尽量使用大的 batch size 以减少 IO 次数

避坑指南

  1. 忽略 train_extra 子集:许多开发者只使用精细标注数据,忽略了 2 万张粗略标注图像,这会降低模型泛化能力
  2. 错误处理 ignoreInEval 标签:评估时需要忽略某些标签(如车辆内部),否则会影响评估结果
  3. 混淆 labelIds 和 instanceIds:语义分割和实例分割需要不同的标注文件
  4. 内存不足:处理全分辨率图像(2048×1024)需要大量内存,建议先调整为较小尺寸
  5. 评估指标选择:Cityscapes 官方使用 IoU 指标,但某些应用可能需要其他指标

模型适配建议

语义分割任务(如 PSPNet)

  • 预处理时需要将 labelIds 映射到连续的训练 ID(0-18)
  • 建议使用较大的输入尺寸(1024×512 或更大)
  • 类别不平衡问题严重,建议使用加权交叉熵损失

实例分割任务(如 Mask R-CNN)

  • 需要同时处理 labelIds 和 instanceIds
  • 建议使用官方的 cityscapesscripts 工具将 instanceIds 转换为 COCO 格式
  • 小目标较多,建议使用 FPN 结构

结语

Cityscapes 数据集虽然使用门槛较高,但一旦掌握了正确的处理方法,就能为自动驾驶研究提供强有力的支持。在实际应用中,我们还需要思考一些问题:如何设计更适合 Cityscapes 的评估指标?如何处理数据集中的长尾分布问题?如何利用半监督学习方法更好地利用粗略标注数据?这些问题的探索将推动计算机视觉在自动驾驶领域的进一步发展。

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