coco数据集格式转yolo数据格式

一、coco数据集是什么?

COCO(Common Objects in Context)是一个广泛使用的目标检测和分割数据集,而YOLO(You Only Look Once)是一种流行的实时目标检测算法。

首先,导入了必要的库,包括jsonos。然后,定义了一个名为convert_coco_to_yolo的函数,用于将COCO数据转换为YOLO格式。该函数接受一个COCO数据的字典作为输入,并返回转换后的YOLO数据和类别字典。

在函数内部,提取了COCO数据中的图像列表、注释和类别信息。然后,创建了一个空的YOLO数据列表和一个用于存储类别名和序号映射关系的字典。

接下来,遍历图像列表,并获取图像的ID、文件名、宽度和高度。然后,根据图像ID筛选出与该图像相关的注释,并将它们存储在image_annotations列表中。

然后,遍历image_annotations列表,并提取注释的类别ID。通过在类别列表中查找与类别ID匹配的类别,可以获取类别的名称。如果找不到匹配的类别,则跳过该注释。

接下来,提取注释的边界框信息,并计算出边界框的中心坐标、归一化后的坐标和大小。将这些信息存储在yolo_annotations列表中。

如果存在YOLO注释,则按照类别序号对注释进行排序,并将图像的相关信息和注释存储在yolo_data列表中。

最后,返回转换后的YOLO数据和类别字典。

接下来,定义了几个变量,包括COCO数据文件的路径、文件名和保存目录的路径。然后,使用os.path.join函数构建了完整的文件路径。

通过检查文件是否存在,可以确保文件路径是有效的。如果文件存在,打开文件并加载其中的JSON数据。然后,调用convert_coco_to_yolo函数将COCO数据转换为YOLO数据。

使用os.makedirs函数创建保存目录,如果目录已经存在,则不进行任何操作。

接下来,生成了一个class.txt文件,用于存储类别的名称。遍历类别字典,并按照类别序号对字典进行排序。然后,将类别的名称写入文件中。

最后,遍历YOLO数据列表,并根据图像的文件名创建一个对应的.txt文件。然后,遍历注释列表,并将注释的类别和其他信息写入文件中。

最后,打印转换完成的消息,并显示保存目录的路径。如果文件不存在,则打印文件不存在的消息。

通过运行这个程序,可以将COCO数据集格式转换为YOLO格式,并将转换后的数据保存到指定的目录中。

这篇博客介绍了一个将COCO数据集格式转换为YOLO格式的Python程序。通过这个程序,可以轻松地处理COCO数据,并将其转换为适用于YOLO算法的格式。希望这个程序对你有所帮助!

二、完整代码

import json
import osdef convert_coco_to_yolo(coco_data):image_list = coco_data['images']annotations = coco_data['annotations']categories = coco_data['categories']yolo_data = []category_dict = {}  # 用于存储类别名和对应的序号for i, category in enumerate(categories):  # 构建类别名和序号的映射关系category_dict[category['name']] = ifor image in image_list:image_id = image['id']file_name = image['file_name']width = image['width']height = image['height']image_annotations = [ann for ann in annotations if ann['image_id'] == image_id]yolo_annotations = []for ann in image_annotations:category_id = ann['category_id']category = next((cat for cat in categories if cat['id'] == category_id), None)if category is None:continuebbox = ann['bbox']x, y, w, h = bboxx_center = x + w / 2y_center = y + h / 2normalized_x_center = x_center / widthnormalized_y_center = y_center / heightnormalized_width = w / widthnormalized_height = h / heightyolo_annotations.append({'category': category_dict[category['name']],  # 使用类别序号'x_center': normalized_x_center,'y_center': normalized_y_center,'width': normalized_width,'height': normalized_height})if yolo_annotations:yolo_annotations.sort(key=lambda x: x['category'])  # 按类别序号排序yolo_data.append({'file_name': file_name,'width': width,'height': height,'annotations': yolo_annotations})return yolo_data, category_dictpath = '/codeyard/yolov5_6.0/data_MS_1001labels'  # 修改为包含 via_export_coco.json 文件的目录路径
file_name = 'coco_filtered.json'  # 文件名
save_dir = '/codeyard/yolov5_6.0/data_MS_1001labels/labels'  # 保存目录
file_path = os.path.join(path, file_name)  # 完整文件路径if os.path.isfile(file_path):  # 检查文件是否存在with open(file_path, 'r', encoding='utf-8') as load_f:load_dict = json.load(load_f)yolo_data, category_dict = convert_coco_to_yolo(load_dict)os.makedirs(save_dir, exist_ok=True)  # 创建保存目录# 生成 class.txt 文件class_file_path = os.path.join(save_dir, 'classes.txt')with open(class_file_path, 'w', encoding='utf-8') as class_f:for category_name, category_index in sorted(category_dict.items(), key=lambda x: x[1]):class_f.write(f"{category_name}\n")for data in yolo_data:file_name = os.path.basename(data['file_name'])  # 提取文件名部分width = data['width']height = data['height']annotations = data['annotations']txt_file_path = os.path.join(save_dir, os.path.splitext(file_name)[0] + '.txt')with open(txt_file_path, 'w', encoding='utf-8') as save_f:for annotation in annotations:category = annotation['category']x_center = annotation['x_center']y_center = annotation['y_center']box_width = annotation['width']box_height = annotation['height']line = f"{category} {x_center:.6f} {y_center:.6f} {box_width:.6f} {box_height:.6f}\n"save_f.write(line)print("转换完成,保存到:", save_dir)
else:print("文件不存在:", file_path)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

87.乐理基础-记号篇-反复记号(一)反复、跳房子

内容参考于:三分钟音乐社 上一个内容:86.乐理基础-记号篇-速度记号-CSDN博客 首先是反复记号表总结图: 当前是写前两个记号,其余记号后面写:这些反复记号最主要的目的很简单,还是为了节约纸张&#xff0c…

蓝桥杯单片机组备赛——LED指示灯的基本控制

🎈教程介绍:博客依据b站小蜜蜂老师的教程进行编写,文中会对老师传授的知识进行总结并加入自己的一些理解。教程链接 文章目录 一、点灯介绍二、相关数字芯片介绍2.1 74HC138介绍2.2 74HC573介绍2.3 74HC02介绍 三、代码设计思路四、代码编写…

Spring MVC 异常处理器

异常处理器 如果不加以异常处理,错误信息肯定会抛在浏览器页面上,这样很不友好,所以必须进行异常处理。 异常处理思路 系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处…

解决跨域问题的8种方案(最新最全)

什么是跨域: 浏览器对于javascript的同源策略的限制,例如http://a.cn下面的js不能调用http://b.cn中的js,对象或数据(因为http://a.cn和http://b.cn是不同域),所以跨域就出现了.同域:简单的解释就是域名相同,端口相同,协议相同 为什么需要跨域? 在最一…

关于java方法定义的回顾

关于java方法定义的回顾 我们在上一篇文章中,对java的面向对象有了一个初步的理解,因为类里面方法是必不可少的,我们本篇文章对方法进行一个回顾,以便加深一下对方法的了解程度和使用😀。 我们把前面讲解到方法的文章…

LeetCode 590. N 叉树的后序遍历

590. N 叉树的后序遍历 给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。 示例 1: 输入:root [1,null,…

Redis优化和解决缓存问题

目录 redis的2种持久化方式 RDB持久化 AOF持久化 redis优化 redis的三大缓存问题 缓存雪崩的解决方案: 缓存穿透的解决方案: 缓存击穿的解决方案: 如何保证 MySQL 和 redis 的数据一致性? redis的2种持久化方式 RDB持久化…

C桑(Cython)从入门到入土(2): np数组操作对比

C桑(Cython)从入门到入土 2. np数组操作对比 Node sc518 Copy has image data of type unsigned long long实际上, 👆🏻这个错误是我探索Cython的缘起… code1: Form: 更现代的方法是使用内存视图而不是指针: cdef np.uint32_t[:,:,::1] …

The True Beauty; What is beauty;

Tiny syposis on Beauty Standards I) webpage addressII) text content excerption I) webpage address URL route II) text content excerption I am forensic artist 素描师(法医的), worked for the San Jose Police Department 警局,f…

一个神奇的SQL聚合查询案例

今天给大家分享一个 SQL 案例,假如存在以下两个表: CREATE TABLE t1 (val1 INT); INSERT INTO t1 VALUES (1), (2), (3);CREATE TABLE t2 (val2 INT); INSERT INTO t2 VALUES (10), (20), (30);每个表包含 3 条数据。请问,以下查询返回结果是…

在C++中控制调试信息的输出通常通过预处理指令(如 #define)和条件编译指令(如 #ifdef、#ifndef、#endif)来实现。

文章目录 在C中,控制调试信息的输出通常通过预处理指令(如 #define)和条件编译指令(如 #ifdef、#ifndef、#endif)来实现。这种方法提供了一种灵活的方式来包含或排除调试代码,而无需对代码本身进行大量修改…

【昕宝爸爸小模块】深入浅出之Java 8中的 Stream

深入浅出之Java 8中的 Stream 一、🟢典型解析1.1 🟠Java 8中的Stream 都能做什么1.2 🟠Stream的创建 二、✅ Stream中间操作2.1 🟠Filter2.2 🟠Map2.3 🟠limit / skip2.4 🟠sorted2.5 &#x1…

CCF模拟题 202309-1 坐标变换(其一)

问题描述 试题编号: 202309-1 试题名称: 坐标变换(其一) 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 对于平面直角坐标系上的坐标(x,y),小P定义了一个包含…

props传值问题

父组件和子组件同时展现 同步任务无需添加额外的代码&#xff0c;正常写&#xff0c;而异步任务需要添加下面的解决方案&#xff0c;因为异步任务需要等待响应才能进行赋值。 父组件&#xff1a; <div><UploadFile ref"child" :data"tableData"…

【C#】当重复使用一段代码倒计时时,使用普通类和静态方法,实现简单的封装性、可扩展性、可维护性

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

程序员找不到工作原因以及解决办法

程序员找不到工作原因以及解决办法 程序员当前就业环境真的很差&#xff0c;所以找工作跳槽一定要讲究方式方法&#xff0c;接下来我讲一下你找不着工作的原因以及解决办法&#xff0c;大家先点赞收藏&#xff0c;内容敏感我怕你刷不到 沟通200个全是未读那就是你的城市没有招聘…

静态长效代理IP和动态短效代理IP有哪些用途?分别适用场景是什么?

静态长效代理IP和动态短效代理IP是两种常见的代理IP类型&#xff0c;它们在用途和适用场景上存在一定的差异。了解它们的特性以及使用场景有助于我们更好地利用代理IP&#xff0c;提高网络访问的效率和安全性。 一、静态长效代理IP 1. 用途 静态长效代理IP是指长期保持稳定的代…

安全强化学习笔记

这里写自定义目录标题 参考资料环境算法CPO 2017 ICMLPCPO 2019 ICLRFOCOPS 2020 NIPSCRPO 2021 ICMLCUP 2022 NIPS TRPO 如何看懂TRPO里所有的数学推导细节? - 小小何先生的回答 - 知乎 参考资料 Safe Reinforcement Learning 安全/约束强化学习路线图&#xff08;Safe RL…

JVM相关问题及答案(2024)

1、什么是JVM&#xff0c;它是如何工作的&#xff1f; JVM&#xff08;Java虚拟机&#xff09;是Java编程语言的核心组件之一&#xff0c;它是一个虚拟机器&#xff0c;用于执行Java字节码。JVM的主要任务是将Java字节码翻译成特定平台的机器码&#xff0c;并在特定平台上运行…

Java的NIO

Java NIO&#xff08;New I/O&#xff0c;新 I/O&#xff09;是 Java 1.4 版本引入的一组用于进行非阻塞 I/O 操作的 API。相比于传统的 Java I/O&#xff08;或称为 IOStream&#xff09;&#xff0c;Java NIO 提供了更为灵活、可扩展和高性能的 I/O 处理方式。 Java NIO 的核…