Python 我的图像分割结果图包含白色斑块中的黑色晶格

Python 我的图像分割结果图包含白色斑块中的黑色晶格,python,image-segmentation,pytorch,deconvolution,semantic-segmentation,Python,Image Segmentation,Pytorch,Deconvolution,Semantic Segmentation,我正在使用Pytorch 0.4.0的类似于UNet的CNN架构进行图像分割。在最终分割结果中,它将前景标记为1,背景标记为0。我使用预先训练过的VGG特征提取器作为编码器,因此我需要多次对编码器输出进行上采样。但结果显示结果中有一个奇怪的晶格部分,如下图所示: 我怀疑这些不同形状的黑色部分是由反褶积层造成的。据官方文件所述,反褶积层在输入像素之间添加(s-1)零。反褶积层的超参数如下所示: 内核大小=3,步幅=2,填充=1,输出填充=1 (输出_填充用于适应跳过连接特征大小,例如,输入大小为

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

我怀疑这些不同形状的黑色部分是由反褶积层造成的。据官方文件所述,反褶积层在输入像素之间添加(s-1)零。反褶积层的超参数如下所示: 内核大小=3,步幅=2,填充=1,输出填充=1 (输出_填充用于适应跳过连接特征大小,例如,输入大小为40*30时,我希望在一个反褶积层中将其大小放大两倍,根据我的计算公式:out=s(in-1)+k-2p,我必须使用填充1和输出填充1来保持大小,否则可能还有其他更好的选择我不知道。) 我想知道产生黑色晶格的原因。它们看起来像一个网格或正方形。以及如何解决它。此外,我需要将所有deconv layer hyperparamater调整为一个统一的或单独修改它们

环境:Ubuntu 16.04、Pytorch 0.4.0、GTX 1080Ti、, 上采样的体系结构是三个deconv层,它们是一个接一个的

更新 在我修改了deconv hyperparameter之后,(灵感来自于使用

内核大小=4,步幅=2,填充=1 这样可以避免输出填充并满足大小。但在100个历元之后,我遇到了类似的问题

再经过30年的历练,似乎是这样,

黑点只是分散的,看起来这些黑点只是改变了它们的部分,然后跳入另一部分,我不知道为什么会发生这种情况。我不知道如何修改我的网络超参数。
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`

在网络的最后一层之后,您是否应用了任何操作?我们可以看到一些代码吗?是的,thx为您提供帮助!我不知道如何在注释中添加pic,因此我在问题描述的底部附加了解码器代码。基本块是conv+BATCHTNORM+Relu运算符。我从VGG第3层输出进行了上采样,因此我需要三个DECOV操作来恢复输入大小。StackOverflow编辑器中有一个选项,可以将代码添加为文本,这将使其更具可读性。如果在末尾添加
input=F.sigmoid(输入),会怎么样
。这样,我们将像素限制在0-1范围内。然后,由于要进行二进制分割,请添加
input=input>0.5
。这样,我们将值大于0.5的像素设置为1,小于0.5的像素设置为0。如果
F
失败,请执行
import torch.nn。功能与F
相同之后的e输出:)是的,我将使用softmax和argmax将通道数字转换为概率。然后使用argmax操作获得输出。我认为这些操作没有错。但我认为导致这些部分的deconv或net架构。最好更新帖子:)