Применить предварительную обработку к набору данных - PullRequest
1 голос
/ 09 июля 2019

Я пишу статью о сегментации изображения в pytorch. Мне необходимо выполнить некоторые шаги предварительной обработки, но, поскольку я пробую это в первый раз, я не могу включить их в традиционный конвейер. Ниже приведены этапы предварительной обработки -

1) N (w, h) = I (w, h) - G (w, h), (1) где N - нормализованное изображение, I - исходное изображение, а G - размытое изображение Гаусса с размером ядра 65 * 65, средним значением 0 и стандартным отклонением 10.

2) Нормализация среднего изображения и деление каждого пикселя на среднее стандартное отклонение.

Ниже приведен мой фрагмент кода для вышеуказанных шагов-

def gaussian_blur(img):
    image = cv2.GaussianBlur(image,(65,65),10)
    new_image = img - image
return image

def normalise(img):
    img_normalised = np.empty(img.shape)
    img_std = np.std(img)
    img_mean = np.mean(img)
    img_normalized = (img-img_mean)/imgs_std

    for i in range(img.shape[1]):
        img_normalized[i] = (img_normalized - 
         np.mean(img_normalized))/np.std(img_normalized)
return img_normalized

Я действительно не уверен, как добавить вышеуказанные функции в традиционный конвейер загрузчиков данных pytorch, например, сначала я должен загрузить набор данных, используя ImageFolder, а затем применить или сначала применить, а затем использовать метод ImageFolder.

1 Ответ

0 голосов
/ 22 июля 2019

Вот как я это сделал -

Решение первой части - сначала определить требуемую функцию, а затем вызвать преобразования с использованием общих преобразований следующим образом -

def gaussian_blur(img):
   image = np.array(img)
   image_blur = cv2.GaussianBlur(image,(65,65),10)
   new_image = image - image_blur
   im = Image.fromarray(new_image)
return im

Решение второй части состоит в том, чтобы просмотреть каждое изображение и вычислить среднее и стандартное отклонение, а затем, наконец, вызвать среднее значение и стандартное отклонение в преобразованиях .-

   train_mean = []
   train_std = []

   for i,image in enumerate(train_loader,0):
       numpy_image = image[0].numpy()
       batch_mean = np.mean(numpy_image, axis=(0, 2, 3))
       batch_std = np.std(numpy_image, axis=(0, 2, 3))

       train_mean.append(batch_mean)
       train_std.append(batch_std)

   train_mean = torch.tensor(np.mean(train_mean, axis=0))
   train_std = torch.tensor(np.mean(train_std, axis=0))

    print('Mean:', train_mean)
    print('Std Dev:', train_std)

Окончательный вызов преобразования выглядит следующим образом:

data_transforms = transforms.Compose([transforms.RandomCrop(512,512),
                                 transforms.Lambda(gaussian_blur),
                                 transforms.RandomRotation([+90,+180]),
                                 transforms.RandomRotation([+180,+270]),
                                 transforms.RandomHorizontalFlip(),
                                 transforms.ToTensor(),
                                 transforms.Normalize(mean=train_mean, std=train_std)
                               ])
...