bop数据合并到COCO

news2024/11/18 8:49:32

bop数据合并到COCO

  • JSON转TXT
  • 重命名
  • txt文件中类别信息的转换

JSON转TXT


import json
import os,glob



categories = [
        {
            "id": 12,
            "name": "OREO",
            "supercategory": "icbin"
        },
        {
            "id": 16,
            "name": "Paper Cup",
            "supercategory": "icbin"
        },
        {
            "id": 4,
            "name": "School Glue",
            "supercategory": "icbin"
        },
        {
            "id": 7,
            "name": "Straw Cups",
            "supercategory": "icbin"
        },
        {
            "id": 9,
            "name": "Highland",
            "supercategory": "icbin"
        },
        {
            "id": 10,
            "name": "Soueakair",
            "supercategory": "icbin"
        },
        {
            "id": 2,
            "name": "Cheez-it",
            "supercategory": "icbin"
        },
        {
            "id": 1,
            "name": "Copper Plus",
            "supercategory": "icbin"
        },
        {
            "id": 8,
            "name": "Stir Stick",
            "supercategory": "icbin"
        },
        {
            "id": 14,
            "name": "Stanley",
            "supercategory": "icbin"
        },
        {
            "id": 3,
            "name": "Crayola",
            "supercategory": "icbin"
        },
        {
            "id": 13,
            "name": "Mirado",
            "supercategory": "icbin"
        },
        {
            "id": 11,
            "name": "Munchkin",
            "supercategory": "icbin"
        },
        {
            "id": 6,
            "name": "Greenies",
            "supercategory": "icbin"
        },
        {
            "id": 5,
            "name": "White Board Cake",
            "supercategory": "icbin"
        },
        {
            "id": 15,
            "name": "Main Arm",
            "supercategory": "icbin"
        }
    ]

def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = box[0] + box[2] / 2.0
    y = box[1] + box[3] / 2.0
    w = box[2]
    h = box[3]
 
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)
 
def to_yolo(data_path):
    json_path=data_path+'/scene_gt_coco.json' 
    save_path = data_path+ '/labels/'

    json_file =   json_path # COCO Object Instance 类型的标注
    ana_txt_save_path = save_path  # 保存的路径
 
    data = json.load(open(json_file, 'r'))
    if not os.path.exists(ana_txt_save_path):
        os.makedirs(ana_txt_save_path)
    id_map = {} # coco数据集的id不连续!重新映射一下再输出!
    print(data['categories'])
    # # categories = sorted(data['categories'], key=lambda x: x['id'])

    for i, category in enumerate(categories): 
        # id_map[category['id']] = int(category['id'])
        id_map[category['id']] = i
    # 通过事先建表来降低时间复杂度
    max_id = 0
    for img in data['images']:
        max_id = max(max_id, img['id'])
    # 注意这里不能写作 [[]]*(max_id+1),否则列表内的空列表共享地址
    img_ann_dict = [[] for i in range(max_id+1)] 
    for i, ann in enumerate(data['annotations']):
        img_ann_dict[ann['image_id']].append(i)
 
    for img in data['images']:
        filename = img["file_name"]
        img_width = img["width"]
        img_height = img["height"]
        img_id = img["id"]
        head, tail = os.path.splitext(filename)
        ana_txt_name = head.split('/')[-1] + ".txt"  # 对应的txt名字,与jpg一致
        f_txt = open(os.path.join(ana_txt_save_path, ana_txt_name), 'w')
        '''for ann in data['annotations']:
            if ann['image_id'] == img_id:
                box = convert((img_width, img_height), ann["bbox"])
                f_txt.write("%s %s %s %s %s\n" % (id_map[ann["category_id"]], box[0], box[1], box[2], box[3]))'''
        # 这里可以直接查表而无需重复遍历
        for ann_id in img_ann_dict[img_id]:
            ann = data['annotations'][ann_id]
            box = convert((img_width, img_height), ann["bbox"])
            
            f_txt.write("%s %s %s %s %s\n" % (id_map[ann["category_id"]], box[0], box[1], box[2], box[3]))
        f_txt.close()
    print(f'==> coco to yolo images:{len(data["images"])}, save path: {save_path}')

    
def train_val_test(data_path):
    sets = ['train','val','test']#生成txt的文件名称

    image_ids = glob.glob(os.path.join(data_path, 'images', '*.jpg'))

    train_ratio = 0.7  # 训练集比例
    val_ratio = 0.2  # 验证集比例
    test_ratio = 0.1  # 测试集比例

    train_size = int(len(image_ids) * train_ratio)
    val_size = int(len(image_ids) * val_ratio)
    test_size = len(image_ids) - train_size - val_size

    data  = [image_ids[:train_size], image_ids[train_size:train_size + val_size], image_ids[train_size + val_size:]]
    
    

    for i, image_set in enumerate(sets):
    
        image_ids = data[i]
        list_file = open(data_path+'/%s.txt' % (image_set), 'w')
        for image_id in image_ids:
            image_id = image_id.replace('/rgb','/images')
            list_file.write(image_id + "\n")
            # convert_annotation(image_id)
        # 关闭文件
        list_file.close()
    
    print(f'==> train image: {train_size}')
    print(f'==> valid image: {val_size}')
    print(f'==> test  image: {test_size}')

if __name__ == '__main__':
    data_path = 'H:/Dataset/COCO/train_pbr/000002'
    to_yolo(data_path)
    train_val_test(data_path)
    # print([cat['name'] for cat in categories])

在这里插入图片描述

重命名

以00000061*开头

在这里插入图片描述

txt文件中类别信息的转换

加79(从0开始,80类的COCO)

import codecs
import os

path = 'H:/Dataset/COCO/train_pbr/000002/labelNew/'  # 标签文件train路径
m = os.listdir(path)
# 读取路径下的txt文件
for n in range(0, len(m)):
    t = codecs.open('H:/Dataset/COCO/train_pbr/000002/labelNew/' + m[n], mode='r', encoding='utf-8')
    line = t.readline()  # 以行的形式进行读取文件
    list1 = []
    while line:
        a = line.split()
        list1.append(a)
        line = t.readline()
    t.close()

    lt = open('H:/Dataset/COCO/train_pbr/000002/labelNew/' + m[n], "w")
    for num in range(0, len(list1)):
        list1[num][0] = str(int(list1[num][0])+79)  # 第一列为0时,将0改为1
        lt.writelines(' '.join(list1[num]) + '\n')  # 每个元素以空格间隔,一行元素写完并换行
    lt.close()
    print(m[n] + " 修改完成")

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Tdlib make 卡住

在VM下,用debian编译Tdlib不成功,分析出Tdlib编译会消耗大量的CPU和内存 解决方案:1.增加硬件配置 2.参考 zelenin/go-tdlib: Go wrapper for TDLib (Telegram Database Library) (github.com) 这里参考2:通过说明文件&#xff0…

基于斑马算法优化概率神经网络PNN的分类预测 - 附代码

基于斑马算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于斑马算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于斑马优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

C语言 - 基础

C 语言 1. Hello World #include <stdio.h>int main(int argc, const char *argv[]) {printf("hello world\n");return 0; }注意: 所有的标点符号必须在英文状态下输入单词不要写错注意空格 创建 C语言 程序步骤&#xff1a; 1、创建一个文档&#xff0c;以…

【MinIO】几个有用的方法

在windows总安装Minio 这是一篇不错的安装指南 进入网址 在Windows安装时&#xff0c;选择相应的exe文件下载&#xff0c;下载到本地后&#xff0c;使用如下的命令即可在前台启动&#xff1a; minio.exe server D:\your_path 或者将该路径写进环境变量的path中&#xff0c;…

新手如何买卖基金,基金投资基础入门

一、教程描述 本套基金教程&#xff0c;大小2.50G&#xff0c;共有13个文件。 二、教程目录 第01课&#xff1a;基金入门&#xff0c;学会投资其实不难.mp4 第02课&#xff1a;基金分类&#xff0c;琳琅满目清清楚楚.mp4 第03课&#xff1a;以稳取胜&#xff0c;稳健基金稳…

CSS水平居中与垂直居中的方法

当我们页面布局的时候&#xff0c;通常需要把某一个元素居中&#xff0c;这一篇文章为大家介绍一下居中的几种方法&#xff0c;本人文笔有限&#xff0c;请见谅&#xff01; 一.水平居中 行内元素水平居中的方法&#xff0c;我们使用text-align:center; <!DOCTYPE html&g…

市场被套牢,没有了解积累和分配,昂首资本一一介绍

很多投资者对市场中的积累和分配的概念不是很清楚&#xff0c;下面昂首资本将一一介绍。 积累意味着尽可能多地买入筹码&#xff0c;而不大幅抬高价格&#xff0c;直到在你买入时的价格水平上没有或几乎没有筹码。这种买入通常发生在市场熊市之后&#xff0c;此时有最佳买入价…

枚举与应用

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 枚举简介 枚举是一种特…

软件测试:超详细的Jmeter基础教程

JMeter 介绍&#xff1a; 一个非常优秀的开源的性能测试工具。 优点&#xff1a;你用着用着就会发现它的重多优点&#xff0c;当然不足点也会呈现出来。 从性能工具的原理划分 Jmeter工具和其他性能工具在原理上完全一致&#xff0c;工具包含4个部分&#xff1a; &#xff…

是否有无限提取的代理IP?作为技术你需要知道这些

最近有互联网行业的技术小伙伴问到&#xff0c;有没有可以无限提取的代理IP&#xff1f;就是比如我一秒钟提取几万、几十万次&#xff0c;或者很多台机器同时调用API提取链接&#xff0c;这样可以吗&#xff1f;看到这个问题&#xff0c;不禁沉思起来&#xff0c;其实理论上是存…

数据结构与算法编程题23

设计二叉树的双序遍历算法&#xff08;双序遍历是指对于二叉树的每一个结点来说&#xff0c;先访问这个结点&#xff0c;再按双序遍历它的左子树&#xff0c;然后再一次访问这个结点&#xff0c;接下来按双序遍历它的右子树&#xff09; #define _CRT_SECURE_NO_WARNINGS#inclu…

【点云surface】Poisson表面重建

1 介绍 Poisson表面重建算法是一种用于从点云数据生成平滑曲面模型的算法。它基于Michael Kazhdan等人在2006年发表的论文《Poisson surface reconstruction》。该算法通过将点云数据转换为体素表示&#xff0c;并利用Poisson方程来重建曲面。 该算法的基本原理是将点云数据转…

python基础教程:动态参数

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 Python的动态参数有两种&#xff0c;分别是*args和**kwargs&#xff0c; 这里面的关键是一个和两个星号的区别&#xff0c;而不是args和kwargs在名字上的区别&#…

微信小程序-跳转到另一个小程序

微信小程序-跳转到另一个小程序 微信小程序跳转到另一个小程序有一个条件:这两个小程序被同一个微信公众号关联&#xff0c;否则不能跳转&#xff0c;会报错。 官方文档 wx.navigateToMiniProgram({appId: wxa38r249405b957c6,path: pages/splash/index,//extraData: 需要传递…

Android : PopupWindow 悬浮框_简单应用

示例图&#xff1a; MainActivity.java package com.example.popupwindow;import androidx.appcompat.app.AppCompatActivity;import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.LayoutInflat…

浅谈STL中的分配器

分配器是STL中的六大部件之一&#xff0c;是各大容器能正常运作的关键&#xff0c;但是对于用户而言确是透明的&#xff0c;它似乎更像是一个幕后英雄&#xff0c;永远也不会走到舞台上来&#xff0c;观众几乎看不到它的身影&#xff0c;但是它又如此的重要。作为用户&#xff…

Vue组件的几种通信方式

这里写目录标题 Vue组件的几种通信&#xff08;数据传递&#xff09;方式非父子组件间通信&#xff08;Bus事件总线&#xff09;介绍实例 非父子通信-provide&inject1.作用2.场景3.语法4.注意 父子组件间的通信固定props属性名&#xff08;v-model&#xff09;介绍实例 不固…

【部署运维】docker:入门到进阶

0 前言 部署运维博客系列一共有三篇&#xff1a; 拥抱开源&#xff0c;将工作中的经验分享出来&#xff0c;尽量避免新手踩坑。 【部署运维】docker&#xff1a;入门到进阶 【部署运维】kubernetes&#xff1a;容器集群管理掌握这些就够了 【部署运维】pythonredisceleryd…

C++多态-虚函数

多态分为编译时多态和运行时多态。编译时多态就是在编译阶段就能绑定要执行的那个函 数。运行时多态要等到运行到调用的那条语句时&#xff0c;根据指针/引用所绑定的对象&#xff0c;来决定执行哪 个函数&#xff0c;我们要讲的虚函数就是运行时多态&#xff0c;是 C中非常重…