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 文件的所有图像都有不同的图像大小
看看这个脚本中使用的标签格式:
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)
这对我有用
我已经加载了 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)