Cityscapes数据集详解:从入门到实战的避坑指南

1次阅读
没有评论

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

image.webp

为什么选择 Cityscapes 数据集

Cityscapes 是自动驾驶和计算机视觉领域最常用的街景语义分割数据集之一,由奔驰等公司在 2016 年联合发布。它包含来自 50 个不同城市的街景图像,涵盖各种天气、季节和交通状况。数据集的主要特点包括:

Cityscapes 数据集详解:从入门到实战的避坑指南

  • 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 提供两种主要标注格式:

  1. JSON 格式:包含详细的多边形顶点坐标和对象属性
  2. 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

新手避坑指南

  1. 忽略标签映射
  2. 问题:直接使用原始标签 ID 会导致类别不平衡
  3. 解决:使用官方提供的 trainId 映射(如将原 ID 26 映射为训练 ID 13)

  4. 图像尺寸处理不当

  5. 问题:Cityscapes 图像很大(2048×1024),直接训练会内存溢出
  6. 解决:训练时使用随机裁剪(如 512×512)或下采样

  7. 混淆实例与语义标注

  8. 问题:错误使用 _instanceIds.png 进行语义分割
  9. 解决:语义分割任务应该使用_labelIds.png

  10. 忽略边界区域

  11. 问题:Cityscapes 包含 boundary 标签,影响评估
  12. 解决:预处理时过滤边界像素或使用官方评估脚本

  13. 数据划分错误

  14. 问题:误用粗糙标注图像进行训练
  15. 解决:精细标注图像仅包含 2975 训练样本,注意区分

数据增强策略

针对 Cityscapes 的推荐增强组合:

  1. 几何变换:
  2. 随机水平翻转(p=0.5)
  3. 随机缩放(0.5-2.0)
  4. 随机裁剪

  5. 颜色变换:

  6. 亮度 / 对比度调整
  7. 添加高斯噪声

  8. 高级增强:

  9. 使用 Albumentations 库的 CutMix
  10. 天气模拟(添加雾效、雨滴)

进阶思考

  1. 如何利用粗糙标注的 20000 张图像提升模型性能?
  2. Cityscapes 的评估指标(如 mIoU)在真实自动驾驶场景中有哪些局限性?
  3. 如何设计一个同时处理语义分割和实例分割的多任务模型?

希望这篇指南能帮助你快速上手 Cityscapes 数据集。记住,实践出真知,遇到问题时不妨先查阅官方文档和论坛讨论。

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