lablelme标注的数据转成YOLO v8 格式

1 labelme 转 yolov8 格式

import json
import cv2
import numpy as np
import os
def json2yolo(path):
    # dic={'N_shaoxi':'0',   'N_qiaoqi':'1',   'N_qiaojie':'2',   'N_pianyi':'3',   'N_yiwu': '4', \
    #      'NV_shaoxi': '5', 'NV_qiaoqi': '6', 'NV_qiaojie': '7', 'NV_pianyi': '8', 'NV_yiwu': '9',\
    #      'R_shaoxi': '10',  'R_qiaoqi': '11',  'R_qiaojie': '12',  'R_pianyi': '13',  'R_yiwu': '14',\
    #      'XS_shaoxi': '15', "XS_qiaoqi": '16', 'XS_qiaojie': '17', 'XS_pianyi': '18', 'XS_yiwu': '19',
    #      '1': '0'}
    dic={'N_shaoxi':'0',   'N_qiaoqi':'1',   'N_qiaojie':'2',   'N_pianyi':'3',   'N_yiwu': '4', \
         'NV_shaoxi': '5', 'NV_qiaoqi': '6', 'NV_qiaojie': '7', 'NV_pianyi': '8', 'NV_yiwu': '9',\
         'R_shaoxi': '10',  'R_qiaoqi': '11',  'R_qiaojie': '12',  'R_pianyi': '13',  'R_yiwu': '14',\
         'XS_shaoxi': '15', "XS_qiaoqi": '16', 'XS_qiaojie': '17', 'XS_pianyi': '18', 'XS_yiwu': '19',
         'XP_shaoxi': '15', "XP_qiaoqi": '16', 'XP_qiaojie': '17', 'XP_pianyi': '18', 'XP_yiwu': '19'}
    #dic = {'N_shaoxi': '0', 'N_shaoxi': '1','N_qiaojie': '2','N_pianyi':'3','N_yiwu:'4'}  # 类别字典

    if ".json" in path:
        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
            wi=abs(x2-x1)
            hi=abs(y2-y1)

            #将数据组装成yolo格式
            line="%s %.4f %.4f %.4f %.4f\n"%(dic[i['label']],cx,cy,wi,hi)#生成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()
    else:
        filename = path.replace('.jpg', '.txt')  # 将path里的json替换成txt,生成txt里相对应的文件路径
        fh = open(filename, 'w', encoding='utf-8')
        fh.close()

path= "E:/_0904/"
path_list_sub = os.listdir(path)
print("path_list_sub", path_list_sub)
for path_sub in path_list_sub:
    json_path_list =os.listdir(path+path_sub)
    path_list2=[x for x in json_path_list]#获取所有json文件的路径
   # path_list2 = [x for x in json_path_list if ".json" in x]  # 获取所有json文件的路径
    print("len of path_list2 ",path_sub,len(path_list2))
    for p in path_list2:
        absolute_path= (path+path_sub+'/'+p)
        print("abs path",absolute_path)
        json2yolo(path+path_sub+'/'+p)

2 分为训练集&验证集合

import json
import cv2
import numpy as np
import os
import shutil
root_root_path = "。/0904/"
root_paths = os.listdir(root_root_path)
for root_path in root_paths:  # DATE NAMED DATA
    root_path = root_root_path+root_path+'/'
   # root_path = "E:/AOI_DATA/sort/data0705/"
    class_path_list = os.listdir(root_path)
    print("path_list_sub", class_path_list)
    all_file_path=[]
    index=0
    for class_path in class_path_list: #N NV R XS
        all_path_list =os.listdir(root_path+class_path)
        for file in all_path_list:
            # print()
            all_file_path.append((root_path + class_path + '/' + file))
           # os.path.exists(test_file.txt)
    print("file len ",len(all_file_path))

    txt_file_path=[]
    for file_path in all_file_path:
        if file_path[-3:]=="txt":
            print("file_path",file_path)
            txt_file_path.append(file_path)
    # print(txt_file_path)
    print("txt file len ",len(txt_file_path))
    train_index = 0
    valid_index = 0
    split_index = 0
    for tf in txt_file_path:
        if os.path.exists(tf[:-3]+'jpg'):
            if split_index % 5 != 0:
                #pass
                shutil.copy(tf,fr'.\X_DATA\train\labels')
                shutil.copy(tf[:-3]+'jpg', fr'.\train\images')
                train_index += 1

            else:
                shutil.copy(tf,fr'.\X_DATA\valid\labels')
                shutil.copy(tf[:-3]+'jpg', fr'.\X_DATA\valid\images')
                valid_index += 1
            split_index += 1


    print("train_index image num:", train_index)
    print("valid_index image num:", valid_index)
    print("split_index image num:", split_index)
你可以使用Python编写脚本来将COCO格式的JSON标注数据转换为标准的YOLO格式的TXT文件。下面是一个示例代码,帮助你完成这个转换过程: ```python import json def coco_to_yolo(coco_path, yolo_path): with open(coco_path, 'r') as f: data = json.load(f) images = data['images'] annotations = data['annotations'] categories = data['categories'] # 创建类别索引字典 category_dict = {} for category in categories: category_dict[category['id']] = category['name'] with open(yolo_path, 'w') as f: for annotation in annotations: image_id = annotation['image_id'] image_info = next((image for image in images if image['id'] == image_id), None) if image_info is None: continue width = image_info['width'] height = image_info['height'] bbox = annotation['bbox'] x_center = bbox[0] + bbox[2] / 2 y_center = bbox[1] + bbox[3] / 2 x_center /= width y_center /= height bbox_width = bbox[2] / width bbox_height = bbox[3] / height class_id = annotation['category_id'] class_name = category_dict[class_id] line = f"{class_name} {x_center} {y_center} {bbox_width} {bbox_height}\n" f.write(line) # 使用示例 coco_to_yolo('coco.json', 'yolo.txt') ``` 你需要将`coco.json`替换为你的COCO格式的JSON文件路径,将`yolo.txt`替换为你想要保存的YOLO格式的TXT文件路径。这段代码将会遍历COCO数据集中的每个标注框,并将其转换为YOLO格式的文本行,每行包含类别名称、边界框相对于图像宽度和高度的归一化坐标以及边界框相对于图像宽度和高度的归一化宽度和高度。 希望这可以帮助到你!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值