Convierta el archivo json etiquetado por labelme al formato yolo

El archivo json marcado por labelme se genera durante el etiquetado de datos y no se puede aplicar directamente al entrenamiento del modelo. Todas las principales plataformas de capacitación en detección de objetivos o marcos de proyectos tienen sus propios requisitos de formato de datos, generalmente en formato voc, coco o yolo. Dado que el proyecto yolov8 está relativamente de moda, esta publicación de blog presenta en detalle el proceso de conversión de anotaciones en formato json al formato yolo y su código.

1. Estructura de datos

1.1 formato de datos labelme (json)

La estructura de almacenamiento de datos de Labelme (json) se muestra en la siguiente figura:
Insertar descripción de la imagen aquí

Shape: es una matriz que almacena todas las etiquetas y cuadros correspondientes;
imagePath: ruta de la imagen, los archivos json y las imágenes jpg se almacenan en la misma ruta
imageHeight: la altura de la imagen
imageWidth: el ancho de la imagen

La forma es una matriz que almacena diccionarios y el contenido de almacenamiento específico es el siguiente:
Insertar descripción de la imagen aquí

Etiqueta: categoría de etiqueta
Puntos: el punto inicial y final del etiquetado de etiquetas
Tipo_forma: rectángulo significa rectángulo

1.2 formato de datos yolo

Formato de datos y representación de datos
No existen requisitos fijos para el formato de archivo (generalmente las imágenes almacenan la imagen original; las etiquetas almacenan la posición de la etiqueta de texto). El formato de datos básico es como se muestra en la siguiente figura:

Insertar descripción de la imagen aquí
Descripción de la información de la estructura del archivo de texto
El formato de la etiqueta de texto es: {ID de categoría de destino} {coordenada x del punto central del objetivo normalizado} {coordenada y del punto central del objetivo normalizado} {ancho del marco de destino normalizado w} {alto del cuadro de destino normalizado h}. A diferencia de otros datos, las etiquetas yolo solo tienen identificadores de categoría y ningún nombre de categoría específico. Además, describe la información xywh del cuadro de anotación en tamaño relativo, que no se ve afectado por el cambio de tamaño de la imagen.
Insertar descripción de la imagen aquí

2. Convertir código

2.1 Descripción de la lógica del código

json2yolo realiza la conversión de anotaciones en formato json al formato yolo. La característica del formato Json es describir la categoría del cuadro de etiqueta con el nombre en forma de cadena, mientras que el formato yolo describe directamente la categoría del cuadro de etiqueta con la identificación de categoría. En la anotación json, cada cuadro de anotación está en formato de coordenadas absolutas, específicamente x1, y1, x2, y2 (x1, y1 son el punto inicial del cuadro de anotación, x2, y2 son los puntos finales del cuadro de anotación), mientras que en la formato yolo, describe el cuadro de etiqueta con coordenadas relativas (x es relativo a w, y es relativo a h), y el formato específico es cx, cy, w, h (donde cx, cy son el punto central del cuadro de etiqueta)

2.2 Todo el código

import json
import cv2
import numpy as np
import os

def json2yolo(path):
    dic={
    
    '火':'0',"烟雾":'1'}#类别字典
    data = json.load(open(path,encoding="utf-8"))#读取带有中文的文件
    w=data["imageWidth"]#获取jaon文件里图片的宽高
    h=data["imageHeight"]
    all_line=''
    for i in  data["shapes"]:
        #归一化坐标点。并得到cx,cy,w,h
        [[x1,y1],[x2,y2]]=i['points'] 
        x1,x2=x1/w,x2/w
        y1,y2=y1/h,y2/h
        cx=(x1+x2)/2
        cy=(y1+y2)/2
        w=abs(x2-x1)
        h=abs(y2-y1)

        #将数据组装成yolo格式
        line="%s %.4f %.4f %.4f %.4f\n"%(dic[i['label']],cx,cy,w,h)#生成txt文件里每行的内容
        all_line+=line
    #print(all_line)
    filename=path.replace('json','txt')#将path里的json替换成txt,生成txt里相对应的文件路径
    fh=open(filename,'w',encoding='utf-8')
    fh.write(all_line)
    fh.close()

path="D:/yolo_seq/fire_smoke/data/data/"
path_list=os.listdir(path)
path_list2=[x for x in path_list if ".json" in x]#获取所有json文件的路径
for p in path_list2:
    json2yolo(path+p)

Supongo que te gusta

Origin blog.csdn.net/m0_74259636/article/details/132768892
Recomendado
Clasificación