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

标签 tensorflow keras image-segmentation semantic-segmentation unet-neural-network

我是机器学习的新手。 实际上,我使用我的 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网需要改成多输入,但是不知道改哪里。 请帮助并给我任何意见。 谢谢。

最佳答案

这其实很简单。我相信您需要做的就是调整输入大小。

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

关于tensorflow - 如何将多输入图像应用于Unet进行分割?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48800402/

相关文章:

python-3.x - 如何匹配 cv2.imread 到 keras image.img_load 输出

python - 使用 TensorFlow 进行图像分割

c++ - OpenCV 在轮廓中获取点

python - 将鼠标事件函数与 tensorflow 一起用于对象检测时列出索引超出范围错误

hadoop - 通过MapReduce生成tfrecord时出错

python - Keras-vis 给出以下错误 : AttributeError: Multiple inbound nodes

python - 将展平层与输入层连接

python - 如何在 TensorFlow 2 中写入 TensorBoard

python - 如何防止keras重命名图层

tensorflow - 使用 Keras 使用预训练的 Resnet34 编码器构建 Unet