yolov8-pose关键点标注文件转换代码——json格式转txt格式

1、yolov8数据集txt文件的两种格式(两种格式都可用于关键点训练)

(yolov8pose官方:Pose Estimation Datasets Overview - Ultralytics YOLO Docs)

格式1:<类别ID> <边框中心点X坐标> <边框中心点Y坐标> <关键点X坐标> <关键点Y坐标>......

格式2:<类别ID> <边框中心点X坐标> <边框中心点Y坐标> <关键点X坐标> <关键点Y坐标> <可见性>.......

2、json转txt

import json
import os
from pathlib import Path

def convert_to_txt(json_data, save_path):
    # 获取图片的宽度和高度
    img_width = json_data["imageWidth"]
    img_height = json_data["imageHeight"]

    txt_lines = []

    for shape in json_data["shapes"]:
        points = shape["points"]

        if shape["shape_type"] == "rectangle":
            # 处理矩形框 (4个点)
            x_min = min(points[0][0], points[2][0])
            x_max = max(points[0][0], points[2][0])
            y_min = min(points[0][1], points[2][1])
            y_max = max(points[0][1], points[2][1])

            x=f"{x_min:.6f}"
            y=f"{x_max:.6f}"
            # 计算中心点坐标和宽高
            x_center = (x_min + x_max) / 2 / img_width
            y_center = (y_min + y_max) / 2 / img_height

            x_center=f"{x_center:.6f}"
            y_center=f"{y_center:.6f}"

            width = (x_max - x_min) / img_width
            height = (y_max - y_min) / img_height

            width=f"{width:.6f}"
            height=f"{height:.6f}"
            # 类别索引默认为0
            class_index = 0
            txt_lines.append(f"{class_index} {x_center} {y_center} {width} {height}")

        elif shape["shape_type"] == "point":
            # 处理关键点 (单个点),只保留归一化后的坐标
            x = points[0][0] / img_width
            y = points[0][1] / img_height
            x=f"{x:.6f}"
            y=f"{y:.6f}"
            txt_lines.append(f"{x} {y}")


            # 如果 group_id 不为 null, 将其添加到坐标后面
            group_id = shape["group_id"] if shape["group_id"] is not None else ""
            group_id=f"{group_id:.6f}"
            # 将group_id添加到输出中
            if group_id:
                txt_lines.append(f"{group_id}")


    # 将结果写入txt文件
    with open(save_path, 'w') as f:
        f.write(" ".join(txt_lines))  # 每个数据占据一行
    print(f"转换完成,保存至: {save_path}")


def convert_folder(json_folder, txt_folder):
    # 确保目标txt文件夹存在
    os.makedirs(txt_folder, exist_ok=True)

    # 遍历json文件夹中的每一个文件
    for json_file in Path(json_folder).glob("*.json"):
        # 读取JSON数据
        with open(json_file, 'r') as f:
            json_data = json.load(f)

        # 确定保存的txt文件路径,使用相同的文件名
        txt_file_name = json_file.stem + ".txt"
        txt_save_path = os.path.join(txt_folder, txt_file_name)

        # 转换并保存txt
        convert_to_txt(json_data, txt_save_path)


# 假设你的JSON文件夹和目标TXT文件夹路径如下:
json_folder = r"C:\Users\admin\Desktop\DataPoseID\json"
txt_folder = r"C:\Users\admin\Desktop\DataPoseID\txt"

# 调用文件夹转换函数
convert_folder(json_folder, txt_folder)

说明:

我是在标注时通过设置Group ID的值来表示可见性。如果设置了了deseription来表示可见性则把下面代码的group_id改为deseription。

如果想要使用格式1进行训练,则把下面代码删除即可。

            # 如果 group_id 不为 null, 将其添加到坐标后面
            group_id = shape["group_id"] if shape["group_id"] is not None else ""
            group_id=f"{group_id:.6f}"
            # 将group_id添加到输出中
            if group_id:
                txt_lines.append(f"{group_id}")

###我主页的另一篇博客做了 制作和训练 自定义的yolov8关键点数据集的全过程。

你可能感兴趣的:(关键点检测,yolov8,python)