我的图像分割结果图在白色补丁中包含黑色格子

Kev*_*vin 5 python image-segmentation deconvolution pytorch semantic-segmentation

在此处输入图片说明我正在使用 Pytorch 0.4.0 使用类似 UNet 的 CNN 架构进行图像分割。它在最终分割结果中将前景标记为 1,将背景标记为 0。我使用预训练的 VGG 的特征提取器作为我的编码器,所以我需要对编码器输出进行多次上采样。但结果显示了一个奇怪的格子部分,如下所示:

我怀疑这些不同形状的黑色部分是由反卷积层引起的。官方文档中说反卷积层在输入像素之间添加了(s-1)个零。反卷积层的超参数如下:

kernel_size=3,stride=2,padding=1,output_padding=1

(output_padding 用于拟合跳过连接特征的大小,例如,输入大小为 40*30,我希望它在一个反卷积层中放大两倍,根据我的计算公式:out=s(in-1) +k-2p,我必须使用 padding 1 和 output-padding 1 来保持大小,否则可能有其他更好的选择我不知道。)

我想知道产生黑色格子的原因。它们看起来像一个网格或方形部分。如何解决它。此外,我需要将所有deconv层超参数调整为一个统一的或分别修改它们?

环境:Ubuntu 16.04、Pytorch 0.4.0、GTX 1080Ti,上采样的架构是三层deconv层,层层递进。

更新

在我修改了 deconv 超参数之后,(受图像分割结果中的噪声启发使用

kernel_size=4,stride=2,padding=1

从而避免输出填充并满足大小。但是在 100 epoch 之后我遇到了类似的问题。

又经过30个epoch的训练,看起来是这样的,在此处输入图片说明

黑点刚刚散落,看起来这些黑点只是改变了它们的部分并跳入了另一个部分,我不知道为什么会出现。我不知道如何修改我的网络超参数。
self.conv1=Basic(1024,512,kernel_size=3,stride=1,padding=1)
        self.conv2=Basic(512,512,kernel_size=3,stride=1,padding=1)
        self.deconv1=Basic(512,256,kernel_size=4,stride=2,conv=False,padding=1)
        self.deconv2=Basic(256,128,kernel_size=4,stride=2,conv=False,padding=1)
        self.deconv3=Basic(128,64,kernel_size=4,stride=2,conv=False,padding=1)
        #output  480*640 segmap
        self.conv4=Basic(64,2,kernel_size=1,stride=1)
        # self.avgpool=nn.AvgPool2d(kernel_size=2,stride=2)

    def forward(self, input):
        input=self.conv1(input)
        input=self.conv2(input)
        input=self.deconv1(input)
        input=self.deconv2(input)
        input=self.deconv3(input)
        input=self.conv4(input)
        # print(input.shape)
        #a channel-wise probability map
        raw=input
        return raw`
Run Code Online (Sandbox Code Playgroud)