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

该文章已生成可运行项目,

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


关于作者


作者:小白熊

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

联系邮箱:xbx3144@163.com

  在目标检测任务中,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模型的训练和评估。

本文章已经生成可运行项目
好的,以下是一个简单的随机旋角度YOLO标签转换程序的示例代码: ```python import cv2 import numpy as np import random # 定义旋函数 def rotate(image, angle): h, w = image.shape[:2] center = (w / 2, h / 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(image, M, (w, h)) return rotated, M # 定义YOLO标签转换函数 def convert_yolo_label(label, angle): # 解析标签 class_id, x, y, w, h = label.split() # 计算旋后的坐标 x, y = float(x), float(y) w, h = float(w), float(h) x1, y1 = x - w / 2, y - h / 2 x2, y2 = x + w / 2, y - h / 2 x3, y3 = x + w / 2, y + h / 2 x4, y4 = x - w / 2, y + h / 2 points = np.array([[x1, y1], [x2, y2], [x3, y3], [x4, y4]]) rot_mat = cv2.getRotationMatrix2D((x, y), angle, 1) points = np.dot(rot_mat, np.vstack((points.T, np.ones(4)))) x1, y1 = points[0][0], points[1][0] x2, y2 = points[0][1], points[1][1] x3, y3 = points[0][2], points[1][2] x4, y4 = points[0][3], points[1][3] x, y = (x1 + x3) / 2, (y1 + y3) / 2 w, h = np.abs(x1 - x3), np.abs(y1 - y3) # 返回旋后的标签 return f"{class_id} {x} {y} {w} {h}" # 加载图像和标签 image = cv2.imread("image.jpg") labels = ["0 0.5 0.5 0.3 0.4", "1 0.2 0.7 0.4 0.2"] # 随机生成旋角度 angle = random.randint(0, 360) # 旋图像和标签 rotated_image, M = rotate(image, angle) rotated_labels = [convert_yolo_label(label, angle) for label in labels] # 显示旋后的图像和标签 cv2.imshow("Rotated Image", rotated_image) print("Rotated Labels:") for label in rotated_labels: print(label) cv2.waitKey(0) cv2.destroyAllWindows() ``` 该程序包含两个函数:rotate()函数用于旋图像,convert_yolo_label()函数用于转换YOLO标签。 在程序中,我们首先加载图像和标签。然后,我们使用随机生成的旋角度旋图像,并使用旋矩阵将YOLO标签转换为旋后的坐标。最后,我们显示旋后的图像和标签。 请注意,此代码仅供参考。在实际使用中,您可能需要根据您的数据集格式和需求进行修改。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白熊XBX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值