【问题标题】:Splitting image based dataset for YOLOv3为 YOLOv3 分割基于图像的数据集
【发布时间】:2021-05-20 03:43:36
【问题描述】:

我有一个关于拆分 20k 图像及其标签的数据集的问题,数据集的格式为 YOLOv3,其中有一个图像文件和一个与图像同名的 .txt 文件,文本文件里面有标签。

我想将数据集拆分为训练/测试拆分,有没有办法随机选择图像及其标签 .txt 文件并使用 Python 将其存储在单独的文件夹中?

我希望能够随机拆分数据集。例如,选择 16k 文件和标签文件,并将它们单独存储在 train 文件夹中,剩余的 4k 应存储在 test 文件夹中。

这可以在文件资源管理器中手动完成,方法是选择前 16k 个文件并将它们移动到不同的文件夹,但拆分不会是随机的,因为我计划对同一个数据集一遍又一遍地执行此操作。

这是数据的样子 images and labels screenshot

【问题讨论】:

    标签: python dataset conv-neural-network yolo


    【解决方案1】:

    我建议你看看下面的 Python 内置模块

    用于在 Python 中操作文件和路径。这是我的 cmets 代码,可能会解决您的问题。很简单

    import glob
    import random
    import os
    import shutil
    
    # Get all paths to your images files and text files
    PATH = 'path/to/dataset/'
    img_paths = glob.glob(PATH+'*.jpg')
    txt_paths = glob.glob(PATH+'*.txt')
    
    # Calculate number of files for training, validation
    data_size = len(img_paths)
    r = 0.8
    train_size = int(data_size * 0.8)
    
    # Shuffle two list
    img_txt = list(zip(img_paths, txt_paths))
    random.seed(43)
    random.shuffle(img_txt)
    img_paths, txt_paths = zip(*img_txt)
    
    # Now split them
    train_img_paths = img_paths[:train_size]
    train_txt_paths = txt_paths[:train_size]
    
    valid_img_paths = img_paths[train_size:]
    valid_txt_paths = txt_paths[train_size:]
    
    # Move them to train, valid folders
    train_folder = PATH+'train/' 
    valid_folder = PATH+'valid/'
    os.mkdir(train_folder)
    os.mkdir(valid_folder)
    
    def move(paths, folder):
        for p in paths:
            shutil.move(p, folder)
    
    move(train_img_paths, train_folder)
    move(train_txt_paths, train_folder)
    move(valid_img_paths, valid_folder)
    move(valid_txt_paths, valid_folder)
    
    

    【讨论】:

    • 谢谢您,我尝试在包含图像和文本文件的文件夹上运行此代码,但我似乎遇到了错误,尝试搜索这个我无法修复它。错误是“ F:\Datasets\Splitting Datasets>python splits.py Traceback (最近一次调用最后一次): File "F:\Datasets\Splitting Datasets\splits.py", line 19, in random.shuffle( img_txt) 文件“F:\anaconda\envs\base1\lib\random.py”,第 359 行,随机播放 i in reversed(range(1, len(x))):TypeError:'zip' 类型的对象有没有 len() "
    • 对不起,伙计,我忘了把 zip 对象变成列表。我现在将重新编辑我的答案
    • 另一个修复方法是修复注释“#Now split them”下的变量名称,将所有四行的名称“image_pahts”更改为“image_paths”。我更改并运行了代码,它按预期工作。谢谢!
    • 谢谢。抱歉这些错别字。
    猜你喜欢
    • 1970-01-01
    • 2017-08-05
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 2014-01-16
    相关资源
    最近更新 更多