如何将多输入图像应用于Unet进行分割?

时间:2018-02-15 05:21:52

标签: tensorflow keras image-segmentation unet

我是机器学习的新手。 实际上,我使用我的unet代码进行图像分割,使用一个输入图像切片(192x912)和一个输出掩模图像(192x192)

我的Unet代码包含几个CNN层,我通常使用一个输入图像(192x912)和一个相应的掩码二进制图像进行训练。 与上述说明相关的代码如下。

def get_unet():
    inputs = Input((img_rows, img_cols, 1))
    conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
    conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
    drop1 = Dropout(0.2)(pool1)

    conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(drop1)
    conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2)
    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
    drop2 = Dropout(0.2)(pool2)
    '''''''
    return model

model.fit(imgs_train, imgs_mask_train, batch_size=32, epochs=100, verbose=2, shuffle=True, validation_split=0.1, callbacks=[model_checkpoint])

效果很好。但是,现在,我想在训练网络时使用多输入图像。所以,我添加了另一个列车数据并编辑我的代码,如下所示。

def get_unet():
        inputs = Input((img_rows, img_cols, 1))
        conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
        conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)
        pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
        drop1 = Dropout(0.2)(pool1)

        conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(drop1)
        conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2)
        pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
        drop2 = Dropout(0.2)(pool2)
        '''''''
        return model

    model.fit([imgs_train, imgs_other_train], imgs_mask_train, batch_size=32, epochs=100, verbose=2, shuffle=True, validation_split=0.1, callbacks=[model_checkpoint])

但是当我运行火车代码时,我收到如下错误消息。 " ValueError:检查模型输入时出错:您传递给模型的Numpy数组列表不是模型预期的大小。预计会看到1个数组,而是得到以下2个数组的列表:"

我认为我的U网需要更改为多输入,但我不知道我必须改变的地方。 请帮忙,给我任何评论。 感谢。

1 个答案:

答案 0 :(得分:0)

这实际上很容易。我相信您只需调整输入大小即可。

inputs = Input((img_rows, img_cols, size))本来可以。否则您可能会使用concat,例如:

inputs = []
for _ in range(num_inputs):
    inputs.append(Input((self.input_height, self.input_width, self.input_features)))
x = concatenate(inputs)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)

您可以检查我实施的类似here