首页 > 其他分享 >JSON文件转YOLO文件示例

JSON文件转YOLO文件示例

时间:2024-10-29 19:48:19浏览次数:9  
标签:box 文件 示例 YOLO json JSON 类别 path

文章目录

前言

将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函数。

标签:box,文件,示例,YOLO,json,JSON,类别,path
From: https://blog.csdn.net/2301_77698138/article/details/143345114

相关文章

  • 【Nginx学习】5步轻松搞定:用Nginx配置一个静态Web服务器,文件路径定义你真的会了吗?
    ......
  • PeView 命令行PE文件解析工具
    PeView是一款基于C/C++开发的命令行版PE文件解析工具,专门用于解析Windows可执行文件并提供详尽的文件结构和交互式查询功能,帮助用户理解和分析目标程序的内部构成,是逆向分析和软件调试中的重要工具,本次分享工具源代码及使用方法,读者可根据自己的需要参考学习,并以此来更好的......
  • stata基础:教学代码.do文件路径修改
    #学习积累#本人工科跨经管类专业,有C语言编程基础,现在学习stata软件用于数据分析。写本博客是积累学习中遇到的问题,若有不足请多多指教。在安装完stata后,需要进行环境设定,一些简单的设定。如模式字体颜色设定不多赘述。红框处是在stata根目录放了profile.do,目的是一开始就能......
  • gin json binding 参数验证
    验证器说明示例-忽略字段binding:"-"required必填字段binding:“required”min最小长度binding:“min=10”max最大长度binding:“max=10”|或binding:"rgbstructonly如果有嵌套,可以决定只验证结构体上的binding:“structonly”omite......
  • python 读取文件的内容
    在Python中,读取文件内容是一个基础且常见的操作。以下是一些常用的方法来读取文件内容:使用内建的open()函数和read()方法#打开文件withopen('example.txt','r')asfile:#读取文件内容content=file.read()#打印文件内容print(content)这里使用了wit......
  • pyqt5实现nii文件叠加显示
            最近在做一个医学影像处理的项目,要求是使用pyqt5实现T1.nii文件和靶区文件的叠加显示。之前有web前端开发和一些python基础,pyqt5和医学影像文件(nii格式文件)处理都是第一次接触。趁着十一假期比较清闲,记录一下该功能实现的过程(pyqt5相关基础就不说了,B站很多新......
  • Ubuntu虚拟机&conda虚拟环境运行和打包引入SimNIBS软件包的python项目文件
    项目背景:项目是python代码写的,其中有一个模块SimNIBS不能通过pip安装,需要自己下载软件包,在Ubuntu虚拟机的虚拟环境中运行和打包。下面是整个流程和遇到的一些问题,写下来做个记录。(默认此时SimNIBS已经安装好了,还没安装好的话,参见文章Ubuntu虚拟机安装医学影像软件包SimNIBS及报......
  • VMware虚拟机上的Ubuntu网络故障仍需要下载文件的共享文件夹解决办法
    有时候虚拟机的网络问题就像一个阴晴不定的女孩一样,昨天还畅所欲言今天却突然掉线,但是我们仍需要下载一些文件、工具或者源码用来测试,那么这个方法仅适用于这种不需要解决网络问题的特殊情况(有能力还是要去解决网络问题)首先要在计算机上下载你所需要的文件,然后复制到虚拟机上......
  • Linux压缩和解压文件
    1.linux压缩文件到指定文件夹方法一:使用tar命令压缩文件tar-czvf/目标文件夹/压缩文件名.tar.gz/要压缩的文件或文件夹路径这将把指定的文件或文件夹压缩为一个名为“压缩文件名.tar.gz”的gzip压缩文件,并将该文件保存到指定的目标文件夹。方法二:使用zip命令压缩文件zip......
  • NoiLinux 虚拟机挂载主机共享文件夹
    如果你不知道这是干啥的,参考考场上的noip文件夹,可以实现快捷的内外文件互通需求VMtool如果未安装VMtool可以通过以下命令安装sudoapt-getinstallopen-vm-tools-desktopfuse联网下载的NoiLinux自带VMtool,此时会出现以下提示:open-vm-tools-desktopisalreadythe......