(亲测好用)YOLO格式txt数据集转COCO格式json

1、数据集结构形式

YOLO格式数据集:

b文件夹下有images和labels两个文件夹,分别存放图片和标签格式的数据。

两个文件夹下分别有train、val、test三个文件夹,里面存放对应的数据。

COCO数据集格式:

COCO格式数据文件夹下有三个文件夹,annotations里面存放三个json标注文件(代码生成),其他三个文件夹下分别存放对应的图片文件(手动移动)。

2、代码实现

只需要替换最后的两行文件夹路径。以及前面categories 里自己数据集的标签类别和id。

python 复制代码
import json
import os
import shutil
import cv2
 
# info ,license,categories 结构初始化;
# 在train.json,val.json,test.json里面信息是一致的;
 
# info,license暂时用不到
info = {
    "year": 2024,
    "version": '1.0',
    "date_created": 2024 - 12 - 7
}
 
licenses = {
    "id": 1,
    "name": "null",
    "url": "null",
}
 
#自己的标签类别,跟yolo的数据集类别要对应好;
#id就是0,1,2,3 ...依次递增。 name就是标签名称,比如car、person。。。
categories = [
    {
        "id": 0,
        "name": 'car',
        "supercategory": 'lines',
    },
    {
        "id": 1,
        "name": 'person',
        "supercategory": 'lines',
    },
{
        "id": 2,
        "name": 'hat',
        "supercategory": 'lines',
    }
 
]
 
#初始化train,test、valid 数据字典
# info licenses categories 在train和test里面都是一致的;
train_data = {'info': info, 'licenses': licenses, 'categories': categories, 'images': [], 'annotations': []}
test_data = {'info': info, 'licenses': licenses, 'categories': categories, 'images': [], 'annotations': []}
valid_data = {'info': info, 'licenses': licenses, 'categories': categories, 'images': [], 'annotations': []}
 
# image_path 对应yolov8的图像路径,比如images/train;
# label_path 对应yolov8的label路径,比如labels/train 跟images要对应;
def yolo_covert_coco_format(image_path, label_path):
    images = []
    annotations = []
    for index, img_file in enumerate(os.listdir(image_path)):
        if img_file.endswith('.jpg'):
            image_info = {}
            img = cv2.imread(os.path.join(image_path, img_file))
            height, width, channel = img.shape
            image_info['id'] = index
            image_info['file_name'] = img_file
            image_info['width'], image_info['height'] = width, height
        else:
            continue
        if image_info != {}:
            images.append(image_info)
        # 处理label信息-------
        label_file = os.path.join(label_path, img_file.replace('.jpg', '.txt'))
        with open(label_file, 'r') as f:
            for idx, line in enumerate(f.readlines()):
                info_annotation = {}
                class_num, xs, ys, ws, hs = line.strip().split(' ')
                class_id, xc, yc, w, h = int(class_num), float(xs), float(ys), float(ws), float(hs)
                xmin = (xc - w / 2) * width
                ymin = (yc - h / 2) * height
                xmax = (xc + w / 2) * width
                ymax = (yc + h / 2) * height
                bbox_w = int(width * w)
                bbox_h = int(height * h)
                img_copy = img[int(ymin):int(ymax),int(xmin):int(xmax)].copy()
 
                info_annotation["category_id"] = class_id  # 类别的id
                info_annotation['bbox'] = [xmin, ymin, bbox_w, bbox_h]  ## bbox的坐标
                info_annotation['area'] = bbox_h * bbox_w ###area
                info_annotation['image_id'] = index # bbox的id
                info_annotation['id'] = index * 100 + idx  # bbox的id
                # cv2.imwrite(f"./temp/{info_annotation['id']}.jpg", img_copy)
                info_annotation['segmentation'] = [[xmin, ymin, xmax, ymin, xmax, ymax, xmin, ymax]]  # 四个点的坐标
                info_annotation['iscrowd'] = 0  # 单例
                annotations.append(info_annotation)
    return images, annotations
 
# key == train,test,val
# 对应要生成的json文件,比如instances_train.json,instances_test.json,instances_val.json
# 只是为了不重复写代码。。。。。
def gen_json_file(yolov8_data_path, coco_format_path, key):
    print('a1')
    # json path
    json_path = os.path.join(coco_format_path, f'annotations/instances_{key}.json')
    dst_path = os.path.join(coco_format_path, f'{key}')
    if not os.path.exists(os.path.dirname(json_path)):
        os.makedirs(os.path.dirname(json_path), exist_ok=True)
    data_path = os.path.join(yolov8_data_path, f'images/{key}')
    label_path = os.path.join(yolov8_data_path, f'labels/{key}')
    images, anns = yolo_covert_coco_format(data_path, label_path)
    print('a2')
    if key == 'train':
        train_data['images'] = images
        train_data['annotations'] = anns
        with open(json_path, 'w') as f:
            json.dump(train_data, f, indent=2)
        # shutil.copy(data_path,'')
        print('a3')
    elif key == 'test':
        test_data['images'] = images
        test_data['annotations'] = anns
        with open(json_path, 'w') as f:
            json.dump(test_data, f, indent=2)
    elif key == 'val':
        valid_data['images'] = images
        valid_data['annotations'] = anns
        with open(json_path, 'w') as f:
            json.dump(valid_data, f, indent=2)
    else:
        print(f'key is {key}')
    print(f'generate {key} json success!')
    print('a4')
    return


if __name__ == '__main__':

    # 将下列两行代码路径替换为自己的数据集路径
    yolov8_data_path = 'C:/Users/37449/Desktop/b'   #该路径为YOLO格式数据集根目录路径
    coco_format_path = 'C:/Users/37449/Desktop/coco'    #该路径为存放coco格式数据集的根目录路径
    gen_json_file(yolov8_data_path, coco_format_path,key='train')
    gen_json_file(yolov8_data_path, coco_format_path,key='val')
    gen_json_file(yolov8_data_path, coco_format_path, key='test')
相关推荐
今夜有雨.9 小时前
C++JSON 解析器
c++·笔记·后端·学习·json
用户6570941633010 小时前
Kotlin Moshi库 全面使用指南
json
海兰1 天前
【高速缓存】RedisVL 存储类型选择指南:Hash 与 JSON
人工智能·redis·算法·缓存·json·哈希算法
减瓦1 天前
Jackson 使用指南
java·spring boot·json
START_GAME1 天前
yolo模型笔记
笔记·yolo
老猿AI洞察1 天前
智能视觉检测平台——完整商业化项目全功能详解
人工智能·yolo·计算机视觉·视觉检测
m沐沐2 天前
【深度学习】YOLOv2目标检测算法——改进点、网络结构与聚类先验框解析
人工智能·pytorch·深度学习·算法·yolo·目标检测·transformer
制造数据与AI践行者老蒋2 天前
离谱!PromptTemplate 遇上 JSON,花括号直接引发解析战争
数据库·microsoft·json
深度学习lover2 天前
<数据集>yolo 小麦麦穗识别<目标检测>
人工智能·yolo·目标检测·计算机视觉·数据集·小麦麦穗识别
chenjingming6662 天前
JWT(JSON Web Token)有效期查看登录过期时间
json