labelme_to_coco(多个json文件转换成一个)

我是用labelme标注的动物数据集生成多个身体关键点json文件,然後我想转换成coco格式并合并成一個类似animal_keypoints_train.json文件(类似下面的配置信息)

{"image_id": 1448, "bbox": [234, 11, 344, 248], "keypoints": [[298, 45, 1], [274, 49, 1], [300, 59, 1], [294, 29, 1], [259, 32, 1], [293, 150, 1], [256, 156, 1], [330, 166, 1], [307, 173, 1], [296, 207, 1], [267, 206, 1], [325, 212, 1], [0, 0, 0], [292, 239, 1], [261, 239, 1], [320, 232, 1], [292, 234, 1], [274, 106, 1], [0, 0, 0], [0, 0, 0]], "num_keypoints": 20, "category_id": 1}, {"image_id": 1449, "bbox": [140, 26, 500, 333], "keypoints": [[257, 130, 1], [167, 113, 1], [177, 176, 1], [338, 113, 1], [173, 76, 1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [262, 242, 1], [376, 168, 1], [0, 0, 0]], "num_keypoints": 20, "category_id": 1}, {"image_id": 1450, "bbox": [79, 1, 435, 334], "keypoints": [[336, 144, 1], [208, 124, 1], [298, 183, 1], [357, 101, 1], [147, 71, 1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [249, 318, 1], [0, 0, 0], [0, 0, 0]], "num_keypoints": 20, "category_id": 2}, {"image_id": 1451, "bbox": [110, 158, 299, 267], "keypoints": [[0, 0, 0], [279, 210, 1], [286, 220, 1], [266, 169, 1], [266, 187, 1], [0, 0, 0], [235, 253, 1], [173, 198, 1], [116, 242, 1], [0, 0, 0], [273, 246, 1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [291, 246, 1], [0, 0, 0], [0, 0, 0], [250, 226, 1], [213, 214, 1], [128, 195, 1]], "num_keypoints": 20, "category_id": 2},
{"supercategory": "animal", "id": 4, "name": "horse", "keypoints": ["left_eye", "right_eye", "nose", "left_ear", "right_ear", "left_front_elbow", "right_front_elbow", "left_back_elbow", "right_back_elbow", "left_front_knee", "right_front_knee", "left_back_knee", "right_back_knee", "left_front_paw", "right_front_paw", "left_back_paw", "right_back_paw", "throat", "withers", "tailbase"], "skeleton": [[0, 1], [0, 2], [1, 2], [0, 3], [1, 4], [2, 17], [18, 19], [5, 9], [6, 10], [7, 11], [8, 12], [9, 13], [10, 14], [11, 15], [12, 16]]},

结全ChatGPT和我自己的想法:

将从LabelMe标注生成的多个JSON文件转换为单个COCO格式的JSON文件,您可以按照以下步骤使用Python进行操作。我将为您提供一个脚本,该脚本会读取多个LabelMe JSON文件,提取相关信息,然后创建一个单独的COCO格式的JSON文件。

假设您有一个包含LabelMe JSON文件的目录,以及您提供的COCO格式JSON模式,您可以使用以下脚本:

import json
import os

# LabelMe JSON文件列表
labelme_json_files = [
    'path/to/labelme_file1.json',
    'path/to/labelme_file2.json',
    # 根据需要添加更多文件路径
]

# COCO格式骨架和关键点信息
coco_keypoints_info = {
    # 在此处填写您的COCO关键点信息
}

# 初始化COCO注释格式
coco_data = {
    "images": [],
    "annotations": [],
    "categories": [coco_keypoints_info],
}

# 加载并处理每个LabelMe JSON文件
image_id_counter = 1
annotation_id_counter = 1

for labelme_file_path in labelme_json_files:
    with open(labelme_file_path, 'r') as f:
        labelme_data = json.load(f)

    # 提取图像信息
    image_info = {
        "id": image_id_counter,
        "width": labelme_data['imageWidth'],
        "height": labelme_data['imageHeight'],
        "file_name": os.path.basename(labelme_file_path).replace('.json', '.jpg'),
    }
    coco_data['images'].append(image_info)

    # 处理注释
    for annotation in labelme_data['shapes']:
        # 提取注释信息
        bbox = annotation['points']
        keypoints = []  # 从LabelMe格式提取关键点
        # 将关键点转换为COCO格式

        # 创建COCO注释
        coco_annotation = {
            "id": annotation_id_counter,
            "image_id": image_id_counter,
            "category_id": 1,  # 根据需要替换为适当的category_id
            "bbox": [bbox[0][0], bbox[0][1], bbox[1][0] - bbox[0][0], bbox[1][1] - bbox[0][1]],
            "keypoints": keypoints,
            "num_keypoints": len(keypoints) // 3,
        }
        coco_data['annotations'].append(coco_annotation)

        annotation_id_counter += 1

    image_id_counter += 1

# 保存COCO格式JSON
output_json_path = 'path/to/animal_keypoints_train.json'
with open(output_json_path, 'w') as f:
    json.dump(coco_data, f, indent=4)


请注意,您需要根据实际的目录结构、路径和数据格式调整此脚本。此外,请确保您根据LabelMe数据正确填充脚本中的keypoints列表。

【以下回答由 GPT 生成】

我可以帮助你将多个labelme标注的json文件转换为单个coco格式的文件。下面是解决该问题的Python代码:

import json
import os
from collections import defaultdict

# 读取所有json文件
json_files = ["json_file1.json", "json_file2.json", "json_file3.json"]

# 创建COCO格式的字典
coco_data = {
    "images": [],
    "annotations": [],
    "categories": []
}

# 用于映射标签名和ID的字典
label_id_map = {
    "animal": 1,
    "human": 2,
    # 添加其他标签
}

# 创建用于存储图像ID和标注ID的变量
image_id = 1
annotation_id = 1

# 遍历所有json文件
for json_file in json_files:
    with open(json_file, "r") as f:
        data = json.load(f)

    # 添加类别信息到COCO格式字典的categories字段
    category_id = len(coco_data["categories"]) + 1
    category_name = data["label_name"]
    category_info = {
        "id": category_id,
        "name": category_name,
        "supercategory": "object"
    }
    coco_data["categories"].append(category_info)

    # 遍历每个标注信息
    for annotation in data["annotations"]:
        # 创建图像信息
        image_info = {
            "id": image_id,
            "file_name": data["image_name"],
            "width": data["image_width"],
            "height": data["image_height"]
        }
        coco_data["images"].append(image_info)

        # 创建标注信息
        annotation_info = {
            "id": annotation_id,
            "image_id": image_id,
            "category_id": category_id,
            "bbox": annotation["bbox"],
            "keypoints": annotation["keypoints"],
            "num_keypoints": annotation["num_keypoints"]
        }
        coco_data["annotations"].append(annotation_info)

        # 增加图像ID和标注ID
        image_id += 1
        annotation_id += 1

# 将COCO格式字典保存为json文件
with open("animal_keypoints_train.json", "w") as f:
    json.dump(coco_data, f)

请注意,上述代码假设labelme生成的每个json文件只包含一个图像的标注信息。如果有多个图像的标注信息存在于同一个json文件中,可以对代码进行相应的修改和调整。

希望这段代码能够帮助你解决问题!如果你有任何进一步的问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

我还没有现成的工具可以转,我是通过自己写的py代码转的。

单个动物的JSON转换为COCO格式

labelme_json = {
    "imagePath": "image.jpg",
    "shapes": [],  # Your shapes data here
}

coco_annotation = {
    "image_id": 1448,  # Replace with actual image_id
    "bbox": [234, 11, 344, 248],  # Replace with actual bbox
    "keypoints": [],  # Your keypoints data here
    "num_keypoints": 20,  # Replace with actual num_keypoints
    "category_id": 1,  # Replace with actual category_id
}

# Now combine labelme_json and coco_annotation to create COCO-like annotation
coco_annotation["image_id"] = labelme_json["imagePath"]  # Use image path as image_id
coco_annotation["keypoints"] = []  # Convert keypoints data from labelme_json to COCO format

# Add more fields as needed

# Now coco_annotation is your COCO-like annotation for one animal


合并成一个文件

import json

combined_data = []  # List to store combined data

# Load and combine each JSON file
for filename in ['animal1.json', 'animal2.json', ...]:  # Replace with your filenames
    with open(filename, 'r') as json_file:
        data = json.load(json_file)
        combined_data.extend(data)  # Append data to the combined list

# Save the combined data as a new JSON file
with open('animal_keypoints_train.json', 'w') as output_file:
    json.dump(combined_data, output_file)


你可以使用Python来将多个LabelMe标注的JSON文件转换成COCO格式,并将它们合并成一个类似animal_keypoints_train.json的文件。下面是一个示例代码,你需要根据你的实际数据结构进行适当的调整:

import json

# 初始化COCO格式的数据
coco_data = {
    "images": [],
    "annotations": [],
    "categories": []
}

# 定义类别信息
category_info = {
    "supercategory": "animal",
    "id": 1,
    "name": "animal",
    "keypoints": ["left_eye", "right_eye", "nose", ...],  # 你的关键点信息
    "skeleton": [[0, 1], [0, 2], [1, 2], ...]  # 你的关键点连接信息
}
coco_data["categories"].append(category_info)

# 读取多个LabelMe JSON文件并转换为COCO格式
json_filenames = ["file1.json", "file2.json", ...]  # 替换为你的文件名
image_id = 1  # 初始化image_id

for json_filename in json_filenames:
    with open(json_filename, "r") as json_file:
        labelme_data = json.load(json_file)
        
        # 处理每个图像
        for labelme_image in labelme_data["images"]:
            image_info = {
                "id": image_id,
                "file_name": labelme_image["file_name"],
                "height": labelme_image["height"],
                "width": labelme_image["width"]
            }
            coco_data["images"].append(image_info)
            
            # 处理每个关键点标注
            for annotation in labelme_data["annotations"]:
                # 假设你的关键点数据在"keypoints"字段中
                keypoints = annotation["keypoints"]
                num_keypoints = keypoints.count(2)  # 统计关键点个数
                
                # 构建COCO格式的关键点信息
                coco_annotation = {
                    "image_id": image_id,
                    "bbox": annotation["bbox"],
                    "keypoints": keypoints,
                    "num_keypoints": num_keypoints,
                    "category_id": 1  # 假设都是同一个类别
                }
                coco_data["annotations"].append(coco_annotation)
            
            image_id += 1

# 将合并后的COCO数据写入文件
with open("animal_keypoints_train.json", "w") as output_file:
    json.dump(coco_data, output_file)


将Labelme标注的数据做成COCO格式的数据集(实例分割的数据集)_labelme2coco_一直开心的博客-CSDN博客 将Labelme标注的数据做成COCO格式的数据集(实例分割):3种格式_labelme2coco https://blog.csdn.net/wenyunick/article/details/122193893

问题点:多个身体关键点json文件合并成一個animal_keypoints_train.json文件
代码如下

import json


def save_json(coco_data):
    # 将COCO格式字典保存为json文件
    with open("animal_keypoints_train.json", "w") as f:
        json.dump(coco_data, f)


# 合并各个身体关键点json文件
def update_data(file_path, image_id, annotation_id, coco_data):
    with open(file_path, "r") as f:
        data = json.load(f)
        # 添加类别信息到COCO格式字典的categories字段
        category_item_id = len(coco_data["categories"]) + 1
        name = data["label_name"]
        category_info = {
            "id": category_item_id,
            "name": name,
            "supercategory": "none"
        }
        coco_data["categories"].append(category_info)

        # 遍历每个标注信息
        for annotation in data["annotations"]:
            # 创建图像信息
            image_info = {
                "id": image_id,
                "file_name": data["image_name"],
                "width": data["image_width"],
                "height": data["image_height"]
            }
            coco_data["images"].append(image_info)

            # 创建标注信息
            annotation_info = {
                "id": annotation_id,
                "image_id": image_id,
                "category_id": category_item_id,
                "bbox": annotation["bbox"],
                "keypoints": annotation["keypoints"],
                "num_keypoints": annotation["num_keypoints"]
            }
            coco_data["annotations"].append(annotation_info)


def run():
    # 创建COCO格式的字典
    coco_data = {
        "images": [],
        "type": "instances",
        "annotations": [],
        "categories": []
    }

    # 读取所有json文件
    files = ["file1.json", "file2.json"]
    for file_id, file_path in enumerate(files, 1):
        # 文件处理顺序 作为图像ID和标注ID的变量
        update_data(file_path, file_id, file_id, coco_data)
    # 存成json文件
    save_json(coco_data)

参考gpt:
结合自己分析给你如下建议:
labelme是一种常用的图像标注工具,它可以生成json格式的标注文件,包含多边形、矩形、圆形、线条和点等形状。
coco是一种常用的图像数据集格式,它可以用于目标检测、实例分割、关键点检测等任务。coco格式的数据集包含images、categories和annotations三个主要字段,其中annotations字段包含bbox、keypoints、num_keypoints和category_id等信息。
要将labelme标注的数据转换为coco格式的数据集,可以使用一些现有的工具或代码,例如labelme2coco4。这些工具或代码可以根据labelme生成的json文件,提取出图像的路径、大小、类别和关键点等信息,并将其转换为coco格式的json文件。

labelme标注后多个json文件转标准coco格式
类似得,可以参考下
https://codeleading.com/article/56216148954/#google_vignette

引用 皆我百晓生 小程序回复内容作答:

您可以使用以下Python代码将多个json文件转换为一个COCO格式的json文件:

import json
import os

def labelme_to_coco(json_files, output_file):
    coco_data = {
        "info": {"description": "Animal Keypoints Dataset", "version": "1.0", "year": 2021, "contributor": "Anonymous", "date_created": "2021/01/01"},
        "licenses": [{"id": 1, "name": "Unknown License", "url": ""}],
        "categories": [],
        "images": [],
        "annotations": []
    }
    category_id = 1

    for json_file in json_files:
        with open(json_file, "r") as f:
            data = json.load(f)
        
        # Add categories
        coco_data["categories"].append({"id": category_id, "name": data["name"], "keypoints": data["keypoints"], "skeleton": data["skeleton"]})
        
        # Add images and annotations
        for image_data in data["images"]:
            image_id = len(coco_data["images"]) + 1
            image_info = {"id": image_id, "file_name": image_data["file_name"], "width": image_data["width"], "height": image_data["height"], "license": 1}
            coco_data["images"].append(image_info)
            
            for annotation in image_data["annotations"]:
                bbox = annotation["bbox"]
                keypoints = annotation["keypoints"]
                num_keypoints = annotation["num_keypoints"]
                coco_annotation = {"image_id": image_id, "bbox": bbox, "keypoints": keypoints, "num_keypoints": num_keypoints, "category_id": category_id}
                coco_data["annotations"].append(coco_annotation)
        
        category_id += 1

    with open(output_file,"w") as f:
        json.dump(coco_data, f)

# Example usage
json_files = ["file1.json", "file2.json", "file3.json"]
output_file = "animal_keypoints_train.json"
labelme_to_coco(json_files, output_file)

请确保将json_files列表替换为实际的文件名列表,并将output_file替换为输出的COCO格式json文件的文件名。

这段代码将遍历所有的json文件,将每个文件中的信息提取出来,并按照COCO格式构建新的json数据。然后将生成的json数据保存到输出文件中。