您的位置:首页 > 游戏 > 手游 > 郑州软件开发定制_设计师培训班怎么样_免费b2b平台推广_成都专业seo公司

郑州软件开发定制_设计师培训班怎么样_免费b2b平台推广_成都专业seo公司

2024/12/25 9:05:27 来源:https://blog.csdn.net/2301_77698138/article/details/143345114  浏览:    关键词:郑州软件开发定制_设计师培训班怎么样_免费b2b平台推广_成都专业seo公司
郑州软件开发定制_设计师培训班怎么样_免费b2b平台推广_成都专业seo公司

文章目录

  • 前言
  • 一、步骤指南
  • 二、代码实现
    • 1.类别名称到ID的映射
    • 2.边界框转换函数
    • 3.JSON解码函数
    • 4.主程序

前言

将JSON标注文件转换为YOLO格式通常涉及从JSON文件中提取图像尺寸、对象类别和边界框坐标,并将这些信息格式化为YOLO格式所需的格式。YOLO格式通常要求每行包含一个对象的类别ID、归一化后的中心坐标(x, y)以及归一化后的宽度和高度(w, h)。

一、步骤指南

  • 读取JSON文件:使用Python的json库读取JSON文件。
  • 提取图像尺寸:从JSON数据中获取图像的宽度和高度。
  • 遍历标注:遍历JSON数据中的标注列表。
  • 提取边界框和类别:对于每个标注,提取边界框的坐标(通常是左上角和右下角的x, y坐标)和对象类别。
  • 转换边界框:将边界框坐标转换为YOLO格式所需的归一化中心坐标和宽度/高度。
  • 写入YOLO格式文件:将类别ID和归一化后的边界框坐标写入文本文件,每行一个对象。

二、代码实现

1.类别名称到ID的映射

import json  
import os  # 类别名称到ID的映射  
name2id = {'dog': 0, 'cat': 1}  # 根据您的数据集添加更多类别  

这是一个字典,将类别名称(如dog和cat)映射到对应的ID(整数)。这是因为在YOLO格式中,目标类别是通过整数ID来表示的。

2.边界框转换函数

def convert(size, box):  dw = 1. / size[0]  dh = 1. / size[1]  x = (box[0] + box[2]) / 2.0  y = (box[1] + box[3]) / 2.0  w = box[2] - box[0]  h = box[3] - box[1]  x = x * dw  y = y * dh  w = w * dw  h = h * dh  return x, y, w, h
  • 定义一个函数,这个函数接受两个参数:size(图像的宽度和高度)和box(边界框的坐标,格式为[x1, y1, x2, y2])。
  • 将边界框的坐标转换为相对于图像尺寸的比例,并计算边界框的中心点(x, y)和宽度(w)及高度(h)。且这些值被归一化到0到1的范围内,这是YOLO格式的要求。

3.JSON解码函数

def decode_json(json_folder_path, json_filename):  # 构造YOLO格式文件的路径  txt_filename = os.path.join('F:\\path\\to\\your\\labels', json_filename.replace('.json', '.txt'))  with open(txt_filename, 'w') as txt_file:  # 读取JSON文件  json_path = os.path.join(json_folder_path, json_filename)  with open(json_path, 'r', encoding='utf-8') as json_file:  # 根据您的JSON文件编码选择正确的编码  data = json.load(json_file)  # 提取图像尺寸(这里假设JSON结构有一个'width'和'height'字段)  img_width = data.get('width', 0)  img_height = data.get('height', 0)  # 遍历标注(这里假设JSON结构有一个'annotations'或'objects'字段包含标注列表)  for annotation in data.get('annotations', data.get('objects', [])):  label_name = annotation['label']  # 提取类别名称  if label_name in name2id:  # 检查类别名称是否在映射中  # 提取边界框坐标(这里假设边界框是一个包含四个元素的列表或数组:[x1, y1, x2, y2])  bbox = annotation['bbox'] if 'bbox' in annotation else annotation['points'][0:2] + annotation['points'][2:4]  # 根据您的JSON结构选择正确的字段  x1, y1, x2, y2 = bbox  # 转换边界框并写入文件  x, y, w, h = convert((img_width, img_height), (x1, y1, x2, y2))  txt_file.write(f"{name2id[label_name]} {x} {y} {w} {h}\n")  
  • 定义函数,这个函数接受JSON文件夹的路径和JSON文件的名称作为输入。

  • 首先构造YOLO格式文件的输出路径。然后,它读取并解析JSON文件,提取图像的宽度和高度,以及标注信息。对于每个标注,它检查类别名称是否在name2id映射中。如果是,它提取边界框坐标,调用convert函数进行转换,并将结果写入YOLO格式的文本文件中。

4.主程序

if __name__ == "__main__":  json_folder_path = 'F:\\path\\to\\your\\jsons'  # 替换为您的JSON文件夹路径  json_filenames = os.listdir(json_folder_path)  for json_filename in json_filenames:  if json_filename.endswith('.json'):  # 只处理JSON文件  decode_json(json_folder_path, json_filename)
  • 这是脚本的入口点。当脚本被直接运行时,这部分代码会被执行。
  • 它设置JSON文件夹的路径,列出该文件夹中的所有文件,并对每个以.json结尾的文件调用decode_json函数。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com