首页 > 编程语言 >深入解析:如何通过Python脚本将LabelMe标注格式转换为YOLO格式并进行验证

深入解析:如何通过Python脚本将LabelMe标注格式转换为YOLO格式并进行验证

时间:2024-06-18 09:28:23浏览次数:12  
标签:Python YOLO json path 格式 LabelMe 标注

深入解析:如何通过Python脚本将LabelMe标注格式转换为YOLO格式并进行验证

在计算机视觉领域,标注格式的转换是一个经常会遇到的问题。不同的标注格式有不同的应用场景和优势,能够灵活地进行转换是非常重要的技能。在这篇文章中,我们将详细介绍如何通过Python脚本将LabelMe标注格式转换为YOLO格式,并通过图像可视化对转换结果进行验证。这不仅可以帮助我们更好地理解标注格式之间的关系,还能提升我们的数据处理能力。

LabelMe和YOLO标注格式简介

在开始具体的代码实现之前,我们先了解一下LabelMe和YOLO标注格式的基本概念。

LabelMe标注格式

LabelMe是一个开源的图像标注工具,广泛应用于计算机视觉的数据集标注。LabelMe使用JSON文件存储标注信息,每个JSON文件对应一张图像,文件中包含图像的元数据和标注信息。标注信息主要包括标注的形状、位置和类别等。一个典型的LabelMe标注文件的结构如下:

{
   
    "version": "4.5.6",
    "flags": {
   },
    "shapes": [
        {
   
            "label": "cat",
            "points": [[10, 20], [30, 40]],
            "group_id": null,
            "shape_type": "rectangle",
            "flags": {
   }
        }
    ],
    "imagePath": "image1.jpg",
    "imageData": null,
    "imageHeight": 600,
    "imageWidth": 800
}

YOLO标注格式

YOLO(You Only Look Once)是一种实时目标检测系统,因其高效的检测速度和较高的准确率而被广泛应用。YOLO标注格式使用文本文件存储标注信息,每个文件对应一张图像,文件中每一行代表一个目标的标注。每行的数据包括:

  1. 类别ID
  2. 中心点x坐标(相对于图像宽度的比例)
  3. 中心点y坐标(相对于图像高度的比例)
  4. 检测框宽度(相对于图像宽度的比例)
  5. 检测框高度(相对于图像高度的比例)

例如,一个YOLO标注文件的内容如下:

0 0.5 0.5 0.2 0.3
1 0.3 0.6 0.1 0.2

将LabelMe标注格式转换为YOLO标注格式

接下来,我们将介绍如何通过Python脚本将LabelMe标注格式转换为YOLO标注格式。我们会逐步解释脚本中的关键部分,并添加必要的异常处理,以确保代码的鲁棒性和容错性。

导入必要的库

首先,我们需要导入一些必要的库,包括jsonosPIL(用于图像处理)和matplotlib(用于图像可视化)。

import json
import os
from os.path import join
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.patches as patches

定义转换函数

接下来,我们定义一个函数labelme_to_yolo,用于将LabelMe标注格式转换为YOLO标注格式。

def labelme_to_yolo(labelme_dataset_path):
    data_files_dir = join(labelme_dataset_path, 'DataFiles')
    annotations_dir = join(labelme_dataset_path, 'Annotations')
    yolo_labels_dir = join(labelme_dataset_path, 'YOLO_labels')

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

    # 遍历Annotations文件夹中的所有JSON文件
    for json_file in os.listdir(annotations_dir):
        if json_file.endswith('.json'):
            json_path = join(annotations_dir, json_file)
            try:
                with open(json_path, 'r') as file:
                    data = json.load(file)

                # 获取对应的图片文件
                image_file = data['imagePath']
                image_path = join(data_files_dir, image_file)

                # 读取图片尺寸
                with Image.open(image_path) as img:
                    img_width, img_height = img.size

                # 创建对应的YOLO格式标注文件
                yolo_file_path = join(yolo_labels_dir, json_file.replace('.json', '.txt'))
                with open(yolo_file_path

标签:Python,YOLO,json,path,格式,LabelMe,标注
From: https://blog.csdn.net/m0_57781768/article/details/139740556

相关文章

  • 【python】OpenCV—Segmentation
    文章目录cv2.kmeans牛刀小试cv2.kmeanscv2.kmeans是OpenCV库中用于执行K-Means聚类算法的函数。以下是根据参考文章整理的cv2.kmeans函数的中文文档:一、函数功能cv2.kmeans用于执行K-Means聚类算法,将一组数据点划分到K个簇中,使得簇内的数据点尽可能相......
  • 17.零代码八爪鱼采集器数据采集与数据导出——如何导出不同格式数据和数据推送到数据
    首先,多数情况下免费版本的功能,已经可以满足绝大多数采集需求,想了解八爪鱼采集器版本区别的详情,请访问这篇帖子: 3.无代码爬虫八爪鱼采集器工具介绍——个人版本、团队版本的适用性_八爪鱼采集器有单机版本吗-CSDN博客免费版八爪鱼采集器下载​​https://affiliate.bazhuayu.c......
  • 使用Python获取HTTP请求头数据
    前言在Web开发和API交互中,HTTP请求头扮演着至关重要的角色。它们不仅告诉服务器请求的类型(如GET、POST等),还包含了关于客户端、请求内容以及其他重要信息的数据。在Python中,我们可以使用requests库来发送HTTP请求,并查看服务器返回的响应头,但通常我们也需要了解我们发送的请求头内......
  • Python - class Method and static Method
    Themethodsinaclassareassociatedwiththeobjectscreatedforit.Forinvokingthemethodsdefinedinsidethemethod,thepresenceofaninstanceisnecessary.Theclassmethodisamethodthatisalsodefinedinsidetheclassbutdoesnotneedanyob......
  • 精准控制:Python 输入数值范围限制详解
    前言在实际开发过程中,经常需要对用户输入的数值进行限制,以确保输入的数据在合理的范围内。这不仅能防止程序错误,还能提高用户体验。作为一名测试工程师,掌握如何在Python中限制输入数值范围是非常有用的技能。本文将详细介绍如何使用Python实现这一功能,包括基础方法和高级应用......
  • Python - Overloading
    ObjectOrientedProgramming(OOP)allowstheprogrammerstoaddsomeadditionalfunctionalitiestotheoperatorsandmethodswhichhavebasicproperties.Suchakindofredefiningoftheentitiesoftheprogrammingstructureiscalledaspolymorphism.In......
  • Python函数式编程
    函数式编程基础函数式编程与面向对象编程一样都是一种编程范式,函数式编程也称为面向函数的编程。Python提供了高阶函数、函数类型和lambda表达式,他们是实现函数式编程的基础。高阶函数与函数类型如果一个函数可以作为其他函数的参数或者其他函数的返回值,那么这个函数就是“......
  • 大数据SQL格式化规范及示例
    无论是数据仓库开发还是数据分析,编写清晰易读的SQL是一项基本的技能。本文将分享几个SQL格式的规范和示例,旨在提高SQL的可读性和可维护性。虽然这些规范没有严格的标准,但统一的格式可以帮助减少理解和维护SQL代码的时间。不管团队其他人怎样,自己写的要有规范!目录大小......
  • 使用python脚本玩转古早TCAD软件(待更新)
    前言TCAD(TechnologyComputerAidedDesign),虽然原名中没有与半导体器件有关的词汇,但这种软件便是半导体工艺模拟及器件模拟的工具,可以说是EDA软件的一种。TCAD软件同其他EDA软件一样,底层需要复杂的数学模型和数物模型支撑,能大幅减少半导体制造的研发成本,为新型半导体器件提供初......
  • Python - pandas 利用 某一列的值过滤数据
    #FA存在3D不存在建模的代码(1).txtEDLG-S1-M3-L12有一个excel:需求:利用txt中的代码去匹配execl中的调整后的规格型号,将匹配的数据保留,生成新的excelimportpandaswithopen('FA存在3D不存在建模的代码(1).txt','r')asf:txt_codes={item.replace('\n','')......