как сортировать случайно изображения и их маски? - PullRequest
1 голос
/ 06 марта 2019

перед разделением набора данных мне нужно случайным образом загрузить данные и затем выполнить разделение.Это фрагмент для разделения набора данных, который не является случайным.Мне интересно, как я могу сделать это для изображений и соответствующей маски в folder_mask?

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,
                 }

Ответы [ 3 ]

1 голос
/ 06 марта 2019

Насколько я понял, вы хотите рандомизировать порядок изображений, чтобы при каждом повторном запуске были разные фотографии в поезде и тестовом наборе.Предполагая, что вы хотите сделать это в более или менее простом Python, вы можете сделать следующее:

Самый простой способ использовать перемешивание списка элементов в Python:

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)

Теперь у вас есть список индексов, которые вы можете разделить, а затем использовать индексы из разделенного списка для доступа к другимlists.

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.Так что вы можете рассмотреть возможность их использования.Они спасут тебя от большой работы.(Обычно лучше повторно использовать код, чем реализовывать его самостоятельно.)

0 голосов
/ 06 марта 2019

Если я правильно понял, для каждого образца есть одна маска, верно? Используйте панд, чтобы соединить данные и маску, а затем разделить их случайным образом с помощью функции справки:

import glob
import pandas as pd
import numpy as np

def train_validate_test_split(df, train_percent=.6, validate_percent=.2, seed=None):
    np.random.seed(seed)
    perm = np.random.permutation(df.index)
    m = len(df.index)
    train_end = int(train_percent * m)
    validate_end = int(validate_percent * m) + train_end
    train = df.ix[perm[:train_end]]
    validate = df.ix[perm[train_end:validate_end]]
    test = df.ix[perm[validate_end:]]
    return train, validate, test

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")

data_mask = pd.DataFrame({"data": folder_data, "mask": folder_mask})

train, validate, test = train_validate_test_split(data_mask)

Кредиты вспомогательной функции от ответа @piRSquared в на этот вопрос

0 голосов
/ 06 марта 2019

Попробуйте использовать sklearn.model_selection.train_test_split.

from sklearn.model_selection import train_test_split 

train_image_paths, test_image_paths, train_mask_paths, test_mask_paths 
  = train_test_split(folder_data, folder_mask, test_size=0.2)

Это разделит ваши данные и метки на соответствующие наборы поездов и тестов.Если вам нужен проверочный набор, вы можете использовать его дважды - то есть сначала разделить на поезд / тест, а затем снова на обучающем подмножестве, чтобы разделить его на поезд / значение.

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

...