ImageDataGenerator

ImageDataGenerator generate batches of tensor image data with real-time data augmentation.

https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator

Pour illustrer ImageDataGenerator, commençons avec le tutoriel TensorFlow Image classification. Ce tutoriel est associé à un notebook disponible sur GCP.

Ne sont présentées ici que les premières lignes de code, utiles à la compréhension de ImageDataGenerator.

import tensorflow as tf

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator

import os
import numpy as np
import matplotlib.pyplot as plt
_URL = 'https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip'

path_to_zip = tf.keras.utils.get_file('cats_and_dogs.zip', origin=_URL, extract=True)

PATH = os.path.join(os.path.dirname(path_to_zip), 'cats_and_dogs_filtered')

Une fois les données lues, elle sont stockées après un zip dans un dossier (avec des sous-dossiers).

cats_and_dogs_filtered
|__ train
    |______ cats: [cat.0.jpg, cat.1.jpg, cat.2.jpg ....]
    |______ dogs: [dog.0.jpg, dog.1.jpg, dog.2.jpg ...]
|__ validation
    |______ cats: [cat.2000.jpg, cat.2001.jpg, cat.2002.jpg ....]
    |______ dogs: [dog.2000.jpg, dog.2001.jpg, dog.2002.jpg ...]
train_dir = os.path.join(PATH, 'train')
validation_dir = os.path.join(PATH, 'validation')
train_cats_dir = os.path.join(train_dir, 'cats')  # directory with our training cat pictures
train_dogs_dir = os.path.join(train_dir, 'dogs')  # directory with our training dog pictures
validation_cats_dir = os.path.join(validation_dir, 'cats')  # directory with our validation cat pictures
validation_dogs_dir = os.path.join(validation_dir, 'dogs')  # directory with our validation dog pictures

On crée des ImageDataGenerators de la façon suivante :

train_image_generator = ImageDataGenerator(rescale=1./255) # Generator for our training data
validation_image_generator = ImageDataGenerator(rescale=1./255) # Generator for our validation data
batch_size = 128
epochs = 15
IMG_HEIGHT = 150
IMG_WIDTH = 150

ImageDataGenerator peut avoir de nombreux paramètres tels que rescale employé ici mais aussi rotation_range, brightness_range, fill_mode, horizontal_flip…

Une fois ImageDataGenerator créé, on peut l’instancier sur nos données.

train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size, directory=train_dir,shuffle=True, target_size=(IMG_HEIGHT, IMG_WIDTH), class_mode='binary')

Ici on applique la méthode flow_from_directory qui « Takes the path to a directory & generates batches of augmented data. »

On fait de même pour les données de validation.

val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size, directory=validation_dir,target_size=(IMG_HEIGHT, IMG_WIDTH),class_mode='binary')

Tout comme on a flow_from_directory, on a aussi flow_from_dataframe

Que fait exactement ImageDataGenerator ? On comprend bien qu’il y a une data augmentation, mais de quel type ? ImageDataGenerator applique à un batch d’images, des transformations choisies de façon aléatoire (en fonction de vos paramètres) et remplace le batch d’origine par ces nouvelles données qui vont servir à l’apprentissage. L’augmentation est faite durant l’apprentissage (on-the-fly).

On lira à ce sujet l’article Keras ImageDataGenerator and Data Augmentation de pyimagesearch.