如何使用 PyTorch 将可逆噪声添加到 MNIST 数据集?

问题描述 投票:0回答:1

我想向 MNIST 数据集添加可逆噪声以进行一些实验。

这是我正在尝试的自动提款机:

import torchvision.transforms as transforms
from torchvision.datasets import MNIST
from torch.utils.data import DataLoader
from PIL import Image
import torchvision

def display_img(pixels, label = None):
    plt.imshow(pixels, cmap="gray")
    if label:    
        plt.title("Label: %d" % label)
    plt.axis("off")
    plt.show()

class NoisyMNIST(torchvision.datasets.MNIST):
    def __init__(self, root, train=True, transform=None, target_transform=None, download=False):
        super(NoisyMNIST, self).__init__(root, train=train, transform=transform, target_transform=target_transform, download=download)

    def __getitem__(self, index):
        img, target = self.data[index], self.targets[index]
        img = Image.fromarray(img.numpy(), mode="L")

        if self.transform is not None:
            img = self.transform(img)
        
        # add the noise
        noise_level = 0.3
        noise = self.generate_safe_random_tensor(img) * noise_level
        noisy_img = img + noise
        
        return noisy_img, noise, img, target

    def generate_safe_random_tensor(self, img):
        """generates random noise for an image but limits the pixel values between -1 and 1""" 
       
        min_values = torch.clamp(-1 - img, max=0)
        max_values = torch.clamp(1 - img, min=0)
       
        return torch.rand(img.shape) * (max_values - min_values) + min_values



# Define transformations to apply to the data
transform = transforms.Compose([
    transforms.ToTensor(),  # Convert images to tensors
    transforms.Normalize((0.1307,), (0.3081,)),
])

train_dataset = NoisyMNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = NoisyMNIST(root='./data', train=False, download=True, transform=transform)

np_noise = train_dataset[img_id][1]
np_data = train_dataset[img_id][0]



display_img(np_data_sub_noise, 4)

理想情况下,这将为我提供常规 MNIST 数据集以及嘈杂的 MNIST 图像和添加的噪声集合。鉴于此,我假设我可以从噪声图像中减去噪声并返回到原始图像,但我的图像操作是不可逆的。

任何指针或代码片段将不胜感激。以下是我目前通过代码获得的图像:

原图:

添加噪音:

对于有噪声的图像减去噪声:

python pytorch computer-vision noise
1个回答
0
投票

不要存储您产生的噪音。

存储噪声,即干净主体和噪声主体之间的差异。 您可以安全地减去那些值。

当您将噪声应用于由整数组成的图片时,您将得到整数上溢/下溢/环绕(200 + 200 = 400,mod 256)或饱和度(200 + 200 = 255,剪裁)。这就是您所看到的差异的根源。

请记住,有损图像压缩是有损。由于您似乎关心精确的像素值,因此您应该只想使用无损压缩。

© www.soinside.com 2019 - 2024. All rights reserved.