YOLO格式转Labelme | 标签信息 | 辅助标注 | txt转json

news2025/1/13 16:49:40

前言

本文分享将常规的YOLO检测信息,转为Labelme中的标签信息。

即:xxx.txt 转 xxx.json。YOLO版本支持YOLOv8、YOLOv5等。

通过模型预测的信息,有了大致的检测位置和类别信息,人工进行微调和审核即可,实现辅助标注。

1、分析YOLO格式

YOLO的标签文件通常是一个包含每行一个标签的TXT文件。

每一行的格式是:<object-class> <x_center> <y_center> <width> <height>。其中:

  • <object-class>是类别索引。
  • <x_center><y_center>是目标的中心点坐标(归一化到0-1)。
  • <width><height>是目标的宽度和高度(归一化到0-1)。

2、分析LabelMe格式

LabelMe使用的是JSON格式,每个标签是一个形状(shape)对象,包含以下信息:

  • label: 标签的名称。
  • points: 多边形的点列表(包含多边形顶点的坐标)。
  • group_id: (可选)用于将不同形状分组的ID。
  • shape_type: 形状类型(例如rectangle, circle等)。
  • flags: (可选)一些额外的标记信息。

3、实现代码

我们指定文件夹,程序遍历该文件夹中的所有txt文件,然后将生成的LabelMe JSON文件保存到指定的输出文件夹中。

这里会提供源代码,需要根据我们的数据修改以下部分:

  • 类别映射class_map 是一个字典,将YOLO的类别索引映射到实际的类别名称。
  • 图片尺寸:假设所有图片的尺寸相同,默认为640*640。
  • 如果图片尺寸不同,需要在每次读取YOLO标签文件时获取图片的实际尺寸。
import os
import json

# 定义类别映射
class_map = {0: 'class_name1', 1: 'class_name2'}  # 根据类别定义填写,这里示例是2个类别

def yolo_to_labelme(txt_path, img_width, img_height):
    with open(txt_path, 'r') as file:
        lines = file.readlines()

    shapes = []
    for line in lines:
        parts = line.strip().split()
        class_id = int(parts[0])
        x_center = float(parts[1])
        y_center = float(parts[2])
        width = float(parts[3])
        height = float(parts[4])

        # 转换为绝对坐标
        x_center *= img_width
        y_center *= img_height
        width *= img_width
        height *= img_height

        # 计算矩形的四个顶点
        x1 = x_center - width / 2
        y1 = y_center - height / 2
        x2 = x_center + width / 2
        y2 = y_center + height / 2

        shapes.append({
            'label': class_map[class_id],
            'points': [[x1, y1], [x2, y2]],
            'group_id': None,
            'shape_type': 'rectangle',
            'flags': {}
        })

    return shapes

# 文件夹路径
txt_folder_path = 'txt_labels'
json_output_path = 'json_labels'

# 图片宽度和高度(按图片尺寸读取并调整)
img_width = 640
img_height = 640

if not os.path.exists(json_output_path):
    os.makedirs(json_output_path)

# 遍历所有txt文件并转换
for txt_file in os.listdir(txt_folder_path):
    if txt_file.endswith('.txt'):
        txt_path = os.path.join(txt_folder_path, txt_file)
        shapes = yolo_to_labelme(txt_path, img_width, img_height)
        
        # 创建LabelMe格式的json文件
        labelme_data = {
            'version': '4.5.6',
            'flags': {},
            'shapes': shapes,
            'imagePath': txt_file.replace('.txt', '.jpg'),
            'imageData': None,
            'imageHeight': img_height,
            'imageWidth': img_width
        }
        
        json_path = os.path.join(json_output_path, txt_file.replace('.txt', '.json'))
        with open(json_path, 'w') as json_file:
            json.dump(labelme_data, json_file, indent=2)

这段代码的整体思路和流程如下:

  1. 类别映射定义

    • 定义一个字典class_map,将YOLO的类别ID映射到实际的类别名称。
    • 这是为了在转换过程中能够正确地将类别ID转换为LabelMe格式中的类别标签。
  2. 定义转换函数

    • 编写一个函数yolo_to_labelme,用于将YOLO格式的标签文件转换为LabelMe格式的JSON文件。该函数的主要步骤包括:
      • 读取YOLOv5标签文件:读取每个TXT文件的内容,每一行代表一个对象的标签信息。
      • 解析标签信息:将每一行的数据解析成类别ID、目标中心点的坐标(x, y)、目标的宽度和高度。
      • 坐标转换:将YOLOv5中归一化的坐标(0-1范围)转换为实际图像尺寸的绝对坐标。
      • 计算矩形的顶点:根据中心点坐标和尺寸计算矩形的左上角和右下角顶点坐标。
      • 生成形状数据:将这些信息转换为LabelMe格式的形状对象,并加入到形状列表中。
      • 返回形状数据:函数返回包含所有形状对象的列表。
  3. 文件路径和图片尺寸设置

    • 指定YOLO标签文件所在的文件夹路径txt_folder_path和输出的LabelMe JSON文件夹路径json_output_path
    • 设置图片的宽度和高度(假设所有图片尺寸相同)。
    • 如果图片尺寸不同,实际使用时需要读取每张图片的尺寸进行调整。
  4. 检查输出文件夹

    • 检查输出文件夹是否存在,如果不存在则创建它。
    • 这确保了转换后的JSON文件有地方保存。
  5. 遍历所有YOLOv5标签文件并转换

    • 将这个JSON对象保存为一个JSON文件,文件名与原始TXT文件名相对应。
    • 创建一个LabelMe格式的JSON对象,包含文件版本、形状数据、图片路径等信息。
    • 调用yolo_to_labelme函数进行转换,得到LabelMe格式的形状数据。
    • 遍历指定文件夹中的所有TXT文件,对于每个文件
  6. 保存LabelMe格式JSON文件

    • 将生成的LabelMe JSON文件保存到指定的输出文件夹中,
    • 文件名与原YOLOv5标签文件名相对应,但扩展名改为.json

推荐博客:

labelme转YOLOv8、YOLOv5 标签格式 标注数据_labelme按yolo格式保存-CSDN博客

【经典论文解读】YOLACT 实例分割(YOLOv5、YOLOv8实例分割的基础)-CSDN博客

一文实现yolov5实例分割(数据标注、标签转换、模型训练、模型推理)_实例分割数据集标注-CSDN博客

YOLOv5代码解析——模型结构篇_yolo打印模型结构-CSDN博客

分享完成~

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

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

相关文章

手摸手教你撕碎西门子S7通讯协议17--【再爆肝】通讯库应用开发wpf版

1、先看颜值 这颜值是采用wpf渲染技术实现的&#xff0c;里面用到很多控件&#xff0c;有第三方控件&#xff0c;也有自定义控件&#xff0c;怎么样&#xff0c;比车模还漂亮吧&#xff0c;超过脸模。 2、实现思路 程序启动时&#xff0c;连接西门子PLC&#xff0c;然后主动读…

计算机基础(Windows 10+Office 2016)教程 —— 第5章 文档编辑软件Word 2016(下)

文档编辑软件Word 2016 5.4 Word 2016的表格应用5.4.1 创建表格5.4.2 编辑表格5.4.3 设置表格 5.5 Word 2016的图文混排5.5.1 文本框操作5.5.2 图片操作5.5.3 形状操作5.5.4 艺术字操作 5.6 Word 2016的页面格式设置5.6.1 设置纸张大小、页面方向和页边距5.6.2 设置页眉、页脚和…

【通俗理解】贝叶斯定理——证据如何更新信念

【通俗理解】贝叶斯定理——证据如何更新信念 信念更新的类比 你可以把贝叶斯定理比作一个“信念调节器”&#xff0c;它根据新的证据来调节我们对某一事件发生的信念强度。 贝叶斯定理的核心作用 组件/步骤描述先验概率在获得新证据之前&#xff0c;对某一事件发生的概率的估…

Mac电脑数据恢复软件 Disk Drill 企业版安装

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将拖入文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;运行软件&#xff0c;点击安装&#xff0c;软件页面打开表示安装成功 三、运行测试1、打开软件&#xff0c;恢复一个…

Jenkins自动化构建运行Springboot项目

通过在Jenkins中创建流水线任务&#xff0c;编写流水线脚本以实现自动化构建和部署SpringBoot项目 好处 自动化: 自动化整个部署流程&#xff0c;减少人工干预&#xff0c;降低出错率。 一致性: 确保每次部署都遵循相同的步骤和配置&#xff0c;提高部署的一致性。 快速反馈…

临沂厚朴里升腾的文旅“烟火气”为城市“夜”经济贡献新活力

“一街兴一城、一街促百业”的案例不胜枚举&#xff0c;一如北京王府井大街古今交融的馥郁人文、上海南京路万国风貌的时尚繁华、成都春熙路美食飘香的热辣滚烫…无不成为其所在城市的一张靓丽名片&#xff0c;吸引着大量的当地居民和外来游客&#xff0c;为城市的经济发展和人…

Matlab|考虑大规模电动汽车接入电网的双层优化调度策略

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《A bi-layer optimization based temporal and spatial scheduling for large-scale electric vehicles》&#xff0c;中文文献可对照《考虑大规模电动汽车接入电网的双层优化调度策略》&…

【C++】学习笔记——智能指针

文章目录 二十一、智能指针1. 内存泄漏2. 智能指针的使用及原理RAII智能指针的原理auto_ptrunique_ptrshared_ptrshared_ptr的循环引用weak_ptr删除器 未完待续 二十一、智能指针 1. 内存泄漏 在上一章的异常中&#xff0c;我们了解到如果出现了异常&#xff0c;会中断执行流…

4.5、作业管理

几乎不太会考 作业的状态 作业&#xff1a;系统为完成一个用户的计算任务&#xff08;或一次事务处理&#xff09;所做的工作总和。例如&#xff0c;对用户编写的源程序&#xff0c;需要经过编译、连接、装入以及执行等步骤得到结果&#xff0c;这其中的每一个步骤称为作业步…

【附安装包】CentOS7(Linux)详细安装教程(手把手图文详解版)

目前流行的虚拟机软件有VMware、Virtual Box和Virtual PC等等&#xff0c;其中最常用的就是VMware。 而centos是Linux使用最广泛的版本之一。 教程开始教程有许多不完备之处&#xff0c;大佬请忽略。。。 1.安装VMware 首先需要准备VMware的安装包以及Ubuntu的ISO镜像&#…

Shell编程——基础语法(2)和 Shell流程控制

文章目录 基础语法&#xff08;2&#xff09;echo命令read命令printf命令test命令 Shell流程控制if-else语句for 循环while 语句until 循环case ... esac跳出循环 基础语法&#xff08;2&#xff09; echo命令 Shell 的 echo 指令与 PHP 的 echo 指令类似&#xff0c;都是用于…

文档管理系统哪个好?优质8款系统深度比较

本文将分享8款文档管理系统&#xff1a;PingCode、Worktile、金山文档、腾讯文档、飞书文档、石墨文档、Confluence、Google Drive。 在寻找合适的文档管理系统时&#xff0c;你是否感到困惑和不安&#xff1f;市场上众多选项让人难以抉择&#xff0c;尤其是当你希望找到既能提…

springCloud组件专题(五) --- seata

一.Seata介绍 1. seata是什么 是一款开源的分布式事务解决方案&#xff0c;供了 AT、TCC、SAGA 和 XA 事务模式。 2.分布式事务中的概念 2.1. 二阶段提交 二阶段提交的含义就是将事务的提交分成两个步骤&#xff0c;分别为&#xff1a; 准备阶段&#xff1a;事务协调者询问所…

Django分页组件封装

目录 1. 前言 2. 代码 3. 使用 3.1 view.py 3.2 list.html 1. 前言 在日常开发中&#xff0c;我们也许会遇到一页内容太多不够展示的问题&#xff0c;过于冗余。 此时&#xff0c;我们就需要进行分页&#xff0c;分页的方式有两种&#xff1a;1. ajax异步分页 2. 普通选…

记一些零碎的只是点和一些安全工具的使用(这里建议将漏洞原理搞清楚,然后可以尝试手动和使用工具)

目录 信息收集 扫描端口 工具 nmap TxPortMap tideFinger fscan 漏洞扫描 目录扫描 利群使用 不同系统、不同框架的漏洞 OA weblogic Struts2 thinkphp漏洞 shiro 蚁剑使用 更高级的连接工具 免杀类型 主机端的免杀 流量层的免杀 安全设备 主机端安全设备…

Docker容器数据库启动,如何用别名JAR jdbc:postgresql://别名:5432/postgres

如果想了解为啥这样做得同学&#xff0c;请去看这个文章 Docker容器网络&#xff08;七&#xff09;_host.docker.internal-CSDN博客 因为docker0网络&#xff0c;需要用别名的话&#xff0c;还得在host文件加 dockerIp(172.0.0.2) 别名 怎么查&#xff0c; docker network …

每日一题 ~ LCR 015. 找到字符串中所有字母异位词

. - 力扣&#xff08;LeetCode&#xff09; 题目解析 题目要求找出字符串中所有的字母异位词。所谓字母异位词指的是两个字符串中字符出现的次数相同&#xff0c;但顺序可以不同的情况。 思路分析 固定窗口&#xff1a;使用滑动窗口技巧&#xff0c;窗口大小固定为待匹配字…

Latex基本数学公式

LaTeX数学公式入门 LaTeX作为一种广泛使用的排版系统&#xff0c;尤其在学术界和科技领域&#xff0c;以其强大的排版能力和灵活性著称。而它的公式编辑能力更是让人叹为观止&#xff0c;经常与Markdown结合使用&#xff0c;以简化文档编写和公式展示的过程。 LaTeX 公式 L…

数字的位操作——326、504、263、190、191、476、461、477、693

326. 3 的幂&#xff08;简单&#xff09; 给定一个整数&#xff0c;写一个函数来判断它是否是 3 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 3 的幂次方需满足&#xff1a;存在整数 x 使得 n 3x 示例 1&#xff1a; 输入&a…

本地部署持续集成工具Jenkins并配置公网地址实现远程自动化构建

文章目录 前言1. 安装Jenkins2. 局域网访问Jenkins3. 安装 cpolar内网穿透软件4. 配置Jenkins公网访问地址5. 公网远程访问Jenkins6. 固定公网地址 前言 本文主要介绍如何在Linux CentOS 7中安装Jenkins并结合cpolar内网穿透工具实现远程访问管理本地部署的Jenkins服务. Jenk…