教程:如何使用 JSON 合并脚本

目录

1. 介绍

2. 使用方法

3. 注意事项

4. 示例

5.完整代码


1. 介绍

该脚本用于将多个 COCO 格式的 JSON 标注文件合并为一个 JSON 文件。COCO 格式常用于目标检测和图像分割任务,包含以下三个主要部分:

  "images":图像信息,如图像 ID、文件名等。
  "annotations":标注信息,如边界框、类别 ID 等。
  "categories":类别信息,如类别 ID、名称等。

在合并过程中,脚本会重新分配 image id、bbox id 和 category id,以避免 ID 冲突并保持一致性。合并后的 image id 和 bbox id 将从 0 开始顺序排列。

2. 使用方法

打开脚本文件(例如 concat_json.py),并修改以下两个路径:

files_root:存放 JSON 文件的文件夹路径。
output_file:合并后 JSON 文件的保存路径。

files_root = r'D:\w-dataset\AOFandODV2\annotations\val'  # 修改为您的 JSON 文件夹路径
output_file = r'D:\w-dataset\AOFandODV2\annotations\val\output.json'  # 修改为输出文件路径

3. 注意事项

JSON 格式:确保所有 JSON 文件都是有效的 COCO 格式。脚本不会检查格式错误。
ID 重新分配:合并后的 image id 和 bbox id 将从 0 开始重新分配,原始 ID 会被覆盖。
类别合并:相同的类别名称将共享同一个 category id。新的类别 ID 从 1 开始分配(0 被预留给 "ignored")。
ID 冲突:如果原始 JSON 文件中存在相同的 image id 或 bbox id,脚本会自动重新分配以避免冲突。

4. 示例

假设有以下文件夹结构:

D:\w-dataset\AOFandODV2\annotations\val
├── file1.json
├── file2.json
└── file3.json

 打开 concat_json.py 脚本。
修改 files_root 为 'D:\\w-dataset\\AOFandODV2\\annotations\\val'。
修改 output_file 为 'D:\\w-dataset\\AOFandODV2\\annotations\\val\\output.json'。
保存脚本并在终端中运行 python concat_json.py。
运行后,合并后的 JSON 文件将保存在 'D:\\w-dataset\\AOFandODV2\\annotations\\val\\output.json'。

5.完整代码

import json
from pathlib import Path
"""
拼接多个coco格式的json file
支持多个categories
会自动将 image id 与 bbox id 顺序排列
"""
def concat(files_root:str, output_file = 'output.json'):files_root = Path(files_root)#total_data = {"images": [], "categories": [{ "supercategory": None, "id": 0, "name": "_background_" }], "annotations": []}#ignoredtotal_data = {"images": [], "categories": [{"supercategory": None, "id": 0, "name": "ignored"}],"annotations": []}file_list = [str(i) for i in files_root.iterdir() if i.suffix == '.json']img_id_count, bbox_id_count, categories_count = 0, 0, 1categories_dict:dict= {}for json_file in file_list:print(f'Now Processing {json_file}')with open(file=json_file,mode='r') as f:json_data = json.load(f)images = json_data['images']annotations = json_data['annotations']categories = json_data['categories']for img_idx, image in enumerate(images):image_new = image.copy()origin_img_id = image['id']image_new['id'] = img_id_counttotal_data['images'].append(image_new)for anno_idx, anno in enumerate(annotations):if anno['image_id'] == origin_img_id:anno_new = anno.copy()anno_new['id'] = bbox_id_countanno_new['image_id'] = img_id_counttotal_data['annotations'].append(anno_new)bbox_id_count += 1for category in categories:if anno['category_id'] == category['id'] and \category['name'] not in categories_dict.keys():categories_dict[category['name']] = categories_counttotal_data['categories'].append(dict(supercategory = None, id =categories_count, name = category['name']))categories_count += 1if anno['category_id'] == category['id']:anno_new['category_id'] = categories_dict[category['name']]img_id_count += 1with open(output_file, 'w') as f:json.dump(total_data, f)if __name__ == '__main__':files_root = r'D:\w-dataset\AOFandODV2\annotations\val' # 修改为文件夹路径output_file = r'D:\w-dataset\AOFandODV2\annotations\val\output.json'  # 输出文件,默认为当前路径下的 output.jsonconcat(files_root, output_file=output_file)

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

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

相关文章

Java学习总结-缓冲流性能分析

测试用例: 分别使用原始的字节流,以及字节缓冲流复制一个很大的视频。 测试步骤: 在这个分析性能需要一个记录时间的工具:这个是记录1970-1-1 00:00:00到现在的总毫秒值。 long start System.currentT…

流影---开源网络流量分析平台(五)(成果展示)

目录 前沿 攻击过程 前沿 前四章我们已经成功安装了流影的各个功能,那么接下来我们就看看这个开源工具的实力,本实验将进行多个攻击手段(ip扫描,端口扫描,sql注入)攻击靶机,来看看流影的态感效…

vs环境中编译osg以及osgQt

1、下载 OpenSceneGraph 获取源代码 您可以通过以下方式获取 OSG 源代码: 官网下载:https://github.com/openscenegraph/OpenSceneGraph/releases 使用 git 克隆: git clone https://github.com/openscenegraph/OpenSceneGraph.git 2、下载必要的第三方依赖库 依赖库 ht…

Unity:标签(tags)

为什么需要Tags? 在游戏开发中,游戏对象(GameObject)数量可能非常多,比如玩家、敌人、子弹等。开发者需要一种简单的方法来区分这些对象,并根据它们的类型执行不同的逻辑。 核心需求: 分类和管…

【C++11】lambda

lambda lambda表达式语法 lambda表达式本质是一个匿名函数对象,跟普通函数不同的是它可以定义在函数内部。lambda表达式语法使用层而言没有类型,所以一般是用auto或者模板参数定义的对象去接收lambda对象。 lambda表达式的格式:[capture-l…

fpga:分秒计时器

任务目标 分秒计数器核心功能:实现从00:00到59:59的循环计数,通过四个七段数码管显示分钟和秒。 复位功能:支持硬件复位,将计数器归零并显示00:00。 启动/暂停控制:通过按键控制计时的启动和暂停。 消抖处理&#…

《UNIX网络编程卷1:套接字联网API》第6章 IO复用:select和poll函数

《UNIX网络编程卷1:套接字联网API》第6章 I/O复用:select和poll函数 6.1 I/O复用的核心价值与适用场景 I/O复用是高并发网络编程的基石,允许单个进程/线程同时监控多个文件描述符(套接字)的状态变化,从而高…

SpringBoot+vue前后端分离整合sa-token(无cookie登录态 详细的登录流程)

SpringBootvue前后端分离整合sa-token(无cookie登录态 & 详细的登录流程) 1.介绍sa-token1.1 框架定位1.2 核心优势 2.如何整合sa-token3.如何进行无cookie模式登录3.1后端3.1.1 VO层3.1.2 Controller层3.1.3 Service层 3.2前端3.2.1 登录按钮自定义…

MYOJ_1171:(洛谷P1075)[NOIP 2012 普及组] 质因数分解(数学相关,质数与约数基础)

题目描述 已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数。 1≤n≤210^9 输入 输入一个正整数 n。 输出 输出一个正整数 p,即较大的那个质数。 样例输入输出 输入:21 输出:7 思路: 为了节约时间与…

Python语言的测试用例设计

Python语言的测试用例设计 引言 随着软件开发的不断进步,测试在软件开发生命周期中的重要性日益凸显。测试用例设计是软件测试的核心,它为软件系统的验证和验证提供了实施的基础。在Python语言中,由于其简洁明了的语法和强大的内置库&#…

SpringKafka消息消费:@KafkaListener与消费组配置

文章目录 引言一、Spring Kafka消费者基础配置二、KafkaListener注解使用三、消费组配置与负载均衡四、手动提交偏移量五、错误处理与重试机制总结 引言 Apache Kafka作为高吞吐量的分布式消息系统,在大数据处理和微服务架构中扮演着关键角色。Spring Kafka为Java开…

VMware 虚报化Ubuntu 卡成一B,如何接招?

故事背景 Win10 专业版 安装VMware pro ,虚拟化出一个Window10,另一个是UBuntu.自从使用起来去不去就卡死。开始是以为驱动或者升级造成的,重新安装一段时间问题照旧。更气人的这种现象具有不定期性,说不定什么时候就来这么一出。 直接解决方…

cloud项目批量修改主机号

当clone了一个cloud项目后,要把别人的主机号全部改成自己的,非常麻烦 在项目根目录下,启动 Git Bash。在 Git Bash 终端中使用原始的 Unix 命令: find . -type f -exec sed -i s/127\.0\.0\.1/132.168.190.163/g {} 其中127.0.…

微信小程序使用 Vant Weapp 组件库教程

在微信小程序项目中使用 Vant 组件库(Vant Weapp)主要包括以下几个步骤: 1. 初始化项目并安装 Vant Weapp 初始化 npm 在项目根目录下运行以下命令,生成 package.json: npm init -y安装 Vant Weapp 执行以下命令安装 V…

FPGA状态机思想实现流水灯及HDLBits学习

目录 第一章 在DE2-115上用状态机思想实现LED流水灯1.1 状态机设计思路1.2 Verilog代码实现1.3. 仿真测试代码1.4 编译代码与仿真 第二章 CPLD和FPGA芯片的主要技术区别是什么?它们各适用于什么场合?2.1 主要技术区别2.2 适用场合 第三章 HDLBits学习3.1…

与总社团联合会合作啦

2025.4.2日,我社团向总社团联合会与暮光社团发起合作研究“浔川代码编辑器v2.0”。至3日,我社团收到回复: 总社团联合会: 总社团联合会已收到浔川社团官方联合会的申请,经考虑,我们同意与浔川社团官方联合…

Shiro学习(三):shiro整合springboot

一、Shiro整合到Springboot步骤 1、准备SpringBoot 环境,这一步省略 2、引入Shiro 依赖 因为是Web 项目,所以需要引入web 相关依赖 shiro-spring-boot-web-starter,如下所示: 3、准备Realm 因为实例化 ShiroFilterFactoryBean 时…

【图形API】片段着色器自动计算LOD

片段着色器中的自动 LOD 计算详解 在图形渲染中,Level of Detail (LOD) 用于优化纹理采样的性能和视觉质量。片段着色器(Fragment Shader)能够自动计算 LOD,而顶点着色器(Vertex Shader)则不行。以下是详细…

24、 Python Socket编程:从协议解析到多线程实战

Python Socket编程:从协议解析到多线程实战 一、文章概述 本文深入讲解Python网络编程核心技术,涵盖TCP/UDP协议底层原理、Socket API全流程解析、高并发服务端开发实践,以及网络通信中的典型问题解决方案。通过3个递进式代码案例和协议设计…

LabVIEW 中数字转字符串常用汇总

在 LabVIEW 编程环境里,数字与字符串之间的转换是一项极为基础且重要的操作,广泛应用于数据处理、显示、存储以及设备通信等多个方面。熟练掌握数字转字符串的方法和技巧,对编写高效、稳定的程序起着关键作用。接下来,我们将全面深…