cityscapes和foggy_cityscapes数据集使用记录

2023-11-19

cityscapes

数据集介绍

  • Cityscapes数据集则是由奔驰主推,提供无人驾驶环境下的图像分割数据集。用于评估视觉算法在城区场景语义理解方面的性能。Cityscapes包含50个城市不同场景、不同背景、不同季节的街景,提供5000张精细标注的图像、20000张粗略标注的图像、30类标注物体。用PASCAL VOC标准的 intersection-over-union (IoU)得分来对算法性能进行评价。 Cityscapes数据集共有fine和coarse两套评测标准,前者提供5000张精细标注的图像,后者提供5000张精细标注外加20000张粗糙标注的图像。
  • 该数据集包含如下:images_base和annotations_base分别对应这文件夹leftImg8bit(5,030 items, totalling 11.6 GB,factually 5000 items)和gtFine(30,030 items, totalling 1.1 GB)。里面都包含三个文件夹:train、val、test。总共5000张精细释,2975张训练图,500张验证图和1525张测试图。
  • 在leftImg8bit/train下有18个子文件夹对应德国的16个城市,法国一个城市和瑞士一个城市;在leftImg8bit/val下有3个子文件夹对应德国的3个城市;在leftImg8bit/test下有6个子文件夹对应德国的6个城市。
  • 在gtFine/train下有18个子文件夹对应leftImg8bit/train里面的文件夹,但是不一样的leftImg8bit里面的一张原图,对应着gtFine里面有6个文件分别是color.png、instanceIds.png、instanceTrainIds.png、labelIds.png、labelTrainIds.png、polygons.json(实际从官网下载到的数据集只有4个文件:color.png、instanceIds.png、labelIds.png、polygons.json)。
  • 数据集没有测试集,只有验证集,想得到测试结果需要提交模型在线测试。

下载数据集

可以参考Cityscapes使用方法,需要进入官网注册登录之后进行下载。

下载原图leftImg8bit_trainvaltest.zip和标签gtFine_trainvaltest.zip,实际下载得到的原图和标签的压缩包大小分别为11.6GB和252.6MB。
在这里插入图片描述
在这里插入图片描述
下载完成后进行解压。

gtFine_trainvaltest目录结构
在这里插入图片描述
leftImg8bit_trainvaltest目录结构
在这里插入图片描述

详细的类别和数量信息可以参考Cityscapes数据集介绍

cityscapes转voc格式

参考cityscapes-to-voc,根据我下载的数据路径进行了修改,使用python进行转换的代码如下。

由于只有验证集,没有测试集,这里将原cityscapes的train转成了voc格式中的trainval,将原cityscapes的val转成了voc的test,方便在本地直接进行训练和测试。

from pascal_voc_writer import Writer
import matplotlib.pyplot as plt
import numpy as np
import os
import json
import glob
import time
from shutil import move, copy

#------------------------
#function to make folder
#------------------------
def make_dir(path):
    if not os.path.isdir(path):
        os.makedirs(path)

#----------------------------------------------------------------------------------------------------------------
#convert polygon to bounding box
#code from:
#https://stackoverflow.com/questions/46335488/how-to-efficiently-find-the-bounding-box-of-a-collection-of-points
#----------------------------------------------------------------------------------------------------------------
def polygon_to_bbox(polygon):
    x_coordinates, y_coordinates = zip(*polygon)
    return [min(x_coordinates), min(y_coordinates), max(x_coordinates), max(y_coordinates)]


# --------------------------------------------
# read a json file and convert to voc format
# --------------------------------------------
def read_json(file):
    # if no relevant objects found in the image,
    # don't save the xml for the image
    relevant_file = False

    data = []
    with open(file, 'r') as f:
        file_data = json.load(f)

        for object in file_data['objects']:
            label, polygon = object['label'], object['polygon']

            # process only if label found in voc
            if label in classes_keys:
                polygon = np.array([x for x in polygon])
                bbox = polygon_to_bbox(polygon)
                data.append([classes[label]] + bbox)

        # if relevant objects found in image, set the flag to True
        if data:
            relevant_file = True

    return data, relevant_file


#---------------------------
#function to save xml file
#---------------------------
def save_xml(img_path, img_shape, data, save_path):
    writer = Writer(img_path,img_shape[0], img_shape[1])
    for element in data:
        writer.addObject(element[0],element[1],element[2],element[3],element[4])
    writer.save(save_path)



if __name__ == "__main__":

    #----------
    #arguments
    #----------
    cityscapes_dir = '/home/ecust/txx/dataset/object_detection_open_dataset/VOC/cityscapes'
    save_path = os.path.join(cityscapes_dir,"cityscapes_voc_format")

    cityscapes_dir_gt = os.path.join(cityscapes_dir, 'gtFine_trainvaltest', 'gtFine')


    #--------------------------------------------------------------
    # Valid classes dictionary.
    # motorcycle is not renamed to motorbike, change the key if this is
    # not is required
    #--------------------------------------------------------------
    classes = {'bicycle':'bicycle', 'bus':'bus', 'car':'car', 'motorcycle':'motorcycle',
                   'person':'person', 'rider': 'rider', 'train':'train', 'truck':'truck'}
    classes_keys = list(classes.keys())

    # ------------------------------------------
    # reading json files from each subdirectory
    # ------------------------------------------
    valid_files = []
    trainval_files = []
    test_files = []

    # make Annotations target directory if already doesn't exist
    ann_dir = os.path.join(save_path, 'VOC2007', 'Annotations')
    make_dir(ann_dir)

    count=0

    start = time.time()
    for category in os.listdir(cityscapes_dir_gt):

        # no GT for test data
        if category == 'test': continue

        for city in os.listdir(os.path.join(cityscapes_dir_gt, category)):

            # read files
            files = glob.glob(os.path.join(cityscapes_dir,'gtFine_trainvaltest', 'gtFine', category, city) + '/*.json')

            # process json files
            for file in files:
                data, relevant_file = read_json(file)

                if relevant_file:
                    count += 1
                    base_filename = os.path.basename(file)[:-21]
                    xml_filepath = os.path.join(ann_dir, base_filename + '_leftImg8bit.xml')
                    img_name = base_filename + '_leftImg8bit.png'
                    img_path = os.path.join(cityscapes_dir, 'leftImg8bit_trainvaltest', 'leftImg8bit', category, city,
                                            base_filename + '_leftImg8bit.png')
                    img_shape = plt.imread(img_path).shape
                    valid_files.append([img_path, img_name])

                    # make list of trainval and test files for voc format
                    # lists will be stored in txt files
                    trainval_files.append(img_name[:-4]) if category == 'train' else test_files.append(img_name[:-4])

                    # save xml file
                    save_xml(img_path, img_shape, data, xml_filepath)

    end = time.time() - start
    print('Total Time taken: ', end)
    print('file nums=',count)

    # ----------------------------
    # copy files into target path
    # ----------------------------
    images_savepath = os.path.join(save_path, 'VOC2007', 'JPEGImages')
    make_dir(images_savepath)

    start = time.time()
    for file in valid_files:
        copy(file[0], os.path.join(images_savepath, file[1]))

    # print('Total Time taken: ', end)

    # ---------------------------------------------
    # create text files of trainval and test files
    # ---------------------------------------------
    print("len trainval=",len(trainval_files))
    print("len test=", len(test_files))

    textfiles_savepath = os.path.join(save_path, 'VOC2007', 'ImageSets', 'Main')
    make_dir(textfiles_savepath)

    traival_files_wr = [x + '\n' for x in trainval_files]
    test_files_wr = [x + '\n' for x in test_files]

    with open(os.path.join(textfiles_savepath, 'trainval.txt'), 'w') as f:
        f.writelines(traival_files_wr)

    with open(os.path.join(textfiles_savepath, 'test.txt'), 'w') as f:
        f.writelines(test_files_wr)

Tips:

  • 由于cityscapes的test中没有标签,因此在转换过程中没有使用test数据;
  • 转换过程中剔除掉了负样本;
  • 转换前cityscapes的train对应voc格式的trainval,共2965张图像;转换前cityscapes的test对应voc格式的test,共492张图像;
  • 总数量为3457;

foggy_cityscapes

下载数据集

下载foggy_cityscapes dataset

下载leftImg8bit_trainvaltest_foggy.zip
在这里插入图片描述
解压后,leftImg8bit_trainvaltest_foggy的目录结构
在这里插入图片描述

foggy_cityscapes的标签就用cityscapes的标签gtFine_trainvaltest.zip,拷贝一份即可;

foggy_cityscapes转voc格式

参考上述cityscapes转voc的流程进行转换,按照同样的数据集划分方式,得到转换后的trainval数量为2965,test的数量为492,总数量为3457。

区别如下:

  • foggy_cityscapes没有标签,直接使用cityscapes的标签;
  • cityscapes的一张原图对应到foggy_cityscapes中有3张图,beita的参数不同,分别为0.005,0.01和0.02,分别进行转换可以得到3个foggy_cityscapes数据集,根据需要进行选择;

转换代码如下:

from pascal_voc_writer import Writer
import matplotlib.pyplot as plt
import numpy as np
import os
import json
import glob
import time
from shutil import move, copy

#------------------------
#function to make folder
#------------------------
def make_dir(path):
    if not os.path.isdir(path):
        os.makedirs(path)

#----------------------------------------------------------------------------------------------------------------
#convert polygon to bounding box
#code from:
#https://stackoverflow.com/questions/46335488/how-to-efficiently-find-the-bounding-box-of-a-collection-of-points
#----------------------------------------------------------------------------------------------------------------
def polygon_to_bbox(polygon):
    x_coordinates, y_coordinates = zip(*polygon)
    return [min(x_coordinates), min(y_coordinates), max(x_coordinates), max(y_coordinates)]


# --------------------------------------------
# read a json file and convert to voc format
# --------------------------------------------
def read_json(file):
    # if no relevant objects found in the image,
    # don't save the xml for the image
    relevant_file = False

    data = []
    with open(file, 'r') as f:
        file_data = json.load(f)

        for object in file_data['objects']:
            label, polygon = object['label'], object['polygon']

            # process only if label found in voc
            if label in classes_keys:
                polygon = np.array([x for x in polygon])
                bbox = polygon_to_bbox(polygon)
                data.append([classes[label]] + bbox)

        # if relevant objects found in image, set the flag to True
        if data:
            relevant_file = True

    return data, relevant_file


#---------------------------
#function to save xml file
#---------------------------
def save_xml(img_path, img_shape, data, save_path):
    writer = Writer(img_path,img_shape[0], img_shape[1])
    for element in data:
        writer.addObject(element[0],element[1],element[2],element[3],element[4])
    writer.save(save_path)



if __name__ == "__main__":

    #----------
    #arguments
    #----------

    # foggy_cityscapes
    beta=0.02
    foggy_cityscapes_dir = '/home/ecust/txx/dataset/object_detection_open_dataset/VOC/foggy_cityscapes'
    save_path = os.path.join(foggy_cityscapes_dir,"foggy_cityscapes_beta_{}_voc_format".format(beta))

    foggy_cityscapes_dir_gt = os.path.join(foggy_cityscapes_dir, 'gtFine_trainvaltest', 'gtFine')


    #--------------------------------------------------------------
    # Valid classes dictionary.
    # motorcycle is not renamed to motorbike, change the key if this is
    # not is required
    #--------------------------------------------------------------
    classes = {'bicycle':'bicycle', 'bus':'bus', 'car':'car', 'motorcycle':'motorcycle',
                   'person':'person', 'rider': 'rider', 'train':'train', 'truck':'truck'}
    classes_keys = list(classes.keys())

    # ------------------------------------------
    # reading json files from each subdirectory
    # ------------------------------------------
    valid_files = []
    trainval_files = []
    test_files = []

    # make Annotations target directory if already doesn't exist
    ann_dir = os.path.join(save_path, 'VOC2007', 'Annotations')
    make_dir(ann_dir)

    count=0

    start = time.time()
    for category in os.listdir(foggy_cityscapes_dir_gt):

        # no GT for test data
        if category == 'test': continue

        for city in os.listdir(os.path.join(foggy_cityscapes_dir_gt, category)):

            # read files
            files = glob.glob(os.path.join(foggy_cityscapes_dir,'gtFine_trainvaltest', 'gtFine', category, city) + '/*.json')

            # process json files
            for file in files:
                data, relevant_file = read_json(file)

                if relevant_file:
                    count += 1
                    base_filename = os.path.basename(file)[:-21]
                    xml_filepath = os.path.join(ann_dir, base_filename + '_leftImg8bit_foggy.xml')
                    img_name = base_filename + '_leftImg8bit_foggy.png'
                    img_path = os.path.join(foggy_cityscapes_dir, 'leftImg8bit_trainvaltest_foggy', 'leftImg8bit_foggy', category, city,
                                            base_filename + '_leftImg8bit_foggy_beta_{}.png'.format(beta))
                    img_shape = plt.imread(img_path).shape
                    valid_files.append([img_path, img_name])

                    # make list of trainval and test files for voc format
                    # lists will be stored in txt files
                    trainval_files.append(img_name[:-4]) if category == 'train' else test_files.append(img_name[:-4])

                    # save xml file
                    save_xml(img_path, img_shape, data, xml_filepath)

    end = time.time() - start
    print('Total Time taken: ', end)
    print('file nums=',count)

    # ----------------------------
    # copy files into target path
    # ----------------------------
    images_savepath = os.path.join(save_path, 'VOC2007', 'JPEGImages')
    make_dir(images_savepath)

    start = time.time()
    for file in valid_files:
        copy(file[0], os.path.join(images_savepath, file[1]))

    # print('Total Time taken: ', end)

    # ---------------------------------------------
    # create text files of trainval and test files
    # ---------------------------------------------
    print("len trainval=",len(trainval_files))
    print("len test=", len(test_files))

    textfiles_savepath = os.path.join(save_path, 'VOC2007', 'ImageSets', 'Main')
    make_dir(textfiles_savepath)

    traival_files_wr = [x + '\n' for x in trainval_files]
    test_files_wr = [x + '\n' for x in test_files]

    with open(os.path.join(textfiles_savepath, 'trainval.txt'), 'w') as f:
        f.writelines(traival_files_wr)

    with open(os.path.join(textfiles_savepath, 'test.txt'), 'w') as f:
        f.writelines(test_files_wr)

[1]:语义分割数据集详解(PASCAL-VOC2012,Vocbenchmark,Cityscapes)
[2]:深度学习数据集介绍及相互转换
[3]:Cityscapes数据集介绍
[4]:Cityscapes使用方法
[5]:cityscapes官网下载地址
[6]:cityscapes-to-voc

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cityscapes和foggy_cityscapes数据集使用记录 的相关文章

  • 网易某歌曲参数JS逆向分析,多图预警

    之前写过一篇网易云的文章 但是一直不过审 这几天搞QQ音乐的爬虫 JS逆向不是很顺利 有点忘了怎么搞了 所以今天打断点重搞一把网易云音乐 毕竟是之前搞过的 找加密函数 最下面有个url就是歌曲mp3文件的url 也就是目标url 接下来看这
  • shell 常量和变量拼接_PHP常量的定义和用法

    我们通常把不经常变的值定义成常量 常量一般用全部大写来表示 前面不加美元符号 也可减少团队开发的出错 那么define和const有什么区别呢 1 const是一个语言结构 而define是一个函数 可以通过第三个参数来指定是否区分大小写
  • php解决高并发问题

    转载 https www php cn php weizijiaocheng 350323 html 这篇文章说得很好 记录一下 我们通常衡量一个Web系统的吞吐率的指标是QPS Query Per Second 每秒处理请求数 解决每秒数
  • Nginx官方文档(四十五)【ngx_stream_core_module】

    ngx stream core module 示例配置 指令 listen preread buffer size preread timeout proxy protocol timeout resolver resolver timeo
  • java强制类型转换时异常(java.lang.ClassCastException)

    1 如果你的项目中出现如下情况 说明你的java类文件中你运用了强制转换 什么是强制转换也就是 你用一种类型接受了另一种类型 发生了类型转化 但是类型转换一般 都是向上转型的 如 int 转 double 还有 int 转 String 这

随机推荐

  • ipsvd arm交叉编译

    ipsvd arm交叉编译 ipsvd是什么 交叉编译 总结 ipsvd是什么 ipsvd全称是 internet protocol service daemons 即网际协议服务守护程序 常用的是udpsvd和tcpsvd 这两个既存在于
  • 数据结构笔记(十四)-- 串的模式匹配算法

    串的模式匹配算法 一 普通模式匹配算法 1 算法解析 普通模式匹配算法 其实现过程没有任何技巧 就是简单粗暴地拿一个串同另一个串中的字符一一比对 得到最终结果 例如 使用普通模式匹配算法判断串 T abcac 是否为串 S ababcabc
  • 将Eclipse项目导入到IntelliJ IDEA中

    打开IntelliJ IDEA 点击菜单栏的 File gt New gt Project from Existing Sources 在弹出的对话框中 选择Eclipse项目的根目录 并点击 OK 在下一个对话框中 选择 Create p
  • CentOS 8 安装screen

    CentOS 8安装不上screen 以为是yum源的问题 搞了半天才发现 要在CentOS 8上安装screen 先要安装EPEL库才可以 root centoss8 yum repos d yum y install screen La
  • python3-循环与判断

    1 gt 2 False 1 lt 2 lt 3 True 42 42 True Name name False M in Magic True number 12 number is 12 True Python比较运算符 以下假设变量a
  • 【编程基础】如何自学计算机/编程

    愚者困惑 智者提问 一 编程语言 二 编程技术体系 2 1 编程基础 2 1 1 操作系统 2 1 2 数据结构 2 1 3 编译原理 2 1 4 计算机组成原理 2 1 5 算法 2 2 编程语言 2 3 编程素质 2 3 1 编程规范
  • SQL server无法启动服务

    报错 在与SQL Server建立连接时出现与网络相关的或特定于实例的错误 切换到 依赖关系 选项卡 我们可以看见它与 SQL Server MSSQLSERVER 服务存在依赖关系 4 鼠标右键单击 SQL Server MSSQLSER
  • springboot注册到consul中报错:Spring MVC found on classpath, which is incompatible with Spring Cloud

    今天在做springboot整合成springCloud并注册到consul中时 发现若注册到consule中成功 则不能启动swagger 且不能提供任何API服务 要是能提供API服务则不能注册到consule中 并报错 Spring
  • Python怎么打包exe可执行文件?教你30秒轻松完成

    兄弟们 我来了 实在是太忙了 没得时间更新 太难了 之前看很多人都在问 Python怎么打包exe可执行文件 雀氏有点多 那么我来了 给大家整一个Python打包exe可执行文件的究极教程 当然 顺便再给它换个图标 首先把你的代码准备好 尽
  • qt之QCustomPlot动态更改曲线颜色,点击曲线标题名称

    一 前言 上篇文章介绍了如何调用qt自带的颜色画板 其实目的就是想更改一些颜色 本篇博客介绍更改QCustomPlot的曲线颜色 二 环境 qt5 7 mingw windows8 sqlite3 三 正文 首先在数据库中建好表 一行多列
  • 碳排放混合预测模型(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 二氧化碳排放力争于
  • [自然语言处理入门]-NLP中的注意力机制

    本章的主要内容有 注意力机制概述 传统注意力机制 注意力编码机制 1 注意力机制概述 注意力机制简单来说就是 加权求和机制 模块 加权求和模块 神经网络中的一个组件 可以单独使用 但更多地用作为 网络中的一部分 2 传统注意力机制 2 1
  • windows基线检测

    按照Windows基线检查模板检查设置windows安全机制 windows基线检查选项及风险等级 编号 检查选项 风险等级 适用类型 1 系统已安装最新的service pack 2 系统已经安装了最新的安全补丁 本地安全策略检查选项及风
  • java控制台聊天程序

    java控制台聊天程序 发送端 package ip chat import java io BufferedReader import java io InputStreamReader import java net DatagramP
  • Python中的filter()函数

    目录 一 描述 语法 返回值 二 实例 1 过滤出列表中的所有奇数 2 过滤出1 100中平方根是整数的数 一 描述 英文文档 filter function iterable Construct an iterator from thos
  • 01-----tcpdump抓包命令

    一 tcpdump抓包命令 关于tcpdump的抓包命令 非常的多 这里我只记录我平时开发时比较常用的抓包命令 当然后面可能不断的在本篇补上对应的内容 1 tcpdump的命令格式 tcpdump adeflnNOpqStvx c 数量 F
  • 大数据毕业设计 深度学习图像检索算法研究与实现 - python

    文章目录 0 前言 1 课题简介 2 图像检索介绍 1 无监督图像检索 2 有监督图像检索 3 图像检索步骤 4 应用实例 5 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答
  • oh-my-zsh的各种主题展示,你喜欢哪一个?

    pygmalion virtualenv blink mrtazz sonicradish skaro linuxonly gnzh tjkirch 带时间
  • 物联网毕设分享 - stm32单片机酒精浓度酒驾检测系统 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 MQ 3酒精乙醇传感器模块 SIM800C模块 5 软件说明 系统框图 6 部分核心代码 7 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕
  • cityscapes和foggy_cityscapes数据集使用记录

    cityscapes和foggy cityscapes数据集使用记录 cityscapes 数据集介绍 下载数据集 cityscapes转voc格式 foggy cityscapes 下载数据集 foggy cityscapes转voc格式