由于归一化的问题,会导致生成的图像颜色偏差严重,例如会导致生成的颜色偏红黑色、淡色、青色..
如果你生成的图像整体感官上没有问题,但是却在颜色上有很大偏差,那么很大可能就是你训练的时候归一化的程序不对
ImageFolder的实现方法和归一化、反归一化
正常来说,归一化是将图像的[0-255]归一化到[-1, 1]之间,最常用的ImageFolder()是将图像在getitem中归一化到[0, 1]之间,所以在后面的程序中通常会有:
images = images * 2 - 1
这样可以让图像归一化到[-1, 1]之间,需要注意的是,这种在推理过程中的(生成)应该反归一化,然后*255【因为ImageFolder的getitem方法应该是image/255】直接得到的[0,1]的像素。
gen_images_batch = (gen_images_batch + 1) / 2gen_images_batch[b_id].numpy().transpose([1, 2, 0])+1) * 127.5
自我实现的imageDatasets的归一化、反归一化
这个主要取决于你的dataset的getitem怎么写:
def __getitem__(self, idx):path = self.local_images[idx]with bf.BlobFile(path, "rb") as f:pil_image = Image.open(f)pil_image.load()pil_image = pil_image.convert("RGB")# pil_image.save('output_image.jpg', format='JPEG')if self.random_crop:arr = random_crop_arr(pil_image, self.resolution)else:arr = center_crop_arr(pil_image, self.resolution)if self.random_flip and random.random() < 0.5:arr = arr[:, ::-1]# 此处已经将值置为了[-1,1]arr = arr.astype(np.float32) / 127.5 - 1
如上,我们会将image直接通过/127.5-1的方式直接置为[-1,1],所以后面就不再需要 images = images * 2 - 1 ,如果你此时还用 images = images * 2 - 1,就会导致像素值无法归一化到[-1,1](导致归一化到[-1,3]),从而导致生成的图像颜色偏差严重,所以一定要注意归一化的方式,否则有了错误很难发现
【异常错误】不论在测试还是训练的时候都要归一化并反归一化,保存图像方法要合适_训练数据归一化了测试数据也要吗-CSDN博客