Pytorch:重新缩放后 RGB 值范围为 0-1,如何归一化图像?

Pytorch: RGB value ranges 0-1 after rescaling, How do I normalize images?

我写了一个class来重新缩放图像,但是预处理后RGB值从0到1不等。直觉上应该在 0-255 范围内的 RGB 发生了什么?以下是重新缩放 class 和重新缩放后的 RGB 值。

问题:

我还需要最小-最大归一化,将 RGB 值映射到 0-1 吗?

我如何应用transforms.Normalization,我在哪里放置归一化,在重新缩放之前或之后,我如何计算均值和方差,使用范围从 0-255 或 0-1 的 RGB 值?

感谢您的宝贵时间!

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]]
  ...

您可以使用 torchvision 来完成此操作。

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

这需要 PIL 图像作为输入。它将 return [0, 1] 中的张量 range.You 也可能添加均值标准归一化,如下所示

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

这里meanstd是训练集中所有图像的所有像素的每通道均值和标准差。您需要在调整所有图像的大小并转换为 torch Tensor 后计算它们。一种方法是应用前两个变换(resizeToTensor),然后像这样

对所有训练图像计算 meanstd
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))

然后你将这个 meanstd 值与上面的 Normalize 变换一起使用。