json类型文件转为yolo可识别的txt文件

本文介绍了如何使用Python将JSON文件转换为YOLO(You Only Look Once)算法可识别的TXT标注文件。适用于深度学习和计算机视觉任务,特别是基于PyTorch的项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# --把4点标注的json文件转化为(x_c,y_c,h,w,theta)的yolo txt 格式
import json
import os
import math
import random

my_class = ["bottle"]


def convert(image_id):

    in_file = 'annotations/%s.json' % image_id
    out_file = open('labels/%s.txt' % image_id, 'w')
    with open(in_file) as f_obj:
        label = json.load(f_obj)

    for bbox in label["shapes"]:
        vertices = bbox["points"]  # 顶点列表
        a, b, c, d = vertices

        x_c = (a[0]+b[0]+c[0]+d[0])/4
        y_c = (a[1] + b[1] + c[1] + d[1]) / 4
   
<think>好的,我现在需要帮助用户将Label Studio导出的JSON文件转换为YOLO格式。首先,我需要理解用户的需求。他们可能在使用Label Studio进行目标检测或关键点标注,现在需要将这些标注转换成YOLO可识别txt文件YOLO格式通常每张图片对应一个txt文件,每行包含类别、归一化的坐标和尺寸,或者关键点信息。 接下来,我得回顾一下已有的知识。根据用户提供的引用内容,之前有关于labelme转YOLO的方法,但Label Studio的JSON结构可能不同。需要先分析Label Studio导出的JSON结构。比如,引用[2]中的例子显示,labelme的JSON包含shapes数组,每个shape有points、label等信息。而Label Studio的导出可能结构不同,比如可能有不同的键名或数据组织方式。 用户可能没有编程经验,所以需要给出具体的步骤,可能需要Python脚本示例。同时,需要确保路径处理正确,归一化坐标的方法,以及处理不同标注类型(如矩形框、多边形、关键点)。 我需要考虑可能的错误点,比如图像尺寸的获取,因为YOLO需要归一化的坐标,所以必须知道图片的宽度和高度。如果JSON里没有包含这些信息,可能需要用其他方法获取,比如读取图片文件或从imageData字段解析。 另外,用户可能希望处理多种标注类型,但YOLO格式通常用于矩形框或关键点,需要明确用户的具体需求。根据问题描述,他们可能关注关键点检测,所以转换时要处理关键点的坐标。 然后,我需要设计转换步骤。首先解析JSON文件,提取每个标注对象的类别和坐标,然后归一化坐标,最后按YOLO格式写入txt文件。可能需要遍历所有标注,处理每个形状的点,并转换为YOLO要求的顺序,例如中心点x,y,宽度和高度,或者关键点的相对位置。 同时,要注意不同的标注类型,比如多边形可能需要转化为边界框,或者直接处理为关键点。根据引用[2]中的例子,labelme的shape_type有polygon,但YOLO可能需要不同的处理方式。如果是关键点检测,每个关键点可能有多个坐标点,需要按顺序排列。 还需要处理类别到索引的映射,用户可能需要一个class列表,将label名称转换为对应的数字ID。这部分需要用户自定义,或者在脚本中动态生成。 最后,测试脚本的正确性,确保生成的txt文件符合YOLO的要求,比如每行的数值在0到1之间,格式正确。可能还需要处理多个图像的情况,批量转换。 总结步骤:解析JSON结构,提取标注信息,归一化坐标,写入txt文件,并提供示例代码和注意事项。同时,要提醒用户根据实际情况调整,比如路径、类别映射等。</think>### 如何将Label Studio导出的JSON文件转换为YOLO格式? #### **步骤1:理解数据格式差异** - **Label Studio JSON结构**:包含图像路径、标注类型(矩形框/多边形/关键点)、坐标点(原始像素值)等信息[^2]。 - **YOLO格式要求**:每张图片对应一个`.txt`文件,每行格式为 `类别索引 x_center y_center width height`(目标检测)或关键点坐标归一化后的序列(关键点检测)。 #### **步骤2:解析Label Studio JSON文件** 需要提取以下信息: - 图像尺寸(宽`width`、高`height`) - 标注对象的类别标签 - 标注区域坐标(矩形框需转为`[x_min, y_min, x_max, y_max]`,多边形需提取边界框) #### **步骤3:坐标归一化** 将像素坐标转换为YOLO要求的**相对坐标**: $$ x_{center} = \frac{(x_{min} + x_{max})/2}{width}, \quad y_{center} = \frac{(y_{min} + y_{max})/2}{height} $$ $$ width_{norm} = \frac{x_{max} - x_{min}}{width}, \quad height_{norm} = \frac{y_{max} - y_{min}}{height} $$ #### **步骤4:Python转换脚本示例** ```python import json import os def labelstudio_to_yolo(json_path, output_dir, class_map): with open(json_path, 'r') as f: data = json.load(f) for annotation in data: image_path = annotation['imagePath'] image_width = annotation['imageWidth'] image_height = annotation['imageHeight'] txt_filename = os.path.splitext(os.path.basename(image_path))[0] + ".txt" txt_path = os.path.join(output_dir, txt_filename) with open(txt_path, 'w') as f_txt: for shape in annotation['shapes']: label = shape['label'] points = shape['points'] # 提取边界框 x_coords = [p[0] for p in points] y_coords = [p[1] for p in points] x_min, x_max = min(x_coords), max(x_coords) y_min, y_max = min(y_coords), max(y_coords) # 归一化计算 x_center = (x_min + x_max) / 2 / image_width y_center = (y_min + y_max) / 2 / image_height w = (x_max - x_min) / image_width h = (y_max - y_min) / image_height # 写入YOLO格式 class_id = class_map[label] f_txt.write(f"{class_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}\n") # 使用示例 class_map = {"person": 0, "car": 1} # 自定义类别映射 labelstudio_to_yolo("annotations.json", "yolo_labels", class_map) ``` #### **步骤5:关键点检测的特殊处理** 若需处理关键点(如人体姿态),YOLO格式需按顺序排列归一化坐标: ``` 类别 x_center y_center width height kp1_x kp1_y kp2_x kp2_y ... ``` 需在脚本中增加关键点遍历逻辑[^1]。 --- ### **注意事项** 1. **图像尺寸一致性**:确保JSON中的`imageWidth`和`imageHeight`与实际图像一致。 2. **标注类型适配**:上述代码假设标注为矩形框,若使用多边形需调整边界框提取逻辑。 3. **关键点可见性**:若关键点存在遮挡需在坐标后添加可见性标记(通常用0/1/2表示)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值