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

目录

[1. 介绍](#1. 介绍)

[2. 使用方法](#2. 使用方法)

[3. 注意事项](#3. 注意事项)

[4. 示例](#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 文件的保存路径。

python 复制代码
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.完整代码

python 复制代码
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": []}
    #ignored
    total_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, 1
    categories_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_count
            total_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_count
                    anno_new['image_id'] = img_id_count
                    total_data['annotations'].append(anno_new)
                    bbox_id_count += 1
                    for category in categories:
                        if anno['category_id'] == category['id'] and \
                              category['name'] not in categories_dict.keys():
                            categories_dict[category['name']] = categories_count
                            total_data['categories'].append(dict(supercategory = None, id =categories_count, name = category['name']))
                            categories_count += 1
                        if anno['category_id'] == category['id']:
                            anno_new['category_id'] = categories_dict[category['name']]
            img_id_count += 1
    with 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.json
    concat(files_root, output_file=output_file)
相关推荐
Zwb29979216 小时前
Day 30 - 错误、异常与 JSON 数据 - Python学习笔记
笔记·python·学习·json
眠りたいです19 小时前
基于脚手架微服务的视频点播系统-脚手架开发部分-jsoncpp,protobuf,Cpp-httplib与WebSocketpp中间件介绍与使用
c++·websocket·微服务·中间件·json·protobuf·cpp-httplib
我是大头鸟1 天前
XMLHttpRequest 发送json 格式的数据,servlet 接收
servlet·json·xmlhttprequest
程序新视界2 天前
一篇文章详解你不知道的MySQL JSON数据类型
数据库·mysql·json
数据知道2 天前
Go基础:json文件处理详解(标准库`encoding/json`)
开发语言·后端·golang·json·go语言
广都--编程每日问3 天前
deepseek 的对话json导出成word和pdf
pdf·json·word·deepseek·exprot
包达叔5 天前
仿NewLife的XmlConfig类实现Json配置文件
c#·json·newlife
爱吃香蕉的阿豪7 天前
.NET Core 中 System.Text.Json 与 Newtonsoft.Json 深度对比:用法、性能与场景选型
数据库·json·.netcore
千叶寻-7 天前
package.json详解
前端·vue.js·react.js·webpack·前端框架·node.js·json
睿麒8 天前
鸿蒙app开发中 拿到json文件数据进行动画的播放
json