【问题标题】:Using U-net in Python with 3-channel input images for image segmentation在 Python 中使用 U-net 和 3 通道输入图像进行图像分割
【发布时间】:2020-09-30 22:38:52
【问题描述】:

我使用unet 进行图像分割,使用herein 概述的代码。

我的输入图像是 256x256x3。而对应的分割掩码为256x256。

我已将输入的大小更改为 Unet:

def unet(pretrained_weights = None,input_size = (256,256,3)):

得到一个输出层为 256x256x1 的网络

conv2d_144 (Conv2D)             (None, 256, 256, 1)  2           conv2d_143[0][0]  

查看完整架构here

当我尝试使用 .fit_generator 运行时,出现以下错误:

ValueError: Error when checking target: expected conv2d_144 to have shape (256, 256, 1) but got array with shape (256, 256, 3)

我能做些什么来解决这个问题?请让我知道我可以提供哪些额外信息!

谢谢!

PS:我的输出中有三个类,这可能是原因吗?

【问题讨论】:

  • 您能否将您传递的内容作为输入和预期输出加入模型?
  • 我认为问题出在您的真实图像上,因为您的模型似乎输出的是 1 波段图像;您应该检查预期的标签图像是否是 3 波段图像,一些包读取具有 3 波段的灰度图像,即使它们可能是 1 波段。
  • @R0bots 将最后一层的尺寸从 conv10 = Conv2D(1, 1, activation = 'sigmoid')(conv9) 更改为 conv10 = Conv2D(3, 1, activation = 'sigmoid')(conv9),这样你就有了 256x256x3 的输出

标签: python keras image-segmentation unity3d-unet


【解决方案1】:

您必须决定是否需要为图像输入 RGB 或灰度: 将图像转换为灰度或更改转换层。另一种选择是将 256x256x3 输入展平为一维并将其用作输入。

【讨论】:

  • 感谢您的回答。在我的情况下,保持 RGB 作为输入是至关重要的。我实际上已经修复了它,我认为通过一次性编码我的分割掩码并将最后一层的激活函数更改为 softmax,并使用过滤器大小来匹配类的数量!
【解决方案2】:

我实际上已经通过 one-hot 编码我的分割掩码并将最后一层的激活函数更改为 softmax 来修复它,并使用过滤器大小来匹配类的数量!

https://github.com/MKeel1ng/MULTI-CHANNEL-UNET

【讨论】:

    猜你喜欢
    • 2022-08-04
    • 2021-03-08
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多