Cityscapes数据集:如何将像素级的多边形标注的分割数据标注转为目标检测的bbox标注

Cityscapes数据集官网下载地址:

https://www.cityscapes-dataset.com/

相关介绍:从官网下载这三个压缩包文件leftImg8bit_trainvaltest.zip、gtCoarse.zip、gtFine_trainvaltest.zip

1)leftImg8bit_trainvaltest.zip分为train、val以及test三个文件夹,共包含了5000张图像;

2)gtFine_trainvaltest.zip是精细化的注释信息,在其精细标注数据集文件夹(gtFine)中,也有train、val以及test三个文件夹,每张图片对应四个标注文件:用于可视化的彩色标注图(_color.png)、用于实例分割的实例I图(_instanceIds.png)、用于语义分割的标签图(_labelsIds.png)以及包含原始人工标注信息的JSON文件(_polygons.json)等;
在这里插入图片描述

Cityscapes数据集简单介绍:

城市街景数据集 Cityscapes © 收集了来自 50 个不同城市、良好天气条件下的街景,共包含 5000 张高分辨率(1024x2048)图像。其中 3475 张带标注的图像用于训练和验证(2975 张用于训练,500 张用于验证),1525 张未标注图像用于测试。此外,数据集中还提供了 20000 张弱标注图像供研究使用。该数据集涵盖 30 多种类别,主要包括城市街景中的车辆、行人、建筑物、道路等常见物体和场景。

实例分割数据集改造为目标检测数据集

将分割数据中的像素级多边形标注转换为目标检测的边界框(bbox)标注,其实并不复杂。每个分割目标的多边形标注由多个像素点的 [x, y] 坐标组成,只需找到这些坐标的 Xmin, Ymin, Xmax, 和 Ymax 值,就能确定该目标的边界框
在这里插入图片描述
结果:
在这里插入图片描述

preprocess.py代码如下

import os
import glob
from shutil import copy2
from PIL import Image
import json
import numpy as np

def copy_file(src, src_ext, dst):
    # find all files ends up with ext
    flist = sorted(glob.glob(os.path.join(src, '*', src_ext)))
    for fname in flist:
        src_path = os.path.join(src, fname)
        copy2(src_path, dst)
        print('copied %s to %s' % (src_path, dst))

def construct_box(inst_root, inst_name, cls_name, dst):
    inst_list = sorted(glob.glob(os.path.join(inst_root, '*', inst_name)))
    cls_list = sorted(glob.glob(os.path.join(inst_root, '*', cls_name)))
    for inst, cls in zip(*(inst_list, cls_list)):
        inst_map = Image.open(os.path.join(inst_root, inst))
        inst_map = np.array(inst_map, dtype=np.int32)
        cls_map = Image.open(os.path.join(inst_root, cls))
        cls_map = np.array(cls_map, dtype=np.int32)
        H, W = inst_map.shape
        # get a list of unique instances
        inst_info = {'imgHeight':H, 'imgWidth':W, 'objects':{}}
        inst_ids = np.unique(inst_map)
        for iid in inst_ids: 
            if int(iid) < 1000: # filter out non-instance masks
                continue
            ys,xs = np.where(inst_map==iid)
            ymin, ymax, xmin, xmax = \
                    ys.min(), ys.max(), xs.min(), xs.max()
            cls_label = np.median(cls_map[inst_map==iid])
            inst_info['objects'][str(iid)] = {'bbox': [int(xmin), int(ymin), int(xmax), int(ymax)],
                                              'cls': int(cls_label)}
        # write a file to path
        filename = os.path.splitext(os.path.basename(inst))[0]
        savename = os.path.join(dst, filename + '.json')
        with open(savename, 'w') as f:
            json.dump(inst_info, f)
        print('wrote a bbox summary of %s to %s' % (inst, savename))

# organize image
if __name__ == '__main__':
    folder_name = 'datasets/cityscape/'
    train_img_dst = os.path.join(folder_name, 'train_img')
    train_label_dst = os.path.join(folder_name, 'train_label')
    train_inst_dst = os.path.join(folder_name, 'train_inst')
    train_bbox_dst = os.path.join(folder_name, 'train_bbox')
    val_img_dst = os.path.join(folder_name, 'val_img')
    val_label_dst = os.path.join(folder_name, 'val_label')
    val_inst_dst = os.path.join(folder_name, 'val_inst')
    val_bbox_dst = os.path.join(folder_name, 'val_bbox')

    if not os.path.exists(train_img_dst):
        os.makedirs(train_img_dst)
    if not os.path.exists(train_label_dst):
        os.makedirs(train_label_dst)
    if not os.path.exists(train_inst_dst):
        os.makedirs(train_inst_dst)
    if not os.path.exists(val_img_dst):
        os.makedirs(val_img_dst)
    if not os.path.exists(val_label_dst):
        os.makedirs(val_label_dst)
    if not os.path.exists(val_inst_dst):
        os.makedirs(val_inst_dst)

    root = "G:\Dataset\cityscapes"
    # # train_image
    # copy_file('G:/Dataset/cityscapes/leftImg8bit/train',\
    #         '*_leftImg8bit.png', train_img_dst)
    # # train_label
    # copy_file('G:/Dataset/cityscapes/gtFine/train',\
    #         '*_labelIds.png', train_label_dst)
    # # train_inst
    # copy_file('G:/Dataset/cityscapes/gtFine/train',\
    #         '*_instanceIds.png', train_inst_dst)
    # # val_image
    # copy_file('G:/Dataset/cityscapes/leftImg8bit/val',\
    #         '*_leftImg8bit.png', val_img_dst)
    # # val_label
    # copy_file('G:/Dataset/cityscapes/gtFine/val',\
    #         '*_labelIds.png', val_label_dst)
    # # val_inst
    # copy_file('G:/Dataset/cityscapes/gtFine/val',\
    #         '*_instanceIds.png', val_inst_dst)

    if not os.path.exists(train_bbox_dst):
        os.makedirs(train_bbox_dst)
    if not os.path.exists(val_bbox_dst):
        os.makedirs(val_bbox_dst)
    # wrote a bounding box summary 
    construct_box('G:/Dataset/cityscapes/gtFine/train',\
            '*_instanceIds.png', '*_labelIds.png', train_bbox_dst)
    construct_box('G:/Dataset/cityscapes/gtFine/val',\
            '*_instanceIds.png', '*_labelIds.png', val_bbox_dst) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905944.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NVR批量管理平台EasyNVR多品牌NVR管理工具/设备关于远程控制的详细介绍

在数字化安防时代&#xff0c;视频监控技术已成为维护公共安全、提升管理效能的重要基石。随着科技的飞速发展&#xff0c;流媒体技术和视频监控正经历着前所未有的变革与融合。NVR批量管理平台EasyNVR&#xff0c;作为一款基于“云-边-端”一体化架构的视频融合云平台&#xf…

理解原子变量之一:从互斥锁到原子变量,最粗浅的认识

目录 三个实例对比 结论 多线程编程对于程序员来说&#xff0c;是一项非常重要的技能。在C11标准问世之前&#xff0c;C标准是不支持多线程的。在C11出台前&#xff0c;如果你想在linux平台进行多线程编程&#xff0c;就要使用linux的多线程库pthread&#xff0c;而pthread是…

eBay自养号测评养成攻略:从环境系统搭建到养号下单

eBay账号在测评中的重要性不言而喻&#xff0c;然而&#xff0c;新注册的账号往往面临被封禁或下单即封的风险。如何养成稳定的买家号&#xff0c;成为众多商家关注的焦点。以下将详细讲解eBay测评中如何稳定养成买家号。 一、账号注册后的初期养护 新注册的eBay账号&#xf…

Docker(二):Docker的基本使用

1 Docker的基本使用 1.1 镜像相关操作 1、从DockerHub搜索镜像 [rootmaster ~]# docker search centos # 镜像名字 描述 星标 是否官方&#xff08;有OK表示为官方镜像&#xff09; NAME …

【hector mapping参数设置】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 hector mapping部分参数介绍调整hector_mapping中的参数ros常见问题总结 hector mapping部分参数介绍 在wiki.ros.org/hector_mapping界面找到3.1.4 Parameters章节…

使用wordcloud与jieba库制作词云图

目录 一、WordCloud库 例子&#xff1a; 结果&#xff1a; 二、Jieba库 两个基本方法 jieba.cut() jieba.cut_for_serch() 关键字提取&#xff1a; jieba.analyse包 extract_tags() 一、WordCloud库 词云图&#xff0c;以视觉效果提现关键词&#xff0c;可以过滤文本…

ios Framework版本号的问题。

自己创建的framework和普通的app的版本号设置的地方是有所有不同的。 framework 的版本号是在 TARGETS -> Build Settings -> current Project Version 这个地方设置的&#xff0c; 在创建framework的时候xcode 会自动创建一个framework.h的文件名&#xff0c;framewo…

Axure设计之多级菜单导航教程(中继器)

在数字化时代&#xff0c;优化产品设计&#xff0c;提升用户界面交互&#xff0c;是产品设计着重考虑的点。针对传统菜单导航复杂繁琐的问题&#xff0c;本设计提出了一套灵活的菜单导航方案&#xff0c;结合中继器与动态面板&#xff0c;实现一键搜索、菜单收藏、多级菜单导航…

真题总结和整理

补码的符号位在最高位 IEEE754 规格化要求 小数点前面是1,其他的认为是小数点后面为1即可 计算之前要对阶 左移和右移在寄存器中如果未说明定点数,可以通过移动小数点实现 涉及最小帧长要记得除以2 求用于外设的时钟周期数 指令两端只允许有寄存器,间接寻址要通过MA…

计组-层次化存储结构

这里主要看存储的整体结构&#xff0c;cache&#xff0c;内存 这里看存储结构是按什么样的层次来划分存储结构&#xff0c;速度由慢到快&#xff0c;容量由大到小&#xff0c;这是基于性价比的考虑&#xff0c;所以分为多级多层次&#xff0c;可以做到提高速度的同时没有增加多…

Rust整合Elasticsearch

Elasticsearch是什么 Lucene&#xff1a;Java实现的搜索引擎类库 易扩展高性能仅限Java开发不支持水平扩展 Elasticsearch&#xff1a;基于Lucene开发的分布式搜索和分析引擎 支持分布式、水平扩展提高RestfulAPI&#xff0c;可被任何语言调用 Elastic Stack是什么 ELK&a…

CoTAM——思维属性操纵链,一种利用大规模语言模型的新的高效快速学习方法

概述 近年来&#xff0c;大规模语言模型已显示出惊人的能力&#xff0c;可以从少量样本中学习。然而&#xff0c;这种能力需要昂贵的大规模模型&#xff0c;其运行成本是一大挑战。此外&#xff0c;在推理过程中&#xff0c;需要对所有测试输入的上下文&#xff08;包括演示&a…

Chromium 中chrome.topSites扩展接口定义c++

一、chrome.topSites 使用 chrome.topSites API 访问新标签页上显示的热门网站&#xff08;即最常访问的网站&#xff09;。不包括用户自定义的快捷方式。 权限 topSites 您必须声明“topSites”扩展程序清单中授予使用此 API 的权限。 {"name": "My exten…

物联网设备如何助力实现高效远程老人监护

在发达国家&#xff0c;老龄化进程加速&#xff0c;老年人常需医疗、行动辅助、安全保障及个人卫生护理&#xff0c;费用高昂。传统老人监护依赖护士或助理现场照料&#xff0c;而物联网远程监控方案能有效改进此模式。它通过运用传感器等技术&#xff0c;实现全天候低成本实时…

NPM 包开发与优化全面指南

前言 Hey, 我是 Immerse系列文章首发于【Immerse】&#xff0c;更多内容请关注该网站转载说明&#xff1a;转载请注明原文出处及版权声明&#xff01; 1. 理解 NPM 包的结构 1.1 package.json 文件&#xff1a;包的核心 package.json文件是 NPM 包的中央配置&#xff0c;定…

基于redis实现延迟队列

Redis实现延时队列 延时队列里装的主要是延时任务&#xff0c;用延时队列来维护延时任务的执行时间。 1、延时队列有哪些使用情景&#xff1f; 1、如果请求加锁没加成功 可以将这个请求扔到延时队列里&#xff0c;延后处理。 2、业务中有延时任务的需要 比如说&#xff0…

探索Python安全字符串处理的奥秘:MarkupSafe库揭秘

文章目录 探索Python安全字符串处理的奥秘&#xff1a;MarkupSafe库揭秘第一部分&#xff1a;背景介绍第二部分&#xff1a;MarkupSafe是什么&#xff1f;第三部分&#xff1a;如何安装MarkupSafe&#xff1f;第四部分&#xff1a;MarkupSafe的简单使用方法1. 使用escape函数2.…

Docker(一):Docker简介及安装

目录 1 Docker简介1.1 容器跟虚拟机的区别1、虚拟机是什么2、容器是什么3、容器和虚拟机的区别 1.2 为什么要学习容器1.3 Docker 是什么 2 Docker安装2.1 安装docker-centos71、环境初始化2、安装docker-ce3、配置docker镜像加速器 2.2 安装docker-ubuntu22.041、安装2、添加镜…

scp免密传输教程

scp免密传输教程 为了在使用 scp 命令时不需要输入密码&#xff0c;通常的做法是通过设置 SSH 公钥认证来实现。这种方法不仅避免了每次都要输入密码的麻烦&#xff0c;而且也更加安全。下面是如何设置 SSH 公钥认证的步骤&#xff1a; 1. 生成 SSH 密钥对&#xff08;如果你…

使用Postman发送POST请求的指南

作为一名软件测试工程师&#xff0c;掌握如何使用Postman发送POST请求是非常重要的技能。POST请求通常用于向服务器发送数据&#xff0c;以创建或更新资源。本文将详细介绍如何在Postman中发送POST请求&#xff0c;帮助你高效地进行接口测试。 什么是POST请求&#xff1f; PO…