自动编码器在收敛后产生重复的伪影

人工智能 卷积神经网络 自动编码器 图像处理
2021-11-06 12:06:54

作为实验,我尝试使用自动编码器对来自阿尔卑斯山的高度数据进行编码,但是经过几个小时的训练,解码后的图像非常像素化,如下图所示。这种重复模式大于最终的内核大小,所以我认为可以在某种程度上从图像中删除这些重复模式。

图像为 (1, 512, 512) 并被采样到 (16, 32, 32)。这是用 pytorch 完成的。这是代码的相关示例,其中显示了确切的层。

        self.encoder = nn.Sequential(
                # Input is (N, 1, 512, 512)
                nn.Conv2d(1, 16, 3, padding=1), # Shape (N, 16, 512, 512)
                nn.Tanh(),
                nn.MaxPool2d(2, stride=2), # Shape (N, 16, 256, 256)
                nn.Conv2d(16, 32, 3, padding=1), # Shape (N, 32, 256, 256)
                nn.Tanh(),
                nn.MaxPool2d(2, stride=2), # Shape (N, 32, 128, 128)
                nn.Conv2d(32, 32, 3, padding=1), # Shape (N, 32, 128, 128)
                nn.Tanh(),
                nn.MaxPool2d(2, stride=2), # Shape (N, 32, 64, 64)
                nn.Conv2d(32, 16, 3, padding=1), # Shape (N, 16, 64, 64)
                nn.Tanh(),
                nn.MaxPool2d(2, stride=2) # Shape (N, 16, 32, 32)
            )
        self.decoder = nn.Sequential(
                # Transpose convolution operator
                nn.ConvTranspose2d(16, 32, 4, stride=2, padding=1), # Shape (N, 32, 64, 64)
                nn.Tanh(),
                nn.ConvTranspose2d(32, 32, 4, stride=2, padding=1), # Shape (N, 32, 128, 128)
                nn.Tanh(),
                nn.ConvTranspose2d(32, 16, 4, stride=2, padding=1), # Shape (N, 32, 256 256)
                nn.Tanh(),
                nn.ConvTranspose2d(16, 1, 4, stride=2, padding=1), # Shape (N, 32, 512, 512)  
                nn.ReLU()
            )

相关图像:左侧原始,右侧自动编码器结果

相关图像:左侧原始,右侧自动编码器结果

那么上图中的这些像素化效果可以解决吗?

1个回答

也许您正在得到棋盘工件解释here,解决方案涉及更改内核和步幅大小以防止它们不可分割。除此之外,一个解决方案可能是应用高斯平滑来最小化伪影。

例如,在 OpenCV 中对图像使用高斯平滑会导致

import cv2
img = cv2.imread('s.png') # I took a screen shot to see how it would look
blur = cv2.blur(img,(8,8))
plt.imshow(blur)

在此处输入图像描述

使用大小为 (8,8) 的内核,工件消失了。我希望这可以帮助