yolo格式数据标签转coco格式

yolo格式数据标签转coco格式


最近在使用Deformable detr时输入数据格式为coco类型的标签,因此根据别人的代码改写了一下,将yolo类型标签转换为coco格式。
总共分为两步:
1. 第一步:将yolo的box标签类型(xMin, yMim, xMax, yMax)转化为coco标签类型(xMin, yMim, xMax, yMax),并保存为txt文件,同时相较于yolo的txt文件,coco的注释文件中还多了一列标签对应的图像名称。
输入参数:
(1) 原始标签路径originLabelsDir
存放标签的文件夹:

存放标签文件夹

txt文件中的内容
因为我这边只有一类 所以标签就全是0

在这里插入图片描述
(2)原始图片路径originImagesDir

在这里插入图片描述
(3) 生成的临时注释txt文件
生成的临时文件中的内容应该如下:
将yolo的标签全部存入一个txt文件中
将yolo格式的标签:classId, xCenter, yCenter, w, h转换为
coco格式:classId, xMin, yMim, xMax, yMax格式
coco的id编号从1开始计算,所以这里classId应该从1开始计算
最终annos.txt中每行为imageName, classId, xMin, yMim, xMax, yMax, 一个bbox对应一行
在这里插入图片描述
代码如下

import os
import cv2
import json
from tqdm import tqdm

def yolo2txt(originLabelsDir, originImagesDir, saveTempTxt, img_suffix='png'):
    """
    将yolo的标签全部存入一个txt文件中
    将yolo格式的标签:classId, xCenter, yCenter, w, h转换为
    coco格式:classId, xMin, yMim, xMax, yMax格式
    coco的id编号从1开始计算,所以这里classId应该从1开始计算
    最终annos.txt中每行为imageName, classId, xMin, yMim, xMax, yMax, 一个bbox对应一行
    originLabelsDir: 原始yolo标签路径
    originImagesDir: 原始图像路径
    ssaveTempTxt: 保存txt路径
    )
    """
    txtFileList = os.listdir(originLabelsDir)
    print(f"image number is {len(txtFileList)}")
    with open(saveTempTxt, 'w') as fw:
        for txtFile in tqdm(txtFileList, desc="generating COCO format"):
            # 读取图像长宽
            imagePath = os.path.join(originImagesDir,
                                     txtFile.replace('txt', img_suffix))
            assert os.path.exists(imagePath), f"can\'t find this image {imagePath}"
            image = cv2.imread(imagePath)
            H, W, _ = image.shape

            with open(os.path.join(originLabelsDir, txtFile), '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
                    x1 = (x - w / 2) * W
                    y1 = (y - h / 2) * H
                    x2 = (x + w / 2) * W
                    y2 = (y + h / 2) * H
                    # 为了与coco标签方式对,标签序号从1开始计算
                    fw.write(txtFile.replace('txt', img_suffix) + ' {} {} {} {} {}\n'.format(int(label[0]) + 1, x1, y1, x2, y2))
if __name__ == "__main__":
    # 原始标签路径
    originLabelsDir = '/home/taoyang/Documents/datasets/datasets/wheat_panicle_dataset/train/labels'
    # 转换后的文件保存路径
    saveTempTxt = '/home/taoyang/Documents/datasets/datasets/wheat_panicle_dataset/train/annos_temp.txt'
    # 原始标签对应的图片路径
    originImagesDir = '/home/taoyang/Documents/datasets/datasets/wheat_panicle_dataset/images/train2017'
    yolo2txt(originLabelsDir, originImagesDir, saveTempTxt)

  1. 第二步:生成json注释文件,并保存。
    有三个输入分别为:
    原始图像保存的文件夹:originImagesDir
    类别txt文件:classtxt
    在这里插入图片描述
    上一步生成的临时注释文件:annostxt

最终生成的注释文件.json保存在与annotxt相同路径下

第二步代码如下:

def yolo2json(originImagesDir, classtxt, annostxt):
    # dataset用于保存所有数据的图片信息和标注信息
    dataset = {'categories': [], 'annotations': [], 'images': []}

    # 打开类别标签
    with open(classtxt, 'r') as f:
        classes_ori = f.readlines()
        classes = [i.strip().split(' ') for i in classes_ori if i.strip() != '']

    # 建立类别标签和数字id的对应关系
    for i, cls in classes:
        dataset['categories'].append({'id': i, 'name': cls})

    # 读取images文件夹的图片名称
    indexes = os.listdir(originImagesDir)

    anno_id = -1
    # 读取Bbox信息
    with open(annostxt) as tr:
        annos = tr.readlines()
        # ---------------接着将,以上数据转换为COCO所需要的格式---------------
        with tqdm(total=len(indexes)) as pbar:
            for k, index in enumerate(indexes):
                # 用opencv读取图片,得到图像的宽和高
                im = cv2.imread(os.path.join(originImagesDir, index))
                assert im.all() != None, f"can\'t find this image {os.path.join(originImagesDir, index)}"
                height, width, _ = im.shape
                # 添加图像的信息到dataset中
                dataset['images'].append({'file_name': index,
                                          'id': k,
                                          'width': width,
                                          'height': height})
                del_annos = [] # 保存已经匹配到的注释信息
                for anno in annos:
                    parts = anno.strip().split()

                    # 如果图像的名称和标记的名称对上,则添加标记
                    if parts[0] == index:
                        del_annos.append(anno)
                        anno_id += 1
                        # 类别
                        cls_id = parts[1]
                        # x_min
                        x1 = float(parts[2])
                        # y_min
                        y1 = float(parts[3])
                        # x_max
                        x2 = float(parts[4])
                        # y_max
                        y2 = float(parts[5])
                        width = x2 - x1
                        height = y2 - y1
                        assert width > 0 and height > 0, f"width or height of {index}\'s box is not positive"
                        dataset['annotations'].append({
                            'area': width * height,
                            'bbox': [x1, y1, width, height],
                            'category_id': cls_id, # 根据自己的后续代码决定是否转化为int类型,原来的代码这边是转化成int类
                            # 型,但是我后面的代码中category_id用的是str类型,导致我一直读不进对应标签的图像
                            'id': anno_id,
                            'image_id': k,
                            'iscrowd': 0,
                            # 左上角以及右下角坐标
                            'segmentation': [[x1, y1, x2, y2]]
                        })

                # 删除匹配到的注释
                for da in del_annos:
                    annos.remove(da)
                pbar.update(1)

    if len(annos) != 0:
        print(f"\033[31m can\'t match image for these annotations:\n{annos}\033[0m")

    # 保存结果的文件夹, 保存在与annostxt相同文件夹下,命名为annotations.json
    savefile = os.path.join(annostxt.rsplit('/', 1)[-2], 'annotations.json')
    with open(savefile, 'w', encoding='utf-8') as f:
        json.dump(dataset, f, ensure_ascii=False, indent=1)
if __name__ == "__main__":
    originImagesDir = '/home/taoyang/Documents/datasets/datasets/wheat_panicle_dataset/images/train2017'
    classtxt = '/home/taoyang/Documents/datasets/datasets/wheat_panicle_dataset/train/classes.txt'
    annostxt = '/home/taoyang/Documents/datasets/datasets/wheat_panicle_dataset/train/annos_temp.txt'
    yolo2json(originImagesDir, classtxt, annostxt)
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: yolo-txtcoco-json工具是一种将YOLO格式的文本标注文件换为COCO格式的JSON标注文件的工具。YOLO(You Only Look Once)是一种目标检测算法,而COCO(Common Objects in Context)是一个常见的目标检测和图像分割数据集。有时候我们从YOLO标注工具中获得的标注结果是文本文件的形式,而在使用COCO数据集进行训练和评估时,我们需要将标注结果化为COCO格式的JSON文件。 这个工具可以实现这样的换过程,首先读取YOLO格式的文本文件并解析每个物体的位置、类别和边界框信息。然后根据这些信息结构化生成COCO JSON文件,其中包含了每个物体的类别、标签和位置信息。这样换之后,我们就可以直接使用COCO数据集上的目标检测算法进行训练或者评估。 使用yolo-txtcoco-json工具可以大大简化我们在YOLOCOCO之间进行标注格式换的过程,省去了手动编写换代码的复杂性和耗时。此外,将标注结果换为COCO格式也使得我们能够更加方便地使用COCO数据集的相关工具和算法进行目标检测任务的处理。 总之,yolo-txtcoco-json工具是一个方便实用的工具,可以帮助我们轻松地将YOLO格式的文本标注文件换为COCO格式的JSON标注文件,提高了目标检测任务的效率和准确性。 ### 回答2: yolo-txtcoco-json工具是一种用于将YOLO格式的标注文件换为COCO格式的工具。YOLO(You Only Look Once)是一种目标检测算法,其标注文件是以txt格式存储的,而COCO(Common Objects in Context)是一种通用的目标检测数据格式,其标注文件以json格式存储。 使用yolo-txtcoco-json工具可以方便地将YOLO标注文件换为COCO格式,以便于在COCO格式下进行目标检测任务或者使用COCO预训练模型进行迁移学习。 这个工具的主要功能是将YOLO标注文件中的目标边界框的位置信息、类别信息等提取出来,并按照COCO格式的要求,将这些信息整理为json格式的标注文件。 具体使用这个工具的步骤是:首先,将YOLO标注文件和对应的图片放置在同一个目录下;然后,运行工具提供的命令或脚本,指定输入目录和输出目录;最后,工具会自动遍历输入目录下的所有YOLO标注文件,将其换为相应的COCO格式,并输出到指定的输出目录中。 通过使用yolo-txtcoco-json工具,可以减少手动地从YOLO格式换为COCO格式的工作量,提高工作效率。同时,换后的COCO格式标注文件可以更方便地与其他基于COCO格式的目标检测算法或工具进行兼容和集成,便于进一步的数据处理和模型训练。 ### 回答3: yolo-txtcoco-json工具是一种用于将YOLO格式的标注文件换为COCO格式的标注文件的工具。YOLO格式的标注文件通常是一种纯文本文件,其中包含了每个目标物体的类别、位置和大小等信息。而COCO格式的标注文件是一种结构化的JSON文件,用于存储目标检测任务中的图像标注信息。 这个工具的主要功能是将YOLO格式的标注文件解析,并根据解析结果生成对应的COCO格式的标注文件。在换过程中,它会将YOLO的坐标信息进行换,以适应COCO标注的要求。同时,它还会将目标物体的类别信息换为COCO数据集中所使用的类别编码。换完成后,可以方便地使用生成的COCO格式的标注文件进行目标检测任务的训练和评估。 使用这个工具的好处是可以快速、准确地将YOLO格式的标注文件换为COCO格式的标注文件,从而方便地在COCO数据集上进行目标检测任务。这对于需要使用COCO格式数据集训练模型的研究人员和开发者来说非常有帮助。 总之,yolo-txtcoco-json工具是一种方便的工具,用于将YOLO格式的标注文件换为COCO格式的标注文件,使得目标检测任务的数据处理更加便捷高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值