【YOLO标签转换】JSON格式标签转换为YOLO格式标签详细教程(附完整代码)

【YOLO标签转换】JSON格式标签转换为YOLO格式标签详细教程(附完整代码)


关于作者


作者:小白熊

作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。

联系邮箱[email protected]

  在目标检测任务中,YOLO(You Only Look Once)是一种非常流行的算法。YOLO将目标检测问题转换为回归问题,从而大大提升了检测速度。YOLO格式是一种简洁的数据标注格式,通常用于训练和评估YOLO模型。本文将详细介绍如何将标注数据从JSON格式转换为YOLO格式,并附上详细的Python代码实现。



准备工作

  首先,我们需要整理标注数据。每个JSON文件对应一张图片,其中包含了目标的类别和位置信息,并将其放在一个文件夹中。YOLO格式则要求每个目标的信息以“类别ID 中心点x 中心点y 宽度w 高度h”的形式表示,且所有坐标和尺寸都需要归一化到0到1之间。



完整代码

以下是一个Python脚本,用于将JSON格式的标注数据转换为YOLO格式的TXT文件。

import os  
import json  
from PIL import Image  
import warnings  
  
warnings.filterwarnings("ignore")  
  
json_dir = './labels_json/'  # JSON文件路径  
out_dir = './labels_txt/'  # 输出的TXT文件路径  
  
# 确保输出目录存在  
if not os.path.exists(out_dir):  
    os.makedirs(out_dir)  
  
def get_json(json_file, filename):  
    # 读取JSON文件数据  
    with open(json_file, 'r') as load_f:  
        content = json.load(load_f)  
  
    image_width = 5568  # 图片的宽  
    image_height = 3712  # 图片的高  
  
    filename_txt = out_dir + filename + '.txt'  
  
    # 创建或清空TXT文件  
    with open(filename_txt, mode="w", encoding="utf-8") as fp:  
        pass  # 创建一个空文件然后关闭  
  
    # 类别名称,对应标签序号  
    name = ['cola', 'pepsi', 'sprite', 'fanta', 'spring', 'ice', 'scream', 'milk', 'red', 'king']  
    name_class = {
    
    name[i]: i for i in range(len(name))}  
    con = content['shapes']  
  
    # 逐个处理标注信息  
    for t in con:  
        num = name_class[t['label']]  
  
        point = t['points']  
        # 计算中心点坐标和宽高(归一化)  
        x = (((point[1][0] - point[0][0]) / 2) + point[0][0]) / image_width  
        y = (((point[1][1] - point[0][1]) / 2) + point[0][1]) / image_height  
        w = (point[1][0] - point[0][0]) / image_width  
        h = (point[1][1] - point[0][1]) / image_height  
  
        # 将计算得到的信息写入TXT文件  
        file_str = str(num) + ' ' + str(round(x, 6)) + ' ' + str(round(y, 6)) + ' ' + str(round(w, 6)) + \  
                   ' ' + str(round(h, 6))  
        with open(filename_txt, mode="a", encoding="utf-8") as fp:  
            fp.write(file_str + '\n')  
  
def main():  
    files = os.listdir(json_dir)  # 得到文件夹下的所有文件名称  
    for file in files:  # 遍历文件夹  
        if file.endswith('.json'):  # 只处理JSON文件  
            filename = file.split('.')[0]  
            get_json(json_dir + '/' + file, filename)  
  
if __name__ == '__main__':  
    main()



代码详解

  1. 导入必要的库
    • os:用于文件和目录操作。
    • json:用于读取JSON文件。
    • PIL.Image:虽然在这个脚本中没有直接使用到PIL库,但通常用于图像处理。
    • warnings:用于忽略警告信息,使输出更加清晰。
  2. 设置目录路径
    • json_dir:JSON文件存储的目录。
    • out_dir:输出的TXT文件存储的目录。
  3. 确保输出目录存在:如果输出目录不存在,则创建它。
  4. 定义get_json函数
    • 读取JSON文件并解析内容。
    • 设置图片的宽度和高度(例子中所有图片的尺寸相同)。
    • 定义类别名称和对应的标签序号。
    • 遍历标注信息,计算每个目标的中心点坐标和宽高(归一化)。
    • 将计算得到的信息写入TXT文件。
  5. 定义main函数
    • 遍历JSON文件目录,获取所有JSON文件。
    • 调用get_json函数处理每个JSON文件。
  6. 运行脚本
    • 检查是否是直接运行该脚本,如果是,则调用main函数。



注意事项

  1. JSON文件格式:
    • JSON文件的格式包含shapes字段,每个形状包含labelpoints字段。
    • label字段表示目标类别,points字段表示目标的矩形框的两个对角点坐标。
  2. 归一化:
    • YOLO格式要求所有坐标和尺寸都需要归一化到0到1之间。
    • 归一化公式:(实际值 - 最小值) / (最大值 - 最小值)。在这里,图片的宽高作为最大值,坐标值作为实际值进行计算。
  3. 文件操作:
    • 在写入TXT文件时,使用mode="a"模式,以确保每次都是在文件末尾追加内容,而不是覆盖原有内容。



  通过这段代码,你可以轻松地将JSON格式的标注数据转换为YOLO格式的TXT文件,从而用于YOLO模型的训练和评估。

猜你喜欢

转载自blog.csdn.net/m0_59197405/article/details/143330690