split_conversion将json转成yolo训练用的txt,在直接按照8:1:1的比例分成训练集,测试集,验证集

news2025/6/2 5:31:39

第一章  使用说明

类别自己在代码中改,其他四个参数

--json-folder:json文件夹路径

--txt-folder:转换成功后txt的存放路径

--images-dir:图片文件夹路径

--save-dir:转换完成分割后所有文件的路径

终端命令行:python split_conversion.py --json-folder "" --txt-folder "" --images-dir "" --save-dir ""

""处是四个路径

第二章 导包

import json
import os
from tqdm import tqdm
import shutil
import random
import argparse

第三章 转换格式函数

def labelme_json_to_yolo(txt_save_path, json_path, class_map):
    """
    将LabelMe格式JSON转换为YOLO TXT标注文件
    :param txt_save_path: TXT保存路径
    :param json_path: LabelMe JSON文件路径
    :param class_map: 类别名映射字典(如{"person": 0})
    """
    with open(json_path, 'r', encoding='utf-8') as f:
        data = json.load(f)

    img_height = data["imageHeight"]
    img_width = data["imageWidth"]
    img_name = os.path.basename(data["imagePath"])  # 提取图片文件名
    txt_name = os.path.splitext(img_name)[0] + ".txt"
    txt_path = os.path.join(txt_save_path, txt_name)

    lines = []
    for shape in data["shapes"]:
        label = shape["label"]
        if label not in class_map:
            continue  # 跳过未定义类别
        cls_id = class_map[label]

        # 解析多边形/矩形标注为边界框(xmin, ymin, xmax, ymax)
        points = shape["points"]
        x_coords = [p[0] for p in points]
        y_coords = [p[1] for p in points]
        xmin = min(x_coords)
        ymin = min(y_coords)
        xmax = max(x_coords)
        ymax = max(y_coords)

        # 计算YOLO格式坐标(归一化中心坐标+宽高)
        x_center = (xmin + xmax) / (2 * img_width)
        y_center = (ymin + ymax) / (2 * img_height)
        w = (xmax - xmin) / img_width
        h = (ymax - ymin) / img_height

        # 过滤无效坐标(避免越界)
        if 0 <= x_center <= 1 and 0 <= y_center <= 1 and w > 0 and h > 0:
            lines.append(f"{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}")

    # 保存TXT文件
    with open(txt_path, 'w') as f:
        f.write('\n'.join(lines))

第四章 划分函数

def batch_convert_labelme_to_yolo(json_folder, txt_folder, class_map):
    """
    批量转换LabelMe格式JSON文件夹到YOLO TXT
    :param json_folder: JSON文件夹路径
    :param txt_folder: TXT保存路径
    :param class_map: 类别名映射字典(如{"person": 0})
    """
    os.makedirs(txt_folder, exist_ok=True)
    json_files = [f for f in os.listdir(json_folder) if f.lower().endswith('.json')]

    for json_file in tqdm(json_files, desc="转换中"):
        json_path = os.path.join(json_folder, json_file)
        labelme_json_to_yolo(txt_folder, json_path, class_map)

    print(f"批量转换完成!共处理{len(json_files)}个JSON文件,保存到:{txt_folder}")

第五章 确认文件夹是否存在

def mkdir(path):
    if not os.path.exists(path):
        os.makedirs(path)

第六章主函数

def main(image_dir, txt_dir, save_dir):
    # 创建文件夹
    mkdir(save_dir)
    images_dir = os.path.join(save_dir, 'images')
    labels_dir = os.path.join(save_dir, 'labels')

    img_train_path = os.path.join(images_dir, 'train')
    img_test_path = os.path.join(images_dir, 'test')
    img_val_path = os.path.join(images_dir, 'val')

    label_train_path = os.path.join(labels_dir, 'train')
    label_test_path = os.path.join(labels_dir, 'test')
    label_val_path = os.path.join(labels_dir, 'val')

    mkdir(images_dir)
    mkdir(labels_dir)
    mkdir(img_train_path)
    mkdir(img_test_path)
    mkdir(img_val_path)
    mkdir(label_train_path)
    mkdir(label_test_path)
    mkdir(label_val_path)

    # 数据集划分比例,训练集80%,验证集10%,测试集10%,按需修改
    train_percent = 0.8
    val_percent = 0.1
    test_percent = 0.1

    total_txt = os.listdir(txt_dir)
    num_txt = len(total_txt)
    list_all_txt = range(num_txt)  # 范围 range(0, num)

    num_train = int(num_txt * train_percent)
    num_val = int(num_txt * val_percent)
    num_test = num_txt - num_train - num_val

    train = random.sample(list_all_txt, num_train)
    # 在全部数据集中取出train
    val_test = [i for i in list_all_txt if not i in train]
    # 再从val_test取出num_val个元素,val_test剩下的元素就是test
    val = random.sample(val_test, num_val)

    print("训练集数目:{}, 验证集数目:{}, 测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
    for i in list_all_txt:
        name = total_txt[i][:-4]

        srcImage = os.path.join(image_dir, name + '.jpg')
        srcLabel = os.path.join(txt_dir, name + '.txt')

        if i in train:
            dst_train_Image = os.path.join(img_train_path, name + '.jpg')
            dst_train_Label = os.path.join(label_train_path, name + '.txt')
            shutil.copyfile(srcImage, dst_train_Image)
            shutil.copyfile(srcLabel, dst_train_Label)
        elif i in val:
            dst_val_Image = os.path.join(img_val_path, name + '.jpg')
            dst_val_Label = os.path.join(label_val_path, name + '.txt')
            shutil.copyfile(srcImage, dst_val_Image)
            shutil.copyfile(srcLabel, dst_val_Label)
        else:
            dst_test_Image = os.path.join(img_test_path, name + '.jpg')
            dst_test_Label = os.path.join(label_test_path, name + '.txt')
            shutil.copyfile(srcImage, dst_test_Image)
            shutil.copyfile(srcLabel, dst_test_Label)

 第七章 主函数调用

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Convert LabelMe JSON to YOLO TXT and split datasets')
    parser.add_argument('--json-folder', type=str, default=r'',
                        help='LabelMe JSON folder path')
    parser.add_argument('--txt-folder', type=str, default=r'',
                        help='YOLO TXT save path')
    parser.add_argument('--class-map', default={"自己的类别": 0}, type=dict,
                        help='Class name mapping dictionary (e.g. {"person": 0})')
    parser.add_argument('--images-dir', type=str, default=r'', help='images path dir')
    parser.add_argument('--save-dir', default=r'', type=str, help='save dir')
    args = parser.parse_args()

    json_folder = args.json_folder
    txt_folder = args.txt_folder
    class_map = args.class_map
    image_dir = args.images_dir
    save_dir = args.save_dir

    # 转换LabelMe JSON到YOLO TXT
    batch_convert_labelme_to_yolo(json_folder, txt_folder, class_map)

    # 划分数据集
    main(image_dir, txt_folder, save_dir)

全部代码如下: 

import json
import os
from tqdm import tqdm  # 可选进度条库
import shutil
import random
import argparse


def labelme_json_to_yolo(txt_save_path, json_path, class_map):
    """
    将LabelMe格式JSON转换为YOLO TXT标注文件
    :param txt_save_path: TXT保存路径
    :param json_path: LabelMe JSON文件路径
    :param class_map: 类别名映射字典(如{"person": 0})
    """
    with open(json_path, 'r', encoding='utf-8') as f:
        data = json.load(f)

    img_height = data["imageHeight"]
    img_width = data["imageWidth"]
    img_name = os.path.basename(data["imagePath"])  # 提取图片文件名
    txt_name = os.path.splitext(img_name)[0] + ".txt"
    txt_path = os.path.join(txt_save_path, txt_name)

    lines = []
    for shape in data["shapes"]:
        label = shape["label"]
        if label not in class_map:
            continue  # 跳过未定义类别
        cls_id = class_map[label]

        # 解析多边形/矩形标注为边界框(xmin, ymin, xmax, ymax)
        points = shape["points"]
        x_coords = [p[0] for p in points]
        y_coords = [p[1] for p in points]
        xmin = min(x_coords)
        ymin = min(y_coords)
        xmax = max(x_coords)
        ymax = max(y_coords)

        # 计算YOLO格式坐标(归一化中心坐标+宽高)
        x_center = (xmin + xmax) / (2 * img_width)
        y_center = (ymin + ymax) / (2 * img_height)
        w = (xmax - xmin) / img_width
        h = (ymax - ymin) / img_height

        # 过滤无效坐标(避免越界)
        if 0 <= x_center <= 1 and 0 <= y_center <= 1 and w > 0 and h > 0:
            lines.append(f"{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}")

    # 保存TXT文件
    with open(txt_path, 'w') as f:
        f.write('\n'.join(lines))


def batch_convert_labelme_to_yolo(json_folder, txt_folder, class_map):
    """
    批量转换LabelMe格式JSON文件夹到YOLO TXT
    :param json_folder: JSON文件夹路径
    :param txt_folder: TXT保存路径
    :param class_map: 类别名映射字典(如{"person": 0})
    """
    os.makedirs(txt_folder, exist_ok=True)
    json_files = [f for f in os.listdir(json_folder) if f.lower().endswith('.json')]

    for json_file in tqdm(json_files, desc="转换中"):
        json_path = os.path.join(json_folder, json_file)
        labelme_json_to_yolo(txt_folder, json_path, class_map)

    print(f"批量转换完成!共处理{len(json_files)}个JSON文件,保存到:{txt_folder}")


# 检查文件夹是否存在
def mkdir(path):
    if not os.path.exists(path):
        os.makedirs(path)


def main(image_dir, txt_dir, save_dir):
    # 创建文件夹
    mkdir(save_dir)
    images_dir = os.path.join(save_dir, 'images')
    labels_dir = os.path.join(save_dir, 'labels')

    img_train_path = os.path.join(images_dir, 'train')
    img_test_path = os.path.join(images_dir, 'test')
    img_val_path = os.path.join(images_dir, 'val')

    label_train_path = os.path.join(labels_dir, 'train')
    label_test_path = os.path.join(labels_dir, 'test')
    label_val_path = os.path.join(labels_dir, 'val')

    mkdir(images_dir)
    mkdir(labels_dir)
    mkdir(img_train_path)
    mkdir(img_test_path)
    mkdir(img_val_path)
    mkdir(label_train_path)
    mkdir(label_test_path)
    mkdir(label_val_path)

    # 数据集划分比例,训练集80%,验证集10%,测试集10%,按需修改
    train_percent = 0.8
    val_percent = 0.1
    test_percent = 0.1

    total_txt = os.listdir(txt_dir)
    num_txt = len(total_txt)
    list_all_txt = range(num_txt)  # 范围 range(0, num)

    num_train = int(num_txt * train_percent)
    num_val = int(num_txt * val_percent)
    num_test = num_txt - num_train - num_val

    train = random.sample(list_all_txt, num_train)
    # 在全部数据集中取出train
    val_test = [i for i in list_all_txt if not i in train]
    # 再从val_test取出num_val个元素,val_test剩下的元素就是test
    val = random.sample(val_test, num_val)

    print("训练集数目:{}, 验证集数目:{}, 测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
    for i in list_all_txt:
        name = total_txt[i][:-4]

        srcImage = os.path.join(image_dir, name + '.jpg')
        srcLabel = os.path.join(txt_dir, name + '.txt')

        if i in train:
            dst_train_Image = os.path.join(img_train_path, name + '.jpg')
            dst_train_Label = os.path.join(label_train_path, name + '.txt')
            shutil.copyfile(srcImage, dst_train_Image)
            shutil.copyfile(srcLabel, dst_train_Label)
        elif i in val:
            dst_val_Image = os.path.join(img_val_path, name + '.jpg')
            dst_val_Label = os.path.join(label_val_path, name + '.txt')
            shutil.copyfile(srcImage, dst_val_Image)
            shutil.copyfile(srcLabel, dst_val_Label)
        else:
            dst_test_Image = os.path.join(img_test_path, name + '.jpg')
            dst_test_Label = os.path.join(label_test_path, name + '.txt')
            shutil.copyfile(srcImage, dst_test_Image)
            shutil.copyfile(srcLabel, dst_test_Label)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Convert LabelMe JSON to YOLO TXT and split datasets')
    parser.add_argument('--json-folder', type=str, default=r'',
                        help='LabelMe JSON folder path')
    parser.add_argument('--txt-folder', type=str, default=r'',
                        help='YOLO TXT save path')
    parser.add_argument('--class-map', default={"自己的类别": 0}, type=dict,
                        help='Class name mapping dictionary (e.g. {"person": 0})')
    parser.add_argument('--images-dir', type=str, default=r'', help='images path dir')
    parser.add_argument('--save-dir', default=r'', type=str, help='save dir')
    args = parser.parse_args()

    json_folder = args.json_folder
    txt_folder = args.txt_folder
    class_map = args.class_map
    image_dir = args.images_dir
    save_dir = args.save_dir

    # 转换LabelMe JSON到YOLO TXT
    batch_convert_labelme_to_yolo(json_folder, txt_folder, class_map)

    # 划分数据集
    main(image_dir, txt_folder, save_dir)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2393321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第1章 基础知识】1.8 在 Canvas 中使用 HTML 元素

文章目录 前言示例-橡皮筋式选取框示例代码 前言 尽管我们可以说 Canvas 是 HTML5 之中最棒的功能&#xff0c;不过在实现网络应用程序时&#xff0c;很少会单独使用它。在绝大多数情况下&#xff0c;你都会将一个或更多的 canvas 元素与其他 HTML 控件结合起来使用&#xff0…

c++流之sstream/堆or优先队列的应用[1]

目录 c流之sstream 解释 注意事项 215.数据流的第k大 问题分析 修正代码 主要修改点 优先队列的比较规则 代码中的比较逻辑 为什么这样能维护第 k 大元素&#xff1f; 举个例子 总结 Python 实现&#xff08;使用heapq库&#xff09; Java 实现&#xff08;使用P…

SAR ADC 比较器噪声分析(二)

SAR ADC的比较器是非常重要的模块&#xff0c;需要仔细设计。主要考虑比较器的以下指标&#xff1a; 1)失调电压 2)输入共模范围 3)比较器精度 4)传输延时 5)噪声 6)功耗 这里主要讲一下动态比较器的noise。 动态比较器一般用于高速SAR ADC中&#xff0c;且精度不会超过12bit…

机器学习Day5-模型诊断

实现机器学习算法的技巧。当我们训练模型或使用模型时&#xff0c;发现预测误差很 大&#xff0c;可以考虑进行以下优化&#xff1a; &#xff08;1&#xff09;获取更多的训练样本 &#xff08;2&#xff09;使用更少的特征 &#xff08;3&#xff09;获取其他特征 &#xff…

vscode一直连接不上虚拟机或者虚拟机容器怎么办?

1. 检查并修复文件权限 右键点击 C:\Users\20325\.ssh\config 文件&#xff0c;选择 属性 → 安全 选项卡。 确保只有你的用户账户有完全控制权限&#xff0c;移除其他用户&#xff08;如 Hena\Administrator&#xff09;的权限。 如果 .ssh 文件夹权限也有问题&#xff0c;同…

初学c语言21(文件操作)

一.为什么使用文件 之前我们写的程序的数据都是存储到内存里面的&#xff0c;当程序结束时&#xff0c;内存回收&#xff0c;数据丢失&#xff0c; 再次运行程序时&#xff0c;就看不到上次程序的数据&#xff0c;如果要程序的数据一直保存得使用文件 二.文件 文件一般可以…

华为OD机试真题——数据分类(2025B卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 B卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《数据…

JavaWeb开发基础Servlet生命周期与工作原理

Servlet生命周期 Servlet的生命周期由Servlet容器(如Tomcat、Jetty等)管理&#xff0c;主要包括以下5个阶段&#xff1a; 加载Servlet类 创建Servlet实例 调用init方法 调用service方法 调用destroy方法 加载(Loading)&#xff1a; 当Servlet容器启动或第一次接收到对某个…

三防平板科普:有什么特殊功能?应用在什么场景?

在数字化浪潮席卷全球的今天&#xff0c;智能设备已成为现代工业、应急救援、户外作业等领域的核心工具。然而&#xff0c;常规平板电脑在极端环境下的脆弱性&#xff0c;如高温、粉尘、水浸或撞击&#xff0c;往往成为制约效率与安全的短板。三防平板&#xff08;防水、防尘、…

百度外链生态的优劣解构与优化策略深度研究

本文基于搜索引擎算法演进与外链建设实践&#xff0c;系统剖析百度外链的作用机制与价值模型。通过数据统计、案例分析及算法逆向工程&#xff0c;揭示不同类型外链在权重传递、流量获取、信任背书等维度的差异化表现&#xff0c;提出符合搜索引擎规则的外链建设技术方案&#…

【速写】PPOTrainer样例与错误思考(少量DAPO)

文章目录 序言1 TRL的PPO官方样例分析2 确实可行的PPOTrainer版本3 附录&#xff1a;DeepSeek关于PPOTrainer示例代码的对话记录Round 1&#xff08;给定模型数据集&#xff0c;让它开始写PPO示例&#xff09;Round 2 &#xff08;指出PPOTrainer的参数问题&#xff09;关键问题…

5.26 面经整理 360共有云 golang

select … for update 参考&#xff1a;https://www.cnblogs.com/goloving/p/13590955.html select for update是一种常用的加锁机制&#xff0c;它可以在查询数据的同时对所选的数据行进行锁定&#xff0c;避免其他事务对这些数据行进行修改。 比如涉及到金钱、库存等。一般这…

中国移动咪咕助力第五届全国人工智能大赛“AI+数智创新”专项赛道开展

第五届全国人工智能大赛由鹏城实验室主办&#xff0c;新一代人工智能产业技术创新战略联盟承办&#xff0c;华为、中国移动、鹏城实验室科教基金会等单位协办&#xff0c;广东省人工智能与机器人学会支持。 大赛发布“AI图像编码”、“AI增强视频质量评价”、“AI数智创新”三大…

模具制造业数字化转型:精密模塑,以数字之力铸就制造基石

模具被誉为 “工业之母”&#xff0c;是制造业的重要基石&#xff0c;其精度直接决定了工业产品的质量与性能。在工业制造向高精度、智能化发展的当下&#xff0c;《模具制造业数字化转型&#xff1a;精密模塑&#xff0c;以数字之力铸就制造基石》这一主题&#xff0c;精准点明…

PECVD 生成 SiO₂ 的反应方程式

在PECVD工艺中&#xff0c;沉积氧化硅薄膜以SiH₄基与TEOS基两种工艺路线为主。 IMD Oxide&#xff08;USG&#xff09; 这部分主要沉积未掺杂的SiO₂&#xff0c;也叫USG&#xff08;Undoped Silicate Glass&#xff09;&#xff0c;常用于IMD&#xff08;Inter-Metal Diele…

2024 CKA模拟系统制作 | Step-By-Step | 17、题目搭建-排查故障节点

目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. Kubernetes 节点状态诊断 2. 节点故障修复技能 3. 持久化修复方案 4. SSH 特权操作 三、考点详细讲解 1. 节点状态机制详解 2. 常见故障原因深度分析 3. 永久修复技术方案 四、实验环境搭建步骤…

如何将图像插入 PDF:最佳工具比较

无论您是编辑营销材料、写报告还是改写原来的PDF文件&#xff0c;将图像插入 PDF 都至关重要。幸运的是&#xff0c;有多种在线和离线工具可以简化此任务。在本文中&#xff0c;我们将比较一些常用的 PDF 添加图像工具&#xff0c;并根据您的使用场景推荐最佳解决方案&#xff…

人工智能与机器学习从理论、技术与实践的多维对比

人工智能(Artificial Intelligence, AI)提出“让机器像人类一样思考”的目标,其核心理论围绕符号系统假设展开——认为智能行为可通过逻辑符号系统(如谓词逻辑、产生式规则)建模。 机器学习(Machine Learning, ML)是人工智能的子集,聚焦于通过数据自动改进算法性能的理…

什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程

什么是 WPF 技术&#xff1f;什么是 WPF 样式&#xff1f;下载、安装、配置、基本语法简介教程 摘要 WPF教程、WPF开发、.NET 8 WPF、Visual Studio 2022 WPF、WPF下载、WPF安装、WPF配置、WPF样式、WPF样式详解、XAML语法、XAML基础、MVVM架构、数据绑定、依赖属性、资源字典…

流程自动化引擎:让业务自己奔跑

在当今竞争激烈的商业环境中&#xff0c;企业面临着快速变化的市场需求、日益复杂的业务流程以及不断增长的运营成本。如何优化业务流程、提升效率并降低成本&#xff0c;成为企业持续发展的关键问题。 流程自动化引擎&#xff08;Process Automation Engine&#xff09;作为一…