制作数据集,自己划分验证集

制作自己的voc数据集,训练的时候不是要划分训练集和验证集吗,我打算自己制作验证集,不要80%20%的自动划分,有同志知道怎么做吗,多谢!

我打算自己制作验证集,不要80%20%的自动划分:那你打算怎么制作,怎么划分呢?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    可以通过以下步骤手动划分验证集:

    1. 首先,将所有的图片和对应的标注文件放入一个文件夹(假定为 /data/images)中,并且按照相同的命名规则命名(例如图片名字为 0001.jpg,对应的标注文件名为 0001.xml)。

    2. 使用 Python 中的 os 模块读取文件夹中的所有文件列表:

    import os
    
    image_dir = "/data/images"
    files = os.listdir(image_dir)
    
    1. 将文件列表随机打乱,以保证训练集和验证集的分布相似:
    import random
    
    random.shuffle(files)
    
    1. 设置验证集占比,这里假定为 20%:
    val_ratio = 0.2
    
    1. 计算验证集大小和训练集大小:
    n_val = int(len(files) * val_ratio)
    n_train = len(files) - n_val
    
    1. 将前 n_val 个文件作为验证集,剩余部分作为训练集:
    val_files = files[:n_val]
    train_files = files[n_val:]
    
    1. 将训练集和验证集的图片和标注分别复制到新的文件夹中,并分别保存列表文件,以备后续使用:
    import shutil
    
    train_dir = "/data/train"
    val_dir = "/data/val"
    
    os.makedirs(train_dir, exist_ok=True)
    os.makedirs(val_dir, exist_ok=True)
    
    train_list_file = "/data/train_list.txt"
    val_list_file = "/data/val_list.txt"
    
    with open(train_list_file, "w") as f:
        for file in train_files:
            img_path = os.path.join(image_dir, file)
            anno_path = os.path.join(image_dir, file.replace(".jpg", ".xml"))
            shutil.copy(img_path, train_dir)
            shutil.copy(anno_path, train_dir)
            f.write(os.path.join(train_dir, file) + "\n")
    
    with open(val_list_file, "w") as f:
        for file in val_files:
            img_path = os.path.join(image_dir, file)
            anno_path = os.path.join(image_dir, file.replace(".jpg", ".xml"))
            shutil.copy(img_path, val_dir)
            shutil.copy(anno_path, val_dir)
            f.write(os.path.join(val_dir, file) + "\n")
    

    这样就成功手动划分了训练集和验证集,并且保存了他们的文件路径列表。在训练时,可以直接使用列表文件指定数据集。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^