Pytorch: значение RGB колеблется от 0 до 1 после изменения масштаба. Как нормализовать изображения? - PullRequest
0 голосов
/ 24 апреля 2020

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

Вопрос:

Нужна ли мне нормализация минимального значения, сопоставьте значение 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]]
  ...

1 Ответ

0 голосов
/ 24 апреля 2020

Вы можете использовать torchvision для выполнения sh этого.

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 выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...