【数据集映射】(含完整可行Python代码)Yolo格式数据(txt)转RCNN格式数据(coco)

news/2024/7/10 22:40:17 标签: YOLO, coco, json, rcnn

1:需求背景

目标检测研究中,通常不同的模型需要不同的数据格式,如yolo需要txt、rcnn需要coco等,因此就需要对标注的数据格式进行转换。

通常的数据格式有txt、coco(json)、Pascal VOC、xml等。

本文的需求是txt转coco,下面提供一种可行的代码(可完全复制)

2:格式转换代码

需要修改的内容是:

1:图像和txt数据集的路径。这个是自己配制的,一般在dataset里面。将图像路径赋给images_dir,txt路径赋给annotations_dir即可。

# 路径配置(根据自己的路径修改)
images_dir = ""
annotations_dir = ""

2:categories内的映射字典。详情可以打开自己的txt文件,查看每一类对应的class_number,例如我们这里的yolo格式中的GD图像分类编号对应0,则映射字典出设置为【0: "xxx",】,其他内容同理。

# 类别映射字典(根据自己的内容修改)
categories = {
    0: "xxx",
}

# 后面可以加1、2、3...

3:数据集图像的大小参数。在以下位置处的【image_width】和【image_height】替换为自己图像的分辨率。

# TODO: 如果每张图片的大小都一样,你可以在这里指定
        # 如果大小不一样,你需要读取图片文件来获取实际尺寸
        image_width = 960
        image_height = 960

4:json文件的保存位置。在以下位置处的路径【'xxx.json'】修改为自己的想要存放的绝对路径/相对路径即可。

# 将COCO数据结构写入JSON文件(保存的json路径自己修改)
with open('xxx.json', 'w') as json_file:
    json.dump(coco_output, json_file, indent=4)

完整代码如下: 

import json
import os

# 路径配置(根据自己的路径修改)
images_dir = '/home/ubuntu/datasets'
annotations_dir = '/home/ubuntu/datasets'

# 类别映射字典(根据自己的内容修改)
categories = {
    0: "xxx",
}

# COCO格式的基本结构
coco_output = {
    "info": {},
    "licenses": [],
    "images": [],
    "annotations": [],
    "categories": [{"id": k, "name": v, "supercategory": ""} for k, v in categories.items()]
}

# 图片和标注的ID计数器
image_id = 1
annotation_id = 1

# 遍历annotations目录下的所有TXT文件
for filename in os.listdir(annotations_dir):
    if filename.endswith('.txt'):
        # 假设文件名与图片文件名一致(不包含扩展名)
        image_filename = filename.replace('.txt', '.jpg')
        image_path = os.path.join(images_dir, image_filename)
        
        # TODO: 如果每张图片的大小都一样,你可以在这里指定
        # 如果大小不一样,你需要读取图片文件来获取实际尺寸
        image_width = 960
        image_height = 960
        
        # 添加图片信息到COCO数据结构
        coco_output['images'].append({
            "id": image_id,
            "file_name": image_filename,
            "width": image_width,
            "height": image_height
        })
        
        # 读取每个TXT文件并添加标注信息
        txt_file_path = os.path.join(annotations_dir, filename)
        with open(txt_file_path, 'r') as file:
            for line in file:
                class_id, x_center, y_center, width, height = map(float, line.strip().split())
                
                # COCO要求bbox是[x_min, y_min, width, height],而不是中心点坐标
                x_min = (x_center - width / 2) * image_width
                y_min = (y_center - height / 2) * image_height
                width = width * image_width
                height = height * image_height
                
                # 添加标注信息
                coco_output['annotations'].append({
                    "id": annotation_id,
                    "image_id": image_id,
                    "category_id": class_id,
                    "bbox": [x_min, y_min, width, height],
                    "area": width * height,
                    "segmentation": [],  # 如果你有分割信息可以在这里添加
                    "iscrowd": 0
                })
                
                annotation_id += 1
        
        # 更新图片ID
        image_id += 1

# 将COCO数据结构写入JSON文件(保存的json路径自己修改)
with open('xxx.json', 'w') as json_file:
    json.dump(coco_output, json_file, indent=4)

print("Conversion completed!")


http://www.niftyadmin.cn/n/5155572.html

相关文章

踩坑记录一

先呼自己两耳巴 临床采集的增强CT数据,有时候是同时采集了静脉期和动脉期。就会导致图像多一分如下: 但是勾画的时候,是以下面的期相进行标注的。所以在训练分割,对于这种案例,他识别到了在上面一个期相的目标位置&am…

Go中读取文件

文件读取是任何编程语言中最常见的操作之一。在本教程中,我们将了解如何使用 Go 读取文件。 本教程有以下部分。 将整个文件读入内存 使用绝对文件路径将文件路径作为命令行标志传递将文件捆绑在二进制文件中 分块读取文件逐行读取文件 将整个文件读入内存 最基…

NowCoder | 链表中倒数第k个结点

NowCoder | 链表中倒数第k个结点 OJ链接 思路:定义两个快慢指针,让快指针先提前走k个节点,然后再让慢结点和快结点一起走,当快指针 NULL时,慢指针就是倒数第k个节点 代码如下: struct ListNode* FindK…

Why Java ?

大家好,我是伍六七。 今天我们来讲讲 Java 出现的历史原因,以及为什么 Java 现在还这么火? 一、Java 编程语言的背景、初衷和目标 Java 编程语言最初由 Sun Microsystems(现在是 Oracle Corporation)于 1995 年推出…

.net core 到底行不行!超高稳定性和性能的客服系统:性能实测

业余时间用 .net core 写了一个升讯威在线客服系统。并在博客园写了一个系列的文章,介绍了这个开发过程。 我把这款业余时间写的小系统丢在网上,陆续有人找我要私有化版本,我都给了,毕竟软件业的初衷就是免费和分享,后…

CORS 跨域访问, 实现跨域的原理, CORS漏洞利用

CORS跨域, 实现跨域的原理, CORS漏洞利用 一, CORS跨域的原理 1. 跨域实验 202服务器: <?php $person array("name" > "John Doe","age" > 30,"occupation" > "Developer" );$jsonString json_encode($p…

海外服务器和国内的几大差别!如何选择一款优质的海外服务器?

随着互联网的普及&#xff0c;越来越多的企业或者个人都在搭建自己的网站&#xff0c;而对于搭建网站来说&#xff0c;选择一款合适的服务器显得至关重要。那么许多小伙伴可能都在纠结的一个问题是&#xff0c;海外服务器和国内服务器有什么区别&#xff1f;我们是否应该选择一…

vue element admin master 去掉登陆

vue element admin master 去掉登陆 修改/src/permission.js import router from ./router import store from ./store import { Message } from element-ui import NProgress from nprogress // progress bar import nprogress/nprogress.css // progress bar style import {…