keras-team/keras-preprocessing

ImageDatagenerator Issue with Transforming Images and Masks Together.

Vaevin opened this issue · 0 comments

  • [x ] Check that you are up-to-date with the master branch of keras-preprocessing. You can update with:
    pip install git+git://github.com/keras-team/keras-preprocessing.git --upgrade --no-deps

  • Provide a link to a GitHub Gist of a Python script that can reproduce your issue (or just copy the script here if it is short).

https://gist.github.com/joshleiph/c4fac7f1f6e51c3739c41d2408395d70

I am having issues with the ImageDataGenerator and transforming images and masks together. I am attempting to do semantic segmentation, and I have a folder of ultrasound images and their corresponding masks for annotation. I created my ImageDataGenerator for both the images and masks using the example given in the keras documentation:

from keras.preprocessing.image import ImageDataGenerator

image_size = 128
epochs = 5
batch_size = 4

seed = 1

image_datagen = ImageDataGenerator(rescale=1./255) #Rescale all images by 1/255
mask_datagen = ImageDataGenerator(rescale=1./255)

image_datagen.fit(frame_images, augment=True, seed=seed)
mask_datagen.fit(mask_images, augment=True, seed=seed)

train_image_generator = image_datagen.flow_from_directory(
os.path.dirname(train_frames_fol), #Our target directory
target_size = (image_size,image_size),
batch_size = batch_size,
class_mode='binary',
seed =seed)

train_mask_generator = mask_datagen.flow_from_directory(
os.path.dirname(train_mask_fol),
target_size = (image_size,image_size),
batch_size = batch_size,
class_mode='binary',
seed =seed)

val_image_generator = image_datagen.flow_from_directory(
os.path.dirname(val_frames_fol),
target_size = (image_size,image_size),
batch_size = batch_size,
class_mode='binary',
seed =seed)

val_mask_generator = mask_datagen.flow_from_directory(
os.path.dirname(val_mask_fol),
target_size = (image_size,image_size),
batch_size = batch_size,
class_mode='binary',
seed =seed)

train_generator = (pair for pair in zip(train_image_generator, train_mask_generator))
val_generator = (pair for pair in zip(val_image_generator, val_mask_generator))

The final output of this are my two generators, train_generator and val_generator. I then create my model (in this case I am using a U-Net model) and finally go to perform the training step. Code below is where the error is occurring:

#%% -------------------- Training the model ------------------------------------
NO_OF_TRAINING_IMAGES = len(os.listdir(train_frames_fol))
NO_OF_VAL_IMAGES = len(os.listdir(val_frames_fol))

train_steps = (NO_OF_TRAINING_IMAGES//batch_size)
valid_steps = (NO_OF_VAL_IMAGES//batch_size)
#%%
model.fit_generator(train_generator,
validation_data=val_generator,
steps_per_epoch=train_steps,
validation_steps=valid_steps,
epochs=epochs)

After running this, I get the error:
Error when checking model target: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 array(s), but instead got the following list of 2 arrays:

I am not sure what is going on here. I can add more code here to help clarify.