This repository was archived by the owner on Sep 18, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 437
ImageDataGenerator resizing and transforming images before preprocessing #95
Copy link
Copy link
Open
Labels
imageRelated to imagesRelated to images
Description
I am trying to use the preprocessing function to take a network sized crop out of inconsistently sized input images instead of resizing to the network size. I have tried to do this using the preprocessing function but found that it is not easily possible. Using Keras 2.2.2
- ImageDataGenerator does not accept None as a type for target_size which should cause load_img to not resize things.
C:\ProgramData\Anaconda3\envs\tensorflow\lib\site-packages\keras_preprocessing\image.py in __init__(self, directory, image_data_generator, target_size, color_mode, classes, class_mode, batch_size, shuffle, seed, data_format, save_to_dir, save_prefix, save_format, follow_links, subset, interpolation)
1665 self.directory = directory
1666 self.image_data_generator = image_data_generator
-> 1667 self.target_size = tuple(target_size)
1668 if color_mode not in {'rgb', 'rgba', 'grayscale'}:
1669 raise ValueError('Invalid color mode:', color_mode,
TypeError: 'NoneType' object is not iterable
- To accomplish my goal, I modified the image data generator to pass none to load_img and then to resize afterwards if the size doesn't match the target. This hack works for my scenario:
def _get_batches_of_transformed_samples(self, index_array):
batch_x = np.zeros(
(len(index_array),) + self.image_shape,
dtype=backend.floatx())
# build batch of image data
for i, j in enumerate(index_array):
fname = self.filenames[j]
img = load_img(os.path.join(self.directory, fname),
color_mode=self.color_mode,
target_size=None)
x = img_to_array(img, data_format=self.data_format)
# Pillow images should be closed after `load_img`,
# but not PIL images.
if hasattr(img, 'close'):
img.close()
params = self.image_data_generator.get_random_transform(x.shape)
x = self.image_data_generator.apply_transform(x, params)
x = self.image_data_generator.standardize(x)
width_height_tuple = (self.target_size[1], self.target_size[0])
if (x.shape[1],x.shape[0]) != width_height_tuple:
x=cv2.resize(x,width_height_tuple, interpolation=cv2.INTER_AREA)
batch_x[i] = x
While looking into this I saw that the preprocessing function runs at the start of standardize, which is after the random transforms are applied. To me this sounds like preprocssing is a bad name since it isn't actually happening first.
Metadata
Metadata
Assignees
Labels
imageRelated to imagesRelated to images