在没有填充的情况下实现 U-Net 分割模型

数据挖掘 喀拉斯 美国有线电视新闻网 图像分割
2022-02-27 03:16:12

我正在尝试按照此处发表的论文实施 U-Net CNN 。

我已经尽可能地遵循了论文架构,但是在尝试执行第一个连接时遇到了错误:

在此处输入图像描述

从图中可以看出,第 8 个 Conv2D 应该与第一个 UpSampling2D 操作的结果合并,但是该Concatenate()操作会引发形状不匹配的异常:

def model(image_size = (572, 572) + (1,)):

    # Input / Output layers
    input_layer = Input(shape=(image_size), 32)

    """ Begin Downsampling """

    # Block 1
    conv_1 = Conv2D(64, 3, activation = 'relu')(input_layer)
    conv_2 = Conv2D(64, 3, activation = 'relu')(conv_1)

    max_pool_1 = MaxPool2D(strides=2)(conv_2)

    # Block 2
    conv_3 = Conv2D(128, 3, activation = 'relu')(max_pool_1)
    conv_4 = Conv2D(128, 3, activation = 'relu')(conv_3)

    max_pool_2 = MaxPool2D(strides=2)(conv_4)

    # Block 3
    conv_5 = Conv2D(256, 3, activation = 'relu')(max_pool_2)
    conv_6 = Conv2D(256, 3, activation = 'relu')(conv_5)

    max_pool_3 = MaxPool2D(strides=2)(conv_6)

    # Block 4
    conv_7 = Conv2D(512, 3, activation = 'relu')(max_pool_3)
    conv_8 = Conv2D(512, 3, activation = 'relu')(conv_7)

    max_pool_4 = MaxPool2D(strides=2)(conv_8)

    """ Begin Upsampling """

    # Block 5
    conv_9 = Conv2D(1024, 3, activation = 'relu')(max_pool_4)
    conv_10 = Conv2D(1024, 3, activation = 'relu')(conv_9)

    upsample_1 = UpSampling2D()(conv_10)

    # Connect layers
    merge_1 = Concatenate()([conv_8, upsample_1])

错误:

Exception has occurred: ValueError
A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(32, 64, 64, 512), (32, 56, 56, 1024)]

请注意,这些值6456架构正确对齐。

在此处输入图像描述

我不明白如何实现论文中的模型。如果我更改我的代码以接受形状图像(256, 256)并添加padding='same'到 Conv2D 图层,则代码将在大小对齐时起作用。

这似乎违背了作者在其实施中具体陈述的内容:

在此处输入图像描述

有人可以为我指出正确实施该模型的正确方向吗?

1个回答

在此处输入图像描述

如果我们遵循每个箭头的定义。

灰色 => 复制和 裁剪

扩展路径中的每一步都包括对特征图进行上采样,然后是将特征通道数量减半的 2x2 卷积(“上卷积”),与收缩路径中相应裁剪的特征图的连接,以及两个 3x3卷积,每个后跟一个 ReLU。由于在每个卷积中都会丢失边界像素,因此裁剪是必要的。

所以,相信(我添加了 3 个彩色圆圈

  • 蓝色- 28x28 上采样成为 56x56,1024 减半为 512
  • 红色- 64x64 被裁剪为 56x56。然后沿 FM 轴连接。
  • 黑色- 3x3 卷积,然后是 ReLU