【问题标题】:Keras-SegNet use ImageDataGenerator and fit or fit_generatorKeras-SegNet 使用 ImageDataGenerator 和 fit 或 fit_generator
【发布时间】:2018-06-03 16:53:46
【问题描述】:

导入数据集的问题快把我逼疯了。

这是我的 segnet 代码的一部分。

我将重点介绍有关图像和蒙版数据导入的问题。

print("CNN Model created.")

###training data
data_gen_args = dict()
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)
seed1 = 1
image_datagen.fit(images, augment=True, seed=seed1)
mask_datagen.fit(masks, augment=True, seed=seed1)

train_image_generator = image_datagen.flow_from_directory(TRAIN_im,target_size=(500, 500),batch_size=BATCH_SIZE, class_mode = None)
train_mask_generator = mask_datagen.flow_from_directory(TRAIN_mask,target_size=(500, 500),batch_size=BATCH_SIZE, class_mode = None)

train_generator = zip(train_image_generator,train_mask_generator)

###validation data
valid_gen_args = dict()
val_image_datagen = ImageDataGenerator(**valid_gen_args)
val_mask_datagen = ImageDataGenerator(**valid_gen_args)
seed2 = 5
val_image_datagen.fit(val_images, augment=True, seed=seed2)
val_mask_datagen.fit(val_masks, augment=True, seed=seed2)

val_image_generator = val_image_datagen.flow_from_directory(VAL_im,target_size=(500, 500),batch_size=BATCH_SIZE, class_mode = None)
val_mask_generator = val_mask_datagen.flow_from_directory(VAL_mask,target_size=(500, 500),batch_size=BATCH_SIZE, class_mode = None)

val_generator = zip(val_image_generator,val_mask_generator)

###
model.fit_generator(
train_generator,steps_per_epoch=nb_train_samples//BATCH_SIZE,epochs=EPOCHS,validation_data=val_generator,validation_steps=nb_validation_samples//BATCH_SIZE)

我的问题是:

  1. 我将输入大小更改为 500*500,因此我调整了池化和上采样层大小。这是可以实现的吗? 此外,我可以通过调整它们的池化和上采样层大小和过滤器数量来使经典网络(如 AlexNet、VGG、Segnet...)接受任意输入图像大小吗?

  2. 我想知道变量“images”和“masks”的数据类型是什么:

    image_datagen.fit(images, augment=True, seed=seed1)
    mask_datagen.fit(masks, augment=True, seed=seed1)
    

    这部分来自Keras官方教程。(Ans:现在我知道它们都是numpy数组。)

  3. 根据上面的问题。我怎样才能得到它们?

    我应该在下面写一个类似mnist.load_data()的函数吗?

    我需要一些例子。

        (x_train_image, y_train_label), (x_test_image, y_test_label) = mnist.load_data()
    
  4. 我使用函数

    flow_from_directory
    

    这是否意味着不需要定义类似的函数 “mnist.load_data()”,我可以用它直接从我的目录结构中获取(batch,shuffle)数据吗?

这是我的目录结构:

Dataset -training----------images----"many images"
           |         |
           |         |-----mask-----"ground truth images(mask)" 
           |
           |
       validation----------val_images----"many images"
           |        |
           |        |------val_mask------"ground truth images(mask)" 
           |
           |
        testing---------------test images (no ground truth)

非常感谢!

【问题讨论】:

  • 您确定 ImageDataGenerator 实际上可以用于处理分割问题吗?据我所知,它会从目录中随机读取图像,但当然您需要图像和蒙版之间的匹配对。
  • @pietz 我读了 Keras 官方教程:keras.io/preprocessing/image 您可以搜索关键字“将图像和蒙版一起转换的示例”。在页面中。我想它可以。我在github上看到了一些keras segnet的例子。
  • 对 ImageDataGenerator 没有太多经验,但查看文档时,fit 方法只需要计算图像标准化的样本统计信息。仅当您使用 featurewise_centerfeaturewise_std_normalizationzca_whitening 时才需要。你是?在这种情况下,图像和蒙版是用于计算统计数据的样本数据。
  • 是的,对于这 3 个选项,您的训练数据必须事先进行分析。它与模型的实际训练/拟合无关。
  • @filippo 我先对图像进行了预处理,所以我猜我不需要它们。我只想要它提供的“生成器”功能。由于github中的keras示例通常是自己定义生成器。我不太明白ImageDataGenerator能做什么......

标签: tensorflow deep-learning keras image-segmentation keras-layer


【解决方案1】:

让我们开始吧。

  1. SegNet 是一个 FCN(全卷积网络 --> 它不使用密集层),适用于您指定的任何输入/输出大小。让我建议对这些编码器-解码器架构使用 16 的倍数。为什么?因为在您的情况下,我们将从 500 到 250 到 125 到 62,而另一方面,从 62 到 124 到 248 到 496。突然之间,您的分辨率不再匹配。 AlexNet 和 VGG 使用密集层。这意味着您可以更改适合您需要的初始输入大小,但您将无法使用来自不同分辨率的预训练权重。参数的数量根本不匹配。旁注:VGG 和 AlexNet 是分类架构,而 SegNet 是分段架构。
  2. imagesmasks 是形状为 (num_imgs, width, height, num_channels) 的 4 维 numpy 数组。这些变量从何而来?您必须在之前的步骤中从它们各自的图像文件中读取它们。
  3. 您希望遍历这两个文件夹中的每一个,读取每个图像,将它们添加到列表中,完成后将此列表转换为 numpy 数组。确保图像和蒙版以相同的方式排序,以使它们相互匹配。
  4. flow_from_directory 是一个可以与 IDG 一起使用的功能,以便为您读取图像。非常便利。但是,如果您不需要 featurewise_centerfeaturewise_std_normalizationzca_whitening,它只会让您绕过这个问题,因为在这种情况下,您需要已经可用的 numpy 数组才能执行 IDG fit() 函数。顺便说一句,这个 fit 函数与启动模型训练的 fit() 函数无关。它只是使用相同的命名约定。

【讨论】:

  • 1.其实我把编码过程和解码过程中的pooling kernel size调整为两个2*2和两个5*5,但是我没有编译,这个办法可以实现吗?
  • 好的,这也可以。我想你会注意到 500x500 相当大,因此需要相当长的时间来训练。我建议您也尝试使用 224x224 管道,看看您是否真的需要该分辨率。
猜你喜欢
  • 2017-06-07
  • 2019-03-07
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 2019-10-01
相关资源
最近更新 更多