Keras-SegNet使用ImageDataGenerator和fit或fit_generator

时间:2017-12-21 03:56:19

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

关于导入数据集的问题会让我发疯。

这是我的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”和“mask”的数据类型是什么:

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

    这部分来自Keras官方教程。(答:现在我知道它们都是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()”由我自己,我可以用它直接从我的目录结构中获取(批处理,随机)数据?

  5. 这是我的目录结构:

    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)
    

    非常感谢!

1 个答案:

答案 0 :(得分:2)

让我们来看看。

  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)的四维numpy数组。这些变量来自哪里?您必须在之前的步骤中从各自的图像文件中读取它们。
  3. 您希望遍历两个文件夹中的每一个,读取每个图像,将它们添加到列表中,并在完成后将此列表转换为numpy数组。确保图像和蒙版的排序方式相同,以便它们相互匹配。
  4. flow_from_directory是一个可以与IDG一起使用的功能,可以为您读取图像。非常便利。但是,如果您不需要featurewise_centerfeaturewise_std_normalizationzca_whitening,那么它只能让您解决这个问题,因为在这种情况下您需要已经可用的numpy数组为了执行IDG fit()功能。顺便说一下,这个拟合函数与开始训练模型的fit()函数无关。它只使用相同的命名约定。