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

前言

本文分享将常规的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标签文件时获取图片的实际尺寸。
python 复制代码
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博客

分享完成~

相关推荐
君臣Andy2 个月前
【YOLO格式的数据标签,目标检测】
yolo格式
Diros1g7 个月前
老版本labelme如何不保存imagedata
labelme·标注·语义3分割
FriendshipT10 个月前
Python将原始数据集和标注文件进行数据增强(随机仿射变换),并生成随机仿射变换的数据集和标注文件
开发语言·人工智能·python·目标检测·json·labelme
FriendshipT10 个月前
Python将已标注的两张图片进行上下拼接并修改、合并其对应的Labelme标注文件
开发语言·人工智能·python·目标检测·json·labelme
大胡子大叔1 年前
深度学习标注工具(包括自动标注)总结——持续更新
自动标注·标注工具·labelme·视频标注·点云标注