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关键点数据集的全过程。

数据集json文件批量转换txt格式YOLOV8格式)涉及到数据格式转换YOLOV8格式通常需要每个图像对应一个或多个txt文件,其中包含用于训练的标注信息。以下是转换的一般步骤: 1. 解析JSON文件:首先,你需要编写或使用现有的脚本来解析YOLO格式json标注文件。这些文件通常包含图像的路径以及每个对象的边界框信息,包括类别和四个坐标值(xmin, ymin, xmax, ymax)。 2. 转换YOLO格式YOLO格式要求标注信息按照特定的方式组织,即每个标注文件包含图像中的所有对象信息,且每个对象的边界框信息是相对于图像宽度和高度的比例值,类别索引是从0开始的整数。 3. 保存为TXT文件:将解析和转换后的信息保存为.txt文件,每个图像一个或多个.txt文件(取决于一个图像中对象的个数),文件名与图像文件名相对应。 以下是一个简单的示例脚本,展示了如何在Python中实现这一过程: ```python import json import os def convert_json_to_txt(json_path, txt_save_dir): # 加载json文件 with open(json_path, 'r') as f: data = json.load(f) # 遍历每个图像及其标注信息 for image_data in data['images']: image_name = image_data['file_name'] image_width = image_data['width'] image_height = image_data['height'] # 检查标注信息 for annotation in image_data['annotations']: category_id = annotation['category_id'] bbox = annotation['bbox'] # 转换YOLO格式:x_center, y_center, width, height x_center = (bbox[0] + bbox[2] / 2) / image_width y_center = (bbox[1] + bbox[3] / 2) / image_height width = bbox[2] / image_width height = bbox[3] / image_height # 创建对应的txt文件并写入信息 txt_file_path = os.path.join(txt_save_dir, os.path.splitext(image_name)[0] + '.txt') with open(txt_file_path, 'a') as txt_file: # 写入类别索引和边界框信息 line = f"{category_id} {x_center} {y_center} {width} {height}\n" txt_file.write(line) # 示例使用 json_path = 'path/to/your/annotations.json' txt_save_dir = 'path/to/save/txt' convert_json_to_txt(json_path, txt_save_dir) ``` 确保根据实际情况调整脚本,特别是文件路径和类别索引的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值