You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python合并多个COCO格式的JSON标注文件

COCO多标注文件合并方案

核心注意事项

  • 所有待合并的JSON文件需保证categories字段完全一致,否则会出现类别映射错误
  • 合并时需对后加入的文件的图片ID、标注ID做全局偏移,避免ID重复导致标注关联错误
  • 合并后建议用COCO API加载校验,确认无数据丢失

实现代码

仅依赖Python原生json库即可完成,如需校验可额外安装pycocotools:

import json
from pathlib import Path

def merge_coco_json(json_paths, output_path):
    # 初始化合并后的COCO结构体,取第一个文件的categories作为基准
    merged_coco = {
        "info": {},
        "licenses": [],
        "categories": [],
        "images": [],
        "annotations": []
    }
    # 记录当前最大的图片ID和标注ID,用于后续偏移
    max_img_id = -1
    max_anno_id = -1

    for idx, json_path in enumerate(json_paths):
        with open(json_path, 'r', encoding='utf-8') as f:
            coco_data = json.load(f)
        
        # 第一个文件直接复用categories、info、licenses字段
        if idx == 0:
            merged_coco['categories'] = coco_data['categories']
            merged_coco['info'] = coco_data.get('info', {})
            merged_coco['licenses'] = coco_data.get('licenses', [])
        
        # 计算当前文件的ID偏移量
        img_id_offset = max_img_id + 1
        anno_id_offset = max_anno_id + 1
        img_id_map = {}

        # 更新图片ID并写入合并结构体
        for img in coco_data['images']:
            old_img_id = img['id']
            img['id'] = old_img_id + img_id_offset
            img_id_map[old_img_id] = img['id']
            merged_coco['images'].append(img)
        
        # 更新标注ID和关联的图片ID,写入合并结构体
        for anno in coco_data['annotations']:
            old_anno_id = anno['id']
            old_img_id = anno['image_id']
            anno['id'] = old_anno_id + anno_id_offset
            anno['image_id'] = img_id_map[old_img_id]
            merged_coco['annotations'].append(anno)
        
        # 更新全局最大ID
        max_img_id = max([img['id'] for img in merged_coco['images']])
        max_anno_id = max([anno['id'] for anno in merged_coco['annotations']])
    
    # 输出合并后的文件
    with open(output_path, 'w', encoding='utf-8') as f:
        json.dump(merged_coco, f, indent=2, ensure_ascii=False)

# 调用示例
if __name__ == "__main__":
    # 替换为你的标注文件路径列表
    json_list = [f"train{i}.json" for i in range(1, 11)]
    merge_coco_json(json_list, "merged_train.json")

合并结果校验

from pycocotools.coco import COCO

# 加载合并后的文件
coco = COCO("merged_train.json")
# 输出统计信息确认无异常
print(f"合并后图片总数:{len(coco.imgs)}")
print(f"合并后标注总数:{len(coco.anns)}")
print(f"类别列表:{[cat['name'] for cat in coco.cats.values()]}")

无报错且统计值符合多个文件的累加结果即为合并成功。

内容的提问来源于stack exchange,提问作者user12388610

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 16:42:01