labelme でマークされた json ファイルを yolo 形式に変換します

labelme でマークされた json ファイルは、データのアノテーション中に生成されるため、モデルのトレーニングに直接使用することはできません。主要なターゲット検出トレーニング プラットフォームまたはプロジェクト フレームワークには、それぞれ独自のデータ形式要件があり、通常は voc、coco、または yolo 形式です。yolov8 プロジェクトは非常に人気があるため、このブログ投稿では、json 形式の注釈を yolo 形式とそのコードに変換するプロセスについて詳しく説明します。

1. データ構造

1.1 labelme(json)データ形式

Labelme (json) データ ストレージ構造を次の図に示します。
ここに画像の説明を挿入

Shape: すべてのラベルと対応するボックスを格納する配列です;
imagePath: 画像パス、json ファイル、および jpg 画像は同じパスに格納されます
imageHeight: 画像の高さ
imageWidth: 画像の幅

Shape は辞書を格納する配列であり、具体的な格納内容は以下の通りです。
ここに画像の説明を挿入

Label: ラベル カテゴリ
Points: ラベル ラベリングの開始点と終了点
Shape_type: 長方形は長方形を表します

1.2 yolo データ形式

データ形式とデータ表現
ファイル形式には固定要件はありません (通常、画像には元の画像が格納され、ラベルにはテキストのラベル位置が格納されます) 基本的なデータ形式は次の図に示すとおりです。

ここに画像の説明を挿入
Txt ファイル構造情報の説明
Txt タグの形式は、{ターゲット カテゴリ ID} {正規化されたターゲット中心点 x 座標} {正規化されたターゲット中心点 y 座標} {正規化されたターゲット フレーム幅 w } {正規化されたターゲット ボックス高さ h} です。他のデータとは異なり、yolo タグにはカテゴリ ID のみがあり、特定のカテゴリ名はありません。また、アノテーションボックスのxywh情報は相対的なサイズで記述されており、画像サイズの変化には影響されません。
ここに画像の説明を挿入

2. 変換コード

2.1 コードロジックの説明

json2yolo は、json 形式のアノテーションの yolo 形式への変換を実装します。Json形式はラベルボックスのカテゴリをstr形式の名前で記述するのに対し、yolo形式はラベルボックスのカテゴリをカテゴリidで直接記述するのが特徴です。json アノテーションでは、各アノテーション ボックスは絶対座標形式、具体的には x1、y1、x2、y2 (x1、y1 はアノテーション ボックスの始点、x2、y2 はアノテーション ボックスの終点) になります。 yolo形式、ラベルボックスを相対座標(wを基準としたx、hを基準としたy)で記述します。具体的な形式はcx、cy、w、hです(cx、cyはラベルボックスの中心点)

2.2 すべてのコード

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)

おすすめ

転載: blog.csdn.net/m0_74259636/article/details/132768892