将YOLO数据集转成COCO格式,单个文件夹转为单个json文件,例如.../images/train转为instance_train.json

这篇具有很好参考价值的文章主要介绍了将YOLO数据集转成COCO格式,单个文件夹转为单个json文件,例如.../images/train转为instance_train.json。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

  • 参考链接:objectdetection-tricks/tricks_4.py
    • 相关视频教学:tricks_4 用于yolov5和v7中的yolo格式转换coco格式的脚本.(如何在v5和v7中输出ap_small,ap_middle,ap_large coco指标)
    • 还可以参考相关的VOC转COCO的方式:damo-yolo/voc2coco.py
  • 代码效果:将数据集转成COCO格式,单个文件夹转为单个json文件,例如…/images/train转为instance_train.json
  • 我的数据集排布
datasets
├─images
│  ├─test
│  ├─train
│  └─val
├─annotations
   ├─test
   ├─train
   └─val

代码

  • 指定好四个参数即可
    • --root_dir:待转换的图像的路径,例如我传入的是训练集的路径...\images\train
    • --save_dir:保存转换后的json文件的路径,通常都是存放在数据集的annotations子文件下的
    • --classtxt_path:存放类别的文件路径
    • --save_name:转换后的json文件名
import os
import cv2
import json
from tqdm import tqdm
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--root_dir', default=r'F:\A_Publicdatasets\RDD2020-1202\train_valid\RDD2020_together\images\test', type=str, help="root path of images and labels, include ./images and ./labels and classes.txt")
parser.add_argument('--save_dir', type=str, default=r'F:\A_Publicdatasets\RDD2020-1202\train_valid\RDD2020_together\annotations', help="if not split the dataset, give a path to a json file")
parser.add_argument('--classtxt_path', type=str, default=r'G:\pycharmprojects\autodl-yolov7\yolov7-main-biyebase\TXTOCOCO\classes.txt', help="class filepath")
parser.add_argument('--save_name', type=str, default='instances_test.json', help="建议只修改后面的train为val、test等,否则自行改代码")

arg = parser.parse_args()

def yolo2coco(arg):

    with open(arg.classtxt_path, 'r') as f: # 获取类别名
        classes = list(map(lambda x: x.strip(), f.readlines()))

    indexes = []
    imagesdir = arg.root_dir
    for file in os.listdir(imagesdir):
        indexes.append(f'{imagesdir}/{file}')   # 绝对路径

    '''
    下面这段代码是对我自己有用的,看官可将其删除
    正常的文件排布应该为:
    -- images
       --- train
       --- val
       --- test
    而我的是:
    -- images
       --- Czech
            ---- train
            ---- val
            ---- test
       --- India ...
       --- Japan ...
    '''
    # --------------- lwd ---------------- #
    # cities = ['Czech', 'India', 'Japan']
    # setdir = arg.save_path.split('_')[-1].split('.')[0] # 'train' 'val' 'test'
    # indexes = []
    # for city in cities:
    #     city_imagedir = f'F:/A_Publicdatasets/RDD2020-1202/train_valid/{city}/images/{setdir}'
    #     for file in os.listdir(city_imagedir):
    #         indexes.append(f'{city_imagedir}/{file}')
    # --------------- lwd ---------------- #


    dataset = {'categories': [], 'annotations': [], 'images': []}
    for i, cls in enumerate(classes, 0):
        dataset['categories'].append({'id': i, 'name': cls, 'supercategory': 'mark'})

    # 标注的id
    ann_id_cnt = 0
    for k, index in enumerate(tqdm(indexes)):
        # 支持 png jpg 格式的图片。
        txtPath = index.replace('images', 'labels').replace('.jpg', '.txt')
        # 读取图像的宽和高
        im = cv2.imread(index)
        imageFile = index.split('/')[-1]    # img.jpg

        height, width, _ = im.shape
        # 添加图像的信息
        if not os.path.exists(txtPath):
            # 如没标签,跳过,只保留图片信息。
            continue
        dataset['images'].append({'file_name': imageFile,
                                  'id': k,
                                  'width': width,
                                  'height': height})
        with open(txtPath, 'r') as fr:
            labelList = fr.readlines()
            for label in labelList:
                label = label.strip().split()
                x = float(label[1])
                y = float(label[2])
                w = float(label[3])
                h = float(label[4])

                # convert x,y,w,h to x1,y1,x2,y2
                H, W, _ = im.shape
                x1 = (x - w / 2) * W
                y1 = (y - h / 2) * H
                x2 = (x + w / 2) * W
                y2 = (y + h / 2) * H
                # 标签序号从0开始计算, coco2017数据集标号混乱,不管它了。
                cls_id = int(label[0])
                width = max(0, x2 - x1)
                height = max(0, y2 - y1)
                dataset['annotations'].append({
                    'area': width * height,
                    'bbox': [x1, y1, width, height],
                    'category_id': cls_id,
                    'id': ann_id_cnt,
                    'image_id': k,
                    'iscrowd': 0,
                    # mask, 矩形是从左上角点按顺时针的四个顶点
                    'segmentation': [[x1, y1, x2, y1, x2, y2, x1, y2]]
                })
                ann_id_cnt += 1

    # 保存结果
    save_path = os.path.join(arg.save_dir, arg.save_name)
    with open(save_path, 'w') as f:
        # json.dump(dataset, f)
        json_str = json.dumps(dataset)
        f.write(json_str)
        print('Save annotation to {}'.format(save_path))


if __name__ == "__main__":
    yolo2coco(arg)

文章来源地址https://www.toymoban.com/news/detail-790204.html

到了这里,关于将YOLO数据集转成COCO格式,单个文件夹转为单个json文件,例如.../images/train转为instance_train.json的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 目标检测任务中常用的数据集格式(voc、coco、yolo)

    VOC数据集(Annotation的格式是xmI) Pascal VOC数据集是目标检测的常用的大规模数据集之一,从05年到12年都会举办比赛,比赛任务task: 分类Classification 目标检测Object Detection 语义分割Class Segmentation 实例分割Object Segmentation Action Classification(专注于人体动作的一种分类) Person Layout(

    2024年02月14日
    浏览(31)
  • 数据集格式相互转换——CoCo、VOC、YOLO、TT100K

    将annotations目录下的所有xml标注文件按coco格式写入了json文件中。 此处得到的是全部的标签信息,可根据如下代码进行train、val和test的比例划分: train和val同理。 train、val和test分别执行一次即可。 以上代码参考自博文数据转换。

    2023年04月09日
    浏览(26)
  • 【数据集转换】VOC数据集转COCO数据集·代码实现+操作步骤

    在自己的数据集上实验时,往往需要将VOC数据集转化为coco数据集,因为这种需求所以才记录这篇文章,代码出处未知,感谢开源。 在远程服务器上测试目标检测算法需要用到测试集,最常用的是coco2014/2017和voc07/12数据集。 coco数据集的地址为http://cocodataset.org/#download voc和co

    2024年02月04日
    浏览(38)
  • VOC/YOLO/COCO数据集格式转换及LabelImg/Labelme/精灵标注助手Colabeler标注工具介绍

    数据集格式:VOC(xml)、YOLO(txt)、COCO(json) 本文主要对 Label格式 ,以及 LabelImg、Labelme、精灵标注助手Colabeler 这常用的三种数据标注软件进行介绍。 LabelImg是目标检测数据标注工具,可以标注标注两种格式: VOC标签格式,标注的标签存储在xml文件 YOLO标签格式,标注的标签存储在

    2023年04月22日
    浏览(72)
  • Docker宿主机复制(单个文件夹/多个文件/单个文件)到容器

    我的JPEGImages里面包含了多张图片,下面的指令将宿主机JPEGImages目录下的所有文件和子目录复制到7a7608e0bf84容器的/home/PaddleSeg/input/目录下 使用多行docker cp指令 docker cp 容器ID或名称:容器源路径 宿主机目标路径 docker cp 宿主机目标路径 容器ID或名称:容器源路径

    2024年02月08日
    浏览(38)
  • 【DL系列】VOC数据集转YOLO数据集(制作YOLOv5/v7自定义数据集)

    前言 平时我们在使用 YOLOv5 、 YOLOv7 官方模型进行魔改训练的时候,一般不会用到 COCO2017 等这样的大型数据集,一般是在自己的自定义数据集或者是一些小的开源数据集上进行调试,这时候就要涉及到数据集的问题。 这里我就 VOC格式的数据集 如何转成 YOLO格式的数据集 ,如

    2024年02月03日
    浏览(34)
  • 利用pycocotools库计算MAP:生成coco格式 json文件数据集和计算map值

    在目标检测任务中,需要通过Map指标判断模型的精度。为了测试engine文件推理结果的精度,本文介绍了如何使用pycocotools库计算Map,在此之前需要根据coco格式生成json文件。 必须按照coco格式生成json,顺序都要保持一致才行,否则报错不通过。 在做验证时,需要提前划分好v

    2024年02月06日
    浏览(40)
  • git拉取指定的单个或多个文件或文件夹

    直接上步骤 初始化仓库 拉取远程仓库信息,省略号为仓库地址 开启 sparse clone 配置需要拉取的文件夹 有一个指定一个,有多个指定多个,路径写对即可! 注意:路径问题,举例说明 路径位置要从项目的最开始文件夹开始,一级级往下配置。 5. 拉取仓库指定位置 注意 :指

    2023年04月11日
    浏览(35)
  • 如何用python获取单个文件 或 文件夹中所有文件的行数

    本例展示获取单个txt文件中的行数: 本例展示获取labels下的所有txt文件内容的总行数: 函数解释 os.walk()是一种遍历目录数的函数,机理类似深度优先搜索和层次搜索策略,其返回的是 root dirs files 返回值解释 root :代表当前遍历的目录路径,string类型 dirs :代表root路径下的

    2024年02月09日
    浏览(49)
  • 【教程】从gitee或者github,下载单个文件或文件夹命令

    (不需要修改任何,只要原样复制,需要按照个人状况修改的话我会标注) 这里 单引号内部需要修改 ,按照自己 想要下载gitee或github的路径 举个栗子:   假如我想要下载web这个目录下的所有文件,我需要这样写: 如果是文件同理,就不加路径后面的 /* 第一个/代表根目录

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包