Converta o arquivo json marcado por labelme para o formato yolo

O arquivo json marcado por labelme é gerado durante a anotação de dados e não pode ser usado diretamente para treinamento de modelo. Cada grande plataforma de treinamento em detecção de alvos ou estrutura de projeto tem seus próprios requisitos de formato de dados, geralmente em formato voc, coco ou yolo. Como o projeto yolov8 é bastante popular, esta postagem do blog detalha o processo de conversão de anotações no formato json para o formato yolo e seu código.

1. Estrutura de dados

1.1 formato de dados labelme (json)

A estrutura de armazenamento de dados Labelme (json) é mostrada na figura abaixo:
Insira a descrição da imagem aqui

Shape: um array que armazena todos os rótulos e caixas correspondentes;
imagePath: caminho da imagem, arquivo json e imagem jpg são armazenados no mesmo caminho
imageHeight: altura da imagem
imageWidth: largura da imagem

Shape é uma matriz que armazena um dicionário. O conteúdo específico do armazenamento é o seguinte:
Insira a descrição da imagem aqui

Rótulo: categoria do rótulo
Pontos: ponto inicial e ponto final da rotulagem do rótulo
Shape_type: retângulo representa um retângulo

Formato de dados 1.2 yolo

Formato de dados e representação de dados
Não há requisitos fixos para o formato do arquivo (geralmente as imagens armazenam a imagem original; os rótulos armazenam a posição do rótulo txt), e o formato básico dos dados é mostrado na figura abaixo:

Insira a descrição da imagem aqui
Descrição das informações da estrutura do arquivo Txt
O formato da tag Txt é: {id da categoria de destino} {coordenada x ponto central do alvo normalizado} {coordenada y do ponto central do alvo normalizado} {largura do quadro de destino normalizado w } {Altura da caixa de destino normalizada h}. Ao contrário de outros dados, as tags yolo possuem apenas ids de categoria e nenhum nome de categoria específico. Além disso, descreve as informações xywh da caixa de anotação em tamanho relativo e não é afetada por alterações no tamanho da imagem.
Insira a descrição da imagem aqui

2. Código de conversão

2.1 Descrição Lógica do Código

json2yolo implementa a conversão de anotações no formato json para o formato yolo. A característica do formato Json é que o nome na forma de str é usado para descrever a categoria da caixa de rótulo, enquanto o formato yolo descreve diretamente a categoria da caixa de rótulo no id da categoria. Na anotação json, cada caixa de anotação está no formato de coordenadas absolutas, especificamente x1, y1, x2, y2 (x1, y1 é o ponto inicial da caixa de anotação, x2, y2 é o ponto final da caixa de anotação), enquanto em o formato yolo, descreve a caixa de rótulo com coordenadas relativas (x em relação a w, y em relação a h), o formato específico é cx, cy, w, h (onde cx, cy são os pontos centrais da caixa de rótulo)

2.2 Todos os códigos

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)

Acho que você gosta

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