(亲测好用)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')
相关推荐
zy_destiny2 小时前
深度学习实战-基于YOLOv8的玉米雄穗目标检测:从数据集下载到训练部署全流程实录
yolo·目标检测·机器学习
星河耀银海3 小时前
数据解析:AI返回JSON数据在HTML5中的渲染方法
人工智能·json·html5
三8448 小时前
Fastjson 漏洞 · 01 · 认识 Fastjson 与序列化基础
json·fastjson·反序列化
YOLO数据集集合8 小时前
外墙裂缝目标检测YOLO数据集:6,296张图像助力建筑病害智能识别| 外墙裂缝检测 YOLO数据集 建筑健康监测 无人机巡检 目标检测8030期
yolo·目标检测·无人机·建筑·外墙裂缝·建筑病害
一直在努力的小宁10 小时前
【阅读笔记】具身操作的数采方案概览
后端·json·restful·具身智能·vla·vlm
richard_yuu11 小时前
Hopfield 网络:联想记忆的「鼻祖」,为什么它能「回忆」?
深度学习·神经网络·yolo·机器学习
炎龙铠甲会合体12 小时前
从 SPEC 到上板:在 Zynq-7020 上用 RTL 手写一个 YOLO 卷积加速器(完整教程)
yolo·fpga开发·axi·芯片验证
wuyk55515 小时前
Python实战项目05:JSON数据解析与数据可视化小案例|全套实战闭环
python·信息可视化·json
波力海苔夹心脆6751 天前
C# 序列化与反序列化详解:System.Text.Json、Newtonsoft.Json、XmlSerializer 用法、特性选项与安全实践
经验分享·后端·c#·json·.net
sali-tec2 天前
C# 基于OpenCv的视觉工作流-章110-YOLO 实例分割
图像处理·人工智能·opencv·算法·yolo·计算机视觉