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