如何将COCO Json转换为YOLOv8分段格式

问题描述 投票:0回答:2

def Convert_coco_to_yolov8(coco_file):

with open(coco_file) as f:
    coco = json.load(f)


images = coco['images']
annotations = coco['annotations'] 
categories = {cat['id']: cat['name'] for cat in coco['categories']}


os.makedirs('labels', exist_ok=True)


for image in tqdm(images, desc='Converting images'):
    image_id = image['id']
    filename = image['file_name']



    label_filename = filename.split('.png')[0]
    label_path = os.path.join('labels', f'{label_filename}.txt')
    with open(label_path, 'w') as f:

        for ann in annotations:
            if ann['image_id'] != image_id:
                continue

            img_width = image['width']
            img_height = image['height']

            xmin, ymin, width, height = ann['bbox']
          
            xmax = xmin + width
            ymax = ymin + height
            xcen = (xmin + xmax) / 2
            ycen = (ymin + ymax) / 2
            # xcen = (xmin + xmax) / 2 / img_width
            # ycen = (ymin + ymax) / 2 / img_height
            w = xmax - xmin
            h = ymax - ymin
            label = categories[ann['category_id']]
            label_id = ann['category_id']
         
        

            segmentation_points_list = []
            for segmentation in ann['segmentation']:
                segmentation_points = [str(point / img_width) for point in segmentation]
                segmentation_points_list.append(' '.join(segmentation_points))
            segmentation_points_string = ' '.join(segmentation_points_list)


                            

         
            line = '{} {} {} {} {} {}\n'.format(label_id, xcen / img_width, ycen / img_height, w / img_width, h / img_height, segmentation_points_string )
            f.write(line)

脚本正在获取标签,但是当我训练 YOLOv8 时,标签似乎是错误的,我需要将 coco json 转换为 YOLOv8 txt 文件。标签还应该包含分段。请注意,我的 JSON 文件的所有图像都有不同的图像大小

object-detection image-segmentation yolo yolov8
2个回答
0
投票

看看这个脚本中使用的标签格式:

line = '{} {} {} {} {} {}'.format(label_id, x_center, y_center, w_box, h_box, segmentation_points_str)

例如分段格式使用:class x1 y1 x2 y2 ... xn yn。所以我建议将此行更改为:

line = '{} {}'.format(label_id, segmentation_points_str)

实例分割标签格式:https://docs.ultralytics.com/datasets/segment/


0
投票

这对我有用

我已经加载了 images/all_images 目录中的所有图像。我对 train/test/val 使用了不同的 coco .json 注释。您可以进行相应的更改。确保自己创建目录。

import os
import json
import shutil

# load json and save directory for labels train/val/test
coco_file = 'labels/val.json'
save_folder = 'labels/val'

# 0 for truck, 1 for car
category = 1

#source of all the images and destination folder for train/test/val
source_path = "images/all_images"
destination_path = "images/val"


# Use os.listdir() to get a list of filenames in the folder
file_names = os.listdir(source_path)



with open(coco_file) as f:
    coco = json.load(f)

images = coco['images']
annotations = coco['annotations'] 
categories = {cat['id']: cat['name'] for cat in coco['categories']}

#os.makedirs(save_folder, exist_ok=True)

for ann in annotations:
    image = next(img for img in images if (img['id'] == ann['image_id']))
    if (image["file_name"] not in file_names):
        continue
    
    width, height = image['width'], image['height']
    x_coco, y_coco, width_coco, height_coco = ann['bbox']
    
   
    
    category_id = ann['category_id']

    image_id = ann['image_id']

    filename = image['file_name']
    label_filename = filename.split('.jpg')[0]
    label_path = os.path.join(save_folder, f'{label_filename}.txt')
    with open(label_path, 'a') as f:

        segmentation_points_list = []
        for segmentation in ann['segmentation']:
            # Check if any element in segmentation is a string
            if any(isinstance(point, str) for point in segmentation):
                continue  # Skip this segmentation if it contains strings

            segmentation_points = [str(float(point) / (width-1) if i % 2 == 0 else float(point) / (height-1)) for i, point in enumerate(segmentation)]
            segmentation_points_list.append(' '.join(segmentation_points))
            segmentation_points_string = ' '.join(segmentation_points_list)
            line = '{} {}\n'.format(category, segmentation_points_string)
            f.write(line)
            segmentation_points_list.clear()
    image_source = source_path + f'/{image["file_name"]}'
    shutil.copy(image_source, destination_path)

import os
import json
import shutil

# load json and save directory for labels train/val/test
coco_file = 'labels/val.json'
save_folder = 'labels/val'



#source of all the images and destination folder for train/test/val
source_path = "images/all_images"
destination_path = "images/val"


# Use os.listdir() to get a list of filenames in the folder
file_names = os.listdir(source_path)

with open(coco_file) as f:
    coco = json.load(f)

images = coco['images']
annotations = coco['annotations'] 
categories = {cat['id']: cat['name'] for cat in coco['categories']}

#os.makedirs(save_folder, exist_ok=True)

for ann in annotations:
    image = next(img for img in images if (img['id'] == ann['image_id']))
    if (image["file_name"] not in file_names):
        continue
    #print(f"image in annotations =   {type(image['id'])}")
    width, height = image['width'], image['height']
    x_center = (ann['bbox'][0] + ann['bbox'][2] / 2) / width
    y_center = (ann['bbox'][1] + ann['bbox'][3] / 2) / height
    bbox_width = ann['bbox'][2] / width
    bbox_height = ann['bbox'][3] / height
    category_id = ann['category_id']
    image_id = ann['image_id']

    filename = image['file_name']
    label_filename = filename.split('.jpg')[0]
    label_path = os.path.join(save_folder, f'{label_filename}.txt')
    with open(label_path, 'a') as f:

        segmentation_points_list = []
        for segmentation in ann['segmentation']:
            # Check if any element in segmentation is a string
            if any(isinstance(point, str) for point in segmentation):
                continue  # Skip this segmentation if it contains strings

            segmentation_points = [str(float(point) / width) for point in segmentation]
            segmentation_points_list.append(' '.join(segmentation_points))
            segmentation_points_string = ' '.join(segmentation_points_list)
            line = '{} {}\n'.format(categories, segmentation_points_string)
            f.write(line)
            segmentation_points_list.clear()
    image_source = source_path + f'/{image["file_name"]}'
    shutil.copy(image_source, destination_path)
© www.soinside.com 2019 - 2024. All rights reserved.