This repository was archived by the owner on Sep 18, 2024. It is now read-only.
This repository was archived by the owner on Sep 18, 2024. It is now read-only.
ImageDataGenerator resizing and transforming images before preprocessing #95
Open
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.