首页 > 解决方案 > 如何随机排序图像及其掩码?

问题描述

在拆分数据集之前,我需要随机加载数据,然后进行拆分。这是用于拆分非随机数据集的片段。我想知道如何为文件夹掩码中的图像和相应掩码执行此操作?

folder_data = glob.glob("D:\\Neda\\Pytorch\\U-net\\my_data\\imagesResized\\*.png")
folder_mask = glob.glob("D:\\Neda\\Pytorch\\U-net\\my_data\\labelsResized\\*.png") 

 # split these path using a certain percentage
  len_data = len(folder_data)
  print("count of dataset: ", len_data)
  # count of dataset:  992


  split_1 = int(0.6 * len(folder_data))
  split_2 = int(0.8 * len(folder_data))

  #folder_data.sort()

  train_image_paths = folder_data[:split_1]
  print("count of train images is: ", len(train_image_paths)) 

  valid_image_paths = folder_data[split_1:split_2]
  print("count of validation image is: ", len(valid_image_paths))

  test_image_paths = folder_data[split_2:]
  print("count of test images is: ", len(test_image_paths)) 

   train_mask_paths = folder_mask[:split_1]
   valid_mask_paths = folder_mask[split_1:split_2]
   test_mask_paths = folder_mask[split_2:]

   train_dataset = CustomDataset(train_image_paths, train_mask_paths)
   train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=1, 
   shuffle=True, num_workers=2)

   valid_dataset = CustomDataset(valid_image_paths, valid_mask_paths)
   valid_loader = torch.utils.data.DataLoader(valid_dataset, batch_size=1, 
   shuffle=True, num_workers=2)

    test_dataset = CustomDataset(test_image_paths, test_mask_paths)
    test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=1, 
     shuffle=False, num_workers=2)  

     dataLoaders = {
          'train': train_loader,
          'valid': valid_loader,
           'test': test_loader,
                 }

标签: pythonsplitpytorchimage-segmentation

解决方案


据我了解,您希望随机化图片的顺序,以便每次重新运行时火车和测试集中都有不同的照片。假设您想在或多或少的普通 Python 中执行此操作,您可以执行以下操作。

在 python 中使用 shuffle 元素列表的最简单方法是:

import random
random.shuffle(list)  // shuffles in place

因此,您必须列出并希望仍然保持数据和掩码之间的链接。因此,如果您可以接受一个相当快速的破解,我会提出这样的建议。

import random

folder_data = glob.glob("D:\\Neda\\Pytorch\\U-net\\my_data\\imagesResized\\*.png")
folder_mask = glob.glob("D:\\Neda\\Pytorch\\U-net\\my_data\\labelsResized\\*.png") 

assert len(folder_data) == len(folder_mask) // everything else would be bad

indices = list(range(len(folder_data)))
random.shuffle(indices)

现在您有一个可以拆分的索引列表,然后使用拆分列表中的索引访问其他列表。

split_1 = int(0.6 * len(folder_data))
split_2 = int(0.8 * len(folder_data))

train_image_paths = [folder_data[i] for i in indices]
// and so on...

这将是普通的 Python 方式。但是在 sklearn 之类的包中有执行此操作的功能。所以你可以考虑使用这些。他们会让你免于做很多工作。(通常重用代码比自己实现要好得多。)


推荐阅读