计算机视觉常用数据集Cityscapes的介绍、下载、转为YOLO格式进行训练

我在寻找Cityscapes数据集的时候花了一番功夫,因为官网下载需要用公司或学校邮箱邮箱注册账号,等待审核通过后才能进行下载数据集。并且一开始我也并不了解Cityscapes的格式和内容是什么样的,现在我弄明白后写下这篇文章,用于记录和分享。后续我还会在这个专栏发布如何使用YOLOv5\v9\v10\v11系列进行自己数据集的训练,可以订阅一波专栏。

计算机视觉常用数据集Foggy Cityscapes的介绍、下载、转为YOLO格式进行训练-CSDN博客文章浏览阅读1k次,点赞25次,收藏14次。大雾城市景观Foggy Cityscapes (F):Foggy Cityscapes是由 Cityscapes 生成的合成数据集,它旨在模拟和研究自动驾驶车辆在雾天条件下的性能,有三个级别的大雾天气(0.005,0.01,0.02),从轻微的雾到浓厚的雾,分别对应于600,300和150米的能见度范围。由于雾天条件下的能见度降低,图像中的许多目标会变得模糊不清,这对计算机视觉检测来说是一个挑战。Foggy Cityscapes 为研究人员提供了一个测试和改进算法的机会,以提高在恶劣条件下算法的鲁棒和准确性https://blog.csdn.net/m0_63294504/article/details/143357968

1Cityscapes介绍

城市景观Cityscapes(C):Cityscapes 收集了50个不同城市良好天气条件下的城市街景,总共包含5000张真实城市场景图像;其中3475张带标注信息的图像用于训练验证(2,975张图像用于训练,500张用于验证),剩下1525张无标注信息图像用于测试。除此之外,还有20000张弱注释的图像供研究使用。数据集中的图像分辨率为1024x2048,涵盖了30多个类别,包括车辆、行人、建筑物、道路等城市街景中常见的物体和场景;但常用8个类别:

classes = ['car', 'person', 'rider', 'truck', 'bus', 'train', 'motorcycle', 'bicycle']。

Cityscapes数据集是计算机视觉领域常用的数据集,它的高质量标注和丰富场景使其成为评估和训练算法的理想选择。

2、下载

官网下载地址:Cityscapes Dataset – Semantic Understanding of Urban Street Scenes

结尾有我的网盘数据下载方式,已经全部处理好了,可以直接用于YOLO格式的目标检测。

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

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

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

3gtCoarse.zip是粗略的注释信息,一般不使用。

3、转为YOLO格式

对于gtFine_trainvaltest.zip中的gtFine文件夹,我们找到json文件,然后使用下方代码可以将该图片的语义分割json标注转为YOLO格式的标注,将自己的数据集路径替换就行

import json
import os

from sympy import print_glsl

# 类别列表和类别字典
all_classes = ['car', 'person', 'rider', 'truck', 'bus', 'train', 'motorcycle', 'bicycle']
class_dict = {'car': 0, 'person': 1, 'rider': 2, 'truck': 3, 'bus': 4, 'train': 5, 'motorcycle': 6, 'bicycle': 7}

# 根目录
rootdir = 'D:/深度学习相关数据集/目标检测数据集/Cityscapes/gtFine_trainvaltest/gtFine/test'

# 输出目录
output_rootdir = 'D:/深度学习相关数据集/目标检测数据集/Cityscapes/YOLOLabels/test'


def position(pos):
    x = [point[0] for point in pos]
    y = [point[1] for point in pos]
    x_min = min(x)
    x_max = max(x)
    y_min = min(y)
    y_max = max(y)
    return float(x_min), float(x_max), float(y_min), float(y_max)


def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    return x * dw, y * dh, w * dw, h * dh


def convert_annotation(json_id, city_name):
    json_file_path = os.path.join(rootdir, city_name, '%s.json' % json_id)
    out_file_path = os.path.join(output_rootdir, city_name, '%s.txt' % json_id)

    if not os.path.exists(os.path.dirname(out_file_path)):
        os.makedirs(os.path.dirname(out_file_path))

    with open(json_file_path, 'r') as load_f:
        load_dict = json.load(load_f)

    w = load_dict['imgWidth']
    h = load_dict['imgHeight']
    objects = load_dict['objects']

    with open(out_file_path, 'w') as out_file:
        for obj in objects:
            labels = obj['label']
            if labels in class_dict:
                pos = obj['polygon']
                b = position(pos)
                bb = convert((w, h), b)
                cls_id = class_dict[labels]
                out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


def jsons_id(rootdir):
    a = []
    for parent, dirnames, filenames in os.walk(rootdir):
        for filename in filenames:
            if filename.endswith('.json'):
                filename_without_ext = os.path.splitext(filename)[0]
                a.append(filename_without_ext)
    return a


# 获取所有子目录
subdirs = [d for d in os.listdir(rootdir) if os.path.isdir(os.path.join(rootdir, d))]
# print(subdirs)
# ['aachen', 'bochum', 'bremen', 'cologne', 'darmstadt', 'dusseldorf', 'erfurt', 'hamburg', 'hanover', 'jena',
# 'krefeld', 'monchengladbach', 'strasbourg', 'stuttgart', 'tubingen', 'ulm', 'weimar', 'zurich']

# 为每个子目录生成YOLO格式的标注文件
for subdir in subdirs:
    names = jsons_id(os.path.join(rootdir, subdir))
    for json_id in names:
        convert_annotation(json_id, subdir)

4、json_to_YOLO结果可视化

当我们对所有图片的Json注释都转换完后,得到YOLO格式的文件夹,长这样:

这时我们可以运行以下代码,将原图与YOLO标注信息结合起来,得到带有边界框的图像,不要忘记修改你自己的数据集路径。

import cv2
import os

# 图片路径
# image_path = '../leftImg8bit_trainvaltest/leftImg8bit/train/aachen/aachen_000001_000019_leftImg8bit.png'
image_path = '../leftImg8bit_trainvaltest/images/val/munster_000167_000019.png'
# YOLO注释文件路径
# annotation_path = '../YOLOLabels/train/aachen/aachen_000001_000019_gtFine_polygons.txt'
annotation_path = '../leftImg8bit_trainvaltest/labels/val/munster_000167_000019.txt'

# 读取YOLO注释文件
with open(annotation_path, 'r') as file:
    lines = file.readlines()

# 读取图片
image = cv2.imread(image_path)
# 禁用窗口缩放
cv2.namedWindow('Image with Bounding Boxes', cv2.WINDOW_NORMAL)

# 类别名称列表
# class_names = ['car', 'person', 'rider', 'truck', 'bus', 'train', 'motorcycle', 'bicycle']
# 类别名称与ID的映射字典
class_dict = {0: 'car', 1: 'person', 2: 'rider', 3: 'truck', 4: 'bus', 5: 'train', 6: 'motorcycle', 7: 'bicycle'}
# 绘制边界框和类别标签
for line in lines:
    parts = line.strip().split()
    class_id = int(parts[0])
    print(f"class_id:{class_id}")
    x_center = float(parts[1])
    y_center = float(parts[2])
    width = float(parts[3])
    height = float(parts[4])

    # 将归一化的坐标转换为像素坐标
    x_min = int((x_center - width / 2) * image.shape[1])
    y_min = int((y_center - height / 2) * image.shape[0])
    x_max = int((x_center + width / 2) * image.shape[1])
    y_max = int((y_center + height / 2) * image.shape[0])

    # 获取类别名称
    class_name = class_dict[class_id]

    # 绘制边界框
    cv2.rectangle(image, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)

    # 绘制类别标签
    cv2.putText(image, class_name, (x_min, y_min - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

print(image.shape)
# 显示图片
cv2.imshow('Image with Bounding Boxes', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

得到的结果长这样:

5、对图像和标签命名统一化

相信有伙伴发现了,官网下载的文件中,对于json标注信息的命名规则是类似于这样的:berlin_000000_000019_gtFine_polygons.json,而图片的命名规则是类似于这样的:berlin_000000_000019_leftImg8bit.png。我们知道如果图像和标签的名称没有保持一致,那么在使用YOLO进行训练的时候,程序就会报错显示找不到标签。

我将图像和标签名称统一化后如下所示:

现在就可以直接进行训练了,还要注意的是,数据路径不能有中文,否则就会报以下错误。

Dataset not found , missing paths ['D:\\\\\\\\YOLO\\images\\val'] Traceback (most recent call last): File "E:\pythonCode\ObjectDetection\yolov9-main\train_dual.py", line 644, in <module> main(opt) File "E:\pythonCode\ObjectDetection\yolov9-main\train_dual.py", line 538, in main train(opt.hyp, opt, device, callbacks) File "E:\pythonCode\ObjectDetection\yolov9-main\train_dual.py", line 97, in train data_dict = data_dict or check_dataset(data) # check if None File "E:\pythonCode\ObjectDetection\yolov9-main\utils\general.py", line 537, in check_dataset raise Exception('Dataset not found ❌') Exception: Dataset not found ❌

数据配置文件长这样:

6、使用YOLOv9-m进行训练

我的GPU是4060Laptop,8GB显存,使用YOLOv9-m,batchsize=4,刚好可以训练,再多就爆显存了。2975训练集、500验证集。

7、个人下载方式

通过百度网盘分享的文件:CityScape
链接:https://pan.baidu.com/s/1fDy_c1nXRCsAUHAr9L7Ocg?pwd=zjlp 
提取码:zjlp

如果链接失效了,评论区告诉我一声哈。

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

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

相关文章

MariaDB MaxScale实现mysql8主从同步读写分离

一、MaxScale基本介绍 MaxScale是maridb开发的一个mysql数据中间件&#xff0c;其配置简单&#xff0c;能够实现读写分离&#xff0c;并且可以根据主从状态实现写库的自动切换&#xff0c;对多个从服务器能实现负载均衡。 二、MaxScale实验环境 中间件192.168.121.51MaxScale…

Python设计模式 - 原型模式

定义 原型模式是一种创建型设计模式&#xff0c;它可以通过复制现有对象来创建新对象&#xff0c;而不是直接实例化新的对象。 结构 抽象原型&#xff08;Prototype&#xff09;&#xff1a;声明 clone() 方法&#xff0c;以便派生类实现克隆自身的能力。具体原型&#xff08…

GWO优化决策树回归预测matlab

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;简称 GWO&#xff09;是一种群智能优化算法&#xff0c;由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出。该算法的设计灵感源自灰狼群体的捕食行为&#xff0c;核心思想是模仿灰狼社会的结构与行为模式。 在本…

Oracle的学习心得和知识总结(三十三)|Oracle数据库数据库的SQL ID的底层计算原理分析

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

Git(分布式版本控制系统)系统学习笔记【并利用腾讯云的CODING和Windows上的Git工具来实操】

Git的概要介绍 1️⃣ Git 是什么&#xff1f; Git 是一个 分布式版本控制系统&#xff08;DVCS&#xff09;&#xff0c;用于跟踪代码的变更、协作开发和管理项目历史。 由 Linus Torvalds&#xff08;Linux 之父&#xff09;在 2005 年开发&#xff0c;主要用于 代码管理。…

yum报错 Could not resolve host: mirrorlist.centos.org

检查dns 使用ping www.baidu.com &#xff0c;如果ping不通&#xff0c;检查/etc/resolv.conf文件中是否有&#xff1a; nameserver 8.8.8.8 nameserver 8.8.4.4 替换yum源 1.备份原始的 YUM 源配置文件&#xff1a; sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.r…

postgreSQL16.6源码安装

1.获取源码 从PostgreSQL: File Browser获取tar.bz2或者tar.gz源码 2.解压 tar xf postgresql-version.tar.bz2 roothwz-VMware-Virtual-Platform:/usr/local# tar xf postgresql-16.6.tar.bz2 roothwz-VMware-Virtual-Platform:/usr/local# ll 总计 24324 drwxr-xr-x 12 ro…

Machine Learning:Introduction

文章目录 Machine LearningTrainingStep 1.Contract Function with Unknown ParametersStep 2.Define Loss from Training DataStep 3.Optimization Linear ModelPiecewise Linear CurveBeyond Piecewise Liner?FunctionLossOptimization Model Deformation Machine Learning …

【Java】多线程和高并发编程(三):锁(下)深入ReentrantReadWriteLock

文章目录 4、深入ReentrantReadWriteLock4.1 为什么要出现读写锁4.2 读写锁的实现原理4.3 写锁分析4.3.1 写锁加锁流程概述4.3.2 写锁加锁源码分析4.3.3 写锁释放锁流程概述&释放锁源码 4.4 读锁分析4.4.1 读锁加锁流程概述4.4.1.1 基础读锁流程4.4.1.2 读锁重入流程4.4.1.…

使用redis实现 令牌桶算法 漏桶算法

流量控制算法&#xff0c;用于限制请求的速率。 可以应对缓存雪崩 令牌桶算法 核心思想是&#xff1a; 有一个固定容量的桶&#xff0c;里面存放着令牌&#xff08;token&#xff09;。每过一定时间&#xff08;如 1 秒&#xff09;&#xff0c;桶中会自动增加一定数量的令牌…

金媒婚恋交友系统V10.5的CRM操作提示:“您没有权限执行此操作”解决方法

大家都知道新年2.5日新版10.5已经升级了&#xff0c;这次升级相对以前更新内容相当重量级&#xff01;最突出的就是CRM系统的更新和UI改观吐槽的内容都改进了我愿意和大家分享代码和新得~关注我昵称就能知道我哦&#xff01;&#xff01; 出现原因&#xff1a;是这个红娘账号没…

ubuntu使用最佳流程2:ubuntu20.04安装cuda(多版本切换),cudnn,显卡驱动

cuda安装&#xff08;多版本cuda安装&#xff1a;可切换&#xff09; 查看系统硬件配置 查询Linux系统的版本号 lsb_release -a查询显卡型号 待更新下载 CUDA官方传送门 找到适合自己的命令行下载安装即可 安装 accept 第一个driver去掉&#xff08;点击enter&#xff…

Crowdin 在线本地化平台调用硅基流动AI预翻译

平台介绍 硅基流动&#xff08;AI服务平台&#xff09; 官网&#xff1a;https://siliconflow.cn/zh-cn/ 官方介绍 我主要使用&#xff1a;云服务平台 SilliconCloud 此平台已经将热门的开源大语言模型部署&#xff0c;花钱买额度&#xff0c;就能使用 API 最近有上线 Deep…

二、通义灵码插件保姆级教学-IDEA(使用篇)

一、IntelliJ IDEA 中使用指南 1.1、代码解释 选择需要解释的代码 —> 右键 —> 通义灵码 —> 解释代码 解释代码很详细&#xff0c;感觉很强大有木有&#xff0c;关键还会生成流程图&#xff0c;对程序员理解业务非常有帮忙&#xff0c;基本能做到哪里不懂点哪里。…

游戏引擎学习第97天

回顾昨天并计划今天 在这期节目中&#xff0c;主要讲解了光照的概念&#xff0c;并进一步讨论了法线贴图光照的实现。节目的内容大致分为几个部分&#xff1a; 光照的基础概述&#xff1a;讨论了光的工作原理以及如何在编程图形时需要考虑光照问题。尽管这些概念并没有深入到…

python+unity落地方案实现AI 换脸融合

先上效果再说技术结论&#xff0c;使用的是自行搭建的AI人脸融合库&#xff0c;可以离线不受限制无限次生成&#xff0c;有需要的可以后台私信python ai换脸融合。 TODO 未来的方向&#xff1a;3D人脸融合和AI数据训练 这个技术使用的是openvcinsighface&#xff0c;openvc…

Python——批量图片转PDF(GUI版本)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

AutoMQ 如何实现没有写性能劣化的极致冷读效率

前言 追赶读&#xff08;Catch-up Read&#xff0c;冷读&#xff09;是消息和流系统常见和重要的场景。 削峰填谷&#xff1a;对于消息来说&#xff0c;消息通常用作业务间的解耦和削峰填谷。削峰填谷要求消息队列能将上游发送的数据堆积住&#xff0c;让下游在容量范围内消费…

[AI]Mac本地部署Deepseek R1模型 — — 保姆级教程

[AI]Mac本地部署DeepSeek R1模型 — — 保姆级教程 DeepSeek R1是中国AI初创公司深度求索&#xff08;DeepSeek&#xff09;推出大模型DeepSeek-R1。 作为一款开源模型&#xff0c;R1在数学、代码、自然语言推理等任务上的性能能够比肩OpenAI o1模型正式版&#xff0c;并采用MI…

MariaDB *MaxScale*实现mysql8读写分离

1.MaxScale 是干什么的&#xff1f; MaxScale是maridb开发的一个mysql数据中间件&#xff0c;其配置简单&#xff0c;能够实现读写分离&#xff0c;并且可以根据主从状态实现写库的自动切换&#xff0c;对多个从服务器能实现负载均衡。 2.MaxScale 实验环境 中间件192.168.12…