(亲测好用)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')
相关推荐
白熊1884 小时前
【计算机视觉】CV实战项目 - 基于YOLOv5的人脸检测与关键点定位系统深度解析
人工智能·yolo·计算机视觉
沉迷...6 小时前
详解.vscode 下的json .vscode文件夹下各个文件的作用
ide·vscode·json
一勺汤8 小时前
YOLOv11改进-双Backbone架构:利用双backbone提高yolo11目标检测的精度
人工智能·yolo·双backbone·double backbone·yolo11 backbone·yolo 双backbone
豆芽81912 小时前
图解YOLO(You Only Look Once)目标检测(v1-v5)
人工智能·深度学习·学习·yolo·目标检测·计算机视觉
聪明的墨菲特i12 小时前
SQL进阶知识:九、高级数据类型
xml·数据库·sql·mysql·json·空间数据类型
Eric.Lee202113 小时前
数据集-目标检测系列- F35 战斗机 检测数据集 F35 plane >> DataBall
人工智能·算法·yolo·目标检测·计算机视觉
AAA顶置摸鱼15 小时前
使用 Pandas 进行多格式数据整合:从 Excel、JSON 到 HTML 的处理实战
json·excel·pandas
冰^1 天前
MySQL VS SQL Server:优缺点全解析
数据库·数据仓库·redis·sql·mysql·json·数据库开发
Jamesvalley1 天前
【修复】Django收到请求报Json解析错误
django·json
白熊1881 天前
【计算机视觉】CV实战项目 - 基于YOLOv5与DeepSORT的智能交通监控系统:原理、实战与优化
人工智能·yolo·计算机视觉