合并COCO数据集JSON文件的Python脚本
- 1、目的
- 2、功能概述
- 3、使用方法
- 4、注意事项
- 5、 代码部分
1、目的
此Python脚本旨在帮助用户合并多个COCO格式的数据集JSON文件,特别适用于将验证集和测试集的标注数据整合到单一文件中。
该脚本假设各个数据集的类别信息(categories
字段)完全一致,这在许多场景下是合理的假设,尤其是在验证集和测试集是从同一母体数据集划分而来的情况下。
2、功能概述
-
合并
images
字段:脚本会将来自不同JSON文件的图像信息列表合并在一起,构建一个统一的图像信息集合。 -
合并
annotations
字段:脚本在合并标注信息时,会确保每个标注的ID(id
字段)在最终的合并数据集中是唯一的。这通过追踪已有的最大标注ID并在导入新的标注时递增ID来实现。 -
保留
categories
字段:由于假定所有数据集的类别信息一致,脚本默认从第一个数据集中复制categories
字段到合并后的数据集,而不做任何改变。 -
保留其他元数据:脚本还会保留
info
和licenses
字段,确保合并后的JSON文件包含原始数据集的元数据信息。
3、使用方法
-
定义输入和输出文件路径:在脚本中,你需要定义一个包含所有待合并JSON文件路径的列表
json_files
,以及指定输出合并后JSON文件的路径output_file
。 -
运行脚本:调用
merge_coco_jsons(json_files, output_file)
函数,脚本将处理指定的输入文件,合并数据,并将结果保存到指定的输出文件中。
4、注意事项
- 确保所有待合并的数据集的
categories
字段完全相同,否则需要在合并前进行相应的调整。 - 在合并
annotations
时,脚本自动更新每个新添加的标注的ID,以避免ID冲突。确保在合并后的数据集中,标注ID的唯一性得到保持。 - 在运行脚本前,备份原始数据集文件,以防意外覆盖或数据丢失。
通过使用此脚本,你可以轻松地将多个COCO数据集合并为一个,为后续的数据分析、模型训练或评估提供便利。
5、 代码部分
import json
# 将COCO格式的验证集和测试集的JSON文件合并成一个文件,
# 主要涉及合并两个JSON文件中的images、annotations和可能的categories字段
def merge_coco_jsons(json_files, output_file):
# 加载第一个JSON文件作为基础数据
with open(json_files[0], 'r') as f:
merged_data = json.load(f)
# 更新annotation ID的最大值
max_ann_id = max([a['id'] for a in merged_data['annotations']]) if merged_data['annotations'] else 0
# 从第二个JSON文件中合并数据
for json_file in json_files[1:]:
with open(json_file, 'r') as f:
data = json.load(f)
# 合并images
merged_data['images'].extend(data['images'])
# 合并annotations,同时更新annotation ID
if data.get('annotations'):
for annotation in data['annotations']:
annotation['id'] = max_ann_id + 1
max_ann_id = annotation['id']
merged_data['annotations'].append(annotation)
# 写入合并后的JSON文件
with open(output_file, 'w') as f:
json.dump(merged_data, f)
# 使用函数
json_files = ['path/to/val_annotations.json', 'path/to/test_annotations.json']
output_file = 'path/to/merged_annotations.json'
merge_coco_jsons(json_files, output_file)