Pytorch: после масштабирования значения RGB варьируются от 0 до 1. Как мне нормализовать изображения?

Я написал класс для масштабирования изображений, но после предварительной обработки значение RGB стало меняться от 0 до 1. Что случилось с RGB, который интуитивно должен находиться в диапазоне от 0 до 255? Ниже приведены класс Rescale и значения RGB после масштабирования.

Вопрос:

Нужна ли мне все еще нормализация Min-Max, сопоставьте значение RGB с 0-1?

Как применить преобразования. Нормализация, где я могу поместить нормализацию, до или после изменения масштаба, как мне рассчитать среднее значение и дисперсию, используйте значение RGB в диапазоне от 0-255 или 0-1?

Спасибо за ваше время!

class Rescale(object):
    def __init__(self, output_size):
        assert isinstance(output_size, (int, tuple))
        self.output_size = output_size

    def __call__(self, sample):
        image, anno = sample['image'], sample['anno']

        # get orginal width and height of image
        h, w = image.shape[0:2]
        # if output_size is an integer

        if isinstance(self.output_size, int):
            if h > w:
                new_h, new_w = h * self.output_size / w, self.output_size
            else:
                new_h, new_w = self.output_size / h, w * self.output_size / h

        # if output size is a tuple (a, b)
        else:
            new_h, new_w = self.output_size
        new_h, new_w = int(new_h), int(new_w)

        image = transform.resize(image, (new_h, new_w))       
        return {'image': image, 'anno': anno}
[[[0.67264216 0.50980392 0.34503034]
  [0.67243905 0.51208121 0.34528431]
  [0.66719145 0.51817184 0.3459951 ]
  ...
  [0.23645098 0.2654311  0.3759458 ]
  [0.24476471 0.28003857 0.38963938]
  [0.24885877 0.28807445 0.40935877]]

 [[0.67465196 0.50994608 0.3452402 ]
  [0.68067157 0.52031373 0.3531848 ]
  [0.67603922 0.52732436 0.35839216]
  ...
  [0.23458333 0.25195098 0.36822142]
  [0.2461343  0.26886127 0.38314558]
  [0.2454384  0.27233056 0.39977664]]

 [[0.67707843 0.51237255 0.34766667]
  [0.68235294 0.5219951  0.35553024]
  [0.67772059 0.52747687 0.35659176]
  ...
  [0.24485294 0.24514568 0.36592999]
  [0.25407436 0.26205475 0.38063318]
  [0.2597007  0.27202914 0.40214216]]

 ...
[[[172 130  88]
  [172 130  88]
  [172 130  88]
  ...
  [ 63  74 102]
  [ 65  76 106]
  [ 67  77 112]]

 [[173 131  89]
  [173 131  89]
  [173 131  89]
  ...
  [ 65  74 103]
  [ 64  75 105]
  [ 63  73 108]]

 [[173 131  89]
  [174 132  90]
  [174 132  90]
  ...
  [ 63  72 101]
  [ 62  71 102]
  [ 61  69 105]]
  ...

person Wei Wong    schedule 23.04.2020    source источник


Ответы (1)


Для этого можно использовать torchvision.

transform = transforms.Compose([
    transforms.Resize(output_size),
    transforms.ToTensor(),
])

Для этого требуется изображение PIL в качестве входных данных. Он вернет тензор в диапазоне [0, 1]. Вы также можете добавить нормализацию среднего стандарта, как показано ниже.

transform = transforms.Compose([
    transforms.Resize(output_size),
    transforms.ToTensor(),
    transforms.Normalize(mean, std),
])

Здесь mean и std — среднее значение для каждого канала и стандартное отклонение всех пикселей всех изображений в тренировочном наборе. Вам нужно вычислить их после изменения размера всех изображений и преобразования в torch Tensor. Один из способов сделать это — применить первые два преобразования (resize и ToTensor), а затем вычислить mean и std для всех обучающих изображений, подобных этому.

x = torch.concatenate([train_data[i] for i in range(len(train_data))])
mean = torch.mean(x, dim=(0, 1))
std = torch.std(x, dim=(0, 1))

Затем вы используете это значение mean и std с преобразованием Normalize выше.

person xashru    schedule 24.04.2020
comment
Привет, большое спасибо. Как я должен рассчитать среднее и стандартное значение? Использовать изображение до изменения размера или после изменения размера? Если я вычисляю среднее значение и стандартное значение перед изменением размера, нормализация происходит после изменения размера, что не имеет никакого смысла, поскольку количество пикселей изменяется после изменения размера, кажется неправильным нормализовать вычисленное значение исходного изображения. Но если вы хотите использовать среднее значение и стандартное значение, рассчитанное после изменения размера, мне нужно написать функцию для расчета среднего значения и стандартного значения между изменением размера и нормализацией? - person Wei Wong; 25.04.2020
comment
Спасибо за ваше время. Если я хочу использовать модель для прогнозирования одного изображения, мне нужно снова выполнить нормализацию для одного изображения, верно? - person Wei Wong; 25.04.2020
comment
Да, используя те же значения, которые использовались во время обучения. - person xashru; 25.04.2020