ExDark数据集转化为YOLO格式(手把手、无脑)

共分三步走

第一步:下载ExDark数据集

先从这里下载ExDark原始数据集,下好解压了是这个样子:
数据集地址:
方式一:我的百度云链接:https://pan.baidu.com/s/1hYT2qe5TaI_x59XQf0IuUg
提取码:8888
方式二:官网:https://aistudio.baidu.com/datasetdetail/129450
解压好的样子:在这里插入图片描述

第二步:准备

原本的(标注)格式:
在这里插入图片描述

转换后的(标注)格式:
在这里插入图片描述
转换条件:
在同一目录下,
①新建一个文件夹“output”——存放转换后的数据集
②新建一个py代码“recipy”——转换的程序
目前文件夹内是长这样的:
在这里插入图片描述

将以下代码放进recipy:
注:先完整的复制过去,我在下面说改哪里,怎么改

# ExDark数据集转化为YOLO格式
import os
from PIL import Image
import argparse
import shutil

labels = ['Bicycle', 'Boat', 'Bottle', 'Bus', 'Car', 'Cat', 'Chair', 'Cup', 'Dog', 'Motorbike', 'People', 'Table']


def ExDark2Yolo(txts_dir: str, imgs_dir: str, ratio: str, version: int, output_dir: str):
    ratios = ratio.split(':')
    ratio_train, ratio_test, ratio_val = int(ratios[0]), int(ratios[1]), int(ratios[2])
    ratio_sum = ratio_train + ratio_test + ratio_val
    dataset_perc = {'train': ratio_train / ratio_sum, 'test': ratio_test / ratio_sum, 'val': ratio_val / ratio_sum}

    for t in dataset_perc:
        os.makedirs('/'.join([output_dir, 'images', t]))
        os.makedirs('/'.join([output_dir, 'labels', t]))

    for label in labels:
        print('Processing {}...'.format(label))
        filenames = os.listdir('/'.join([txts_dir, label]))
        cur_idx = 0
        files_num = len(filenames)

        for filename in filenames:
            cur_idx += 1
            filename_no_ext = '.'.join(filename.split('.')[:-2])
            if cur_idx < dataset_perc.get('train') * files_num:
                set_type = 'train'
            elif cur_idx < (dataset_perc.get('train') + dataset_perc.get('test')) * files_num:
                set_type = 'test'
            else:
                set_type = 'val'
            output_label_path = '/'.join([output_dir, 'labels', set_type, filename_no_ext + '.txt'])
            yolo_output_file = open(output_label_path, 'a')

            name_split = filename.split('.')
            img_path = '/'.join([imgs_dir, label, '.'.join(filename.split('.')[:-1])])
            try:
                img = Image.open(img_path)
            except FileNotFoundError:
                img_path = '/'.join([imgs_dir, label, ''.join(name_split[:-2]) + '.' + name_split[-2].upper()])
                img = Image.open(img_path)

            output_img_path = '/'.join([output_dir, 'images', set_type])
            shutil.copy(img_path, output_img_path)

            width, height = img.size
            txt = open('/'.join([txts_dir, label, filename]), 'r')
            txt.readline()  # ignore first line
            line = txt.readline()

            while line != '':
                datas = line.strip().split()
                class_idx = labels.index(datas[0])
                x0, y0, w0, h0 = int(datas[1]), int(datas[2]), int(datas[3]), int(datas[4])
                if version == 5:
                    x = (x0 + w0/2) / width
                    y = (y0 + h0/2) / height
                elif version == 3:
                    x = x0 / width
                    y = y0 / height
                else:
                    print("Version of YOLO error.")
                    return
                w = w0 / width
                h = h0 / height

                yolo_output_file.write(' '.join([str(class_idx),
                                                 format(x, '.6f'),
                                                 format(y, '.6f'),
                                                 format(w, '.6f'),
                                                 format(h, '.6f'),
                                                 ]) + '\n')
                line = txt.readline()

            yolo_output_file.close()

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('anndir', type=str, default='C:/MEC/Desktop/ExDark Dataset/ExDark Dataset/Annotations', help="ExDark annotations directory.")         #ExDark的标注目录
    parser.add_argument('imgdir', type=str, default='C:/Users/MEC/Desktop/ExDark Dataset/ExDark Dataset/images', help="ExDark images directory.")                   #ExDark的图像目录
    parser.add_argument('--ratio', type=str, default='8:1:1', help="Ratio between train/test/val, default 8:1:1.")     #train/test/val之间的比例,默认为8:1:1
    parser.add_argument('--version', type=int, choices=[3, 5], default=3, help="Version of YOLO(3 or 5), default 3.")#YOLO版本(3或5)
    parser.add_argument('--output-dir', type=str, default="output", help="Images and converted YOLO annotations output directory.")#图像和转换后的yolo标注的输出目录
    args = parser.parse_args()
    ExDark2Yolo(args.anndir, args.imgdir, args.ratio, args.version, args.output_dir)

修改:
1:第82行,default=’ ’ , 两个’ 直接,放你的Annotations的路径,这里我建议放绝对路径
2:第83行,default=’ ’ , 两个’ 直接,放你的images的路径,这里我建议放绝对路径
3:第84行,default=‘8:1:1’,我这里是把train/test/val之间的比例,设置为8:1:1,可以根据自己喜好设置
4:第85行,是选择yolov3还是yolov5的,在default= * ,自己设置
5:输出文件夹,就是转换后的数据集放哪里,按照我们上面说的,这里都默认是在“output”文件夹里

**注:**我所给的代码中,12是必改,345看个人喜好

第三步:转换

上面的都设置好之后,还有最重要的一件事:
将pytharm的终端的位置拉到这个文件夹目录下:比如,我的是在
C:\Users\MEC\Desktop\ExDark Dataset\ExDark Dataset>
这个目录下,如图:
在这里插入图片描述
最后的最后,在这个环境终端下,运行:
(这行代码最后分配的比例是8:1:1,且是yolov3,且输出文件夹是output

python recipy.py Annotations images --ratio 8:1:1 --version 3 --output-dir output

运行状态:
在这里插入图片描述
完成了:
在这里插入图片描述

最终在文件夹中查看结果:

在这里插入图片描述

输出文件构成为:
在这里插入图片描述

结束了,谢谢大家
有任何问题请指正

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Dota数据集是一个用于物体检测和目标跟踪的数据集,其中包含大量的图像和目标的标注信息。而YOLO(You Only Look Once)是一种实时目标检测算法,其主要特点是快速且准确地定位和识别图像中的目标。 将Dota数据集的标签格式转化YOLO格式需要进行以下几个步骤: 1. 解析Dota数据集的标注文件:Dota数据集的标注文件一般采用文本文件的形式,其中包含了目标的类别、位置和边界框信息。首先需要读取这些标注文件并解析出目标的各项属性。 2. 转换目标位置:Dota数据集中的目标位置表示方式一般采用多边形的形式,而YOLO算法中需要将目标位置转换为矩形框的形式。这可以通过计算多边形的最小外接矩形来实现,从而得到目标的位置信息。 3. 标签映射:Dota数据集中的目标类别通常使用文字描述,而YOLO算法需要使用数值标签来表示。因此,需要为Dota数据集中的每个目标类别分配一个唯一的数值标签,并将标签进行映射。 4. 生成YOLO格式的标签文件:最后,根据YOLO算法要求的标签格式,将转换后的目标位置和数值标签信息保存到新的标签文件中。YOLO格式的标签文件通常包含了每个目标的位置、类别和置信度等信息。 在完成以上步骤后,就可以将Dota数据集的标签格式转化YOLO格式,以方便后续的目标检测和识别任务。这样可以利用YOLO算法的高效性和准确性来实现对Dota数据集的目标识别和跟踪。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值