Main Content

augmentedImageDatastore

Transformer des batchs de données pour augmenter les images

Description

Un datastore d'images augmentées (Augmented Image Datastore) transforme des batchs de données d’apprentissage, de validation, de test et de prédiction avec un prétraitement facultatif tel que le redimensionnement, la rotation et la réflexion. Redimensionnez les images pour qu’elles soient compatibles avec la taille en entrée de votre réseau de Deep Learning. Augmentez les images d’apprentissage avec des opérations de prétraitement randomisées pour éviter un surajustement du réseau et la mémorisation des détails exacts des images d’apprentissage.

Pour entraîner un réseau avec des images augmentées, utilisez augmentedImageDatastore avec la fonction trainnet. Pour plus d’informations, veuillez consulter Preprocess Images for Deep Learning.

  • Lors de l’utilisation d’un datastore d'images augmentées comme source d’images d’apprentissage, le datastore introduit des perturbations en modifiant les données d’apprentissage de manière aléatoire à chaque epoch. Ainsi, chaque epoch utilise un jeu de données légèrement différent. Le nombre d’images d’apprentissage par epoch ne change pas. Les images transformées ne sont pas stockées en mémoire.

  • Une couche imageInputLayer normalise les images selon la moyenne des images augmentées et non la moyenne du jeu de données d’origine. Cette moyenne est calculée une seule fois pour le premier epoch augmenté. Tous les autres epochs utilisent cette même moyenne pour que l’image moyenne ne change pas en cours d’apprentissage.

  • Utilisez un datastore d'images augmentées pour prétraiter efficacement les images pour le Deep Learning, y compris en les redimensionnant. N’utilisez pas l’option ReadFcn des objets ImageDatastore. ImageDatastore permet de lire les fichiers d’images JPG ou PNG en batch au moyen de la prélecture. Si vous définissez l’option ReadFcn pour une fonction personnalisée, ImageDatastore n’effectue pas de prélecture et est généralement beaucoup plus lent.

Par défaut, augmentedImageDatastore redimensionne uniquement les images pour les adapter à la taille en sortie. Vous pouvez configurer des options de transformation d’image supplémentaires avec imageDataAugmenter.

Création

Description

auimds = augmentedImageDatastore(outputSize,imds) crée un datastore d'images augmentées pour les problèmes de classification avec les images du datastore d’images imds et définit la propriété OutputSize.

auimds = augmentedImageDatastore(outputSize,X,Y) crée un datastore d'images augmentées pour les problèmes de classification et de régression. Le tableau X contient les variables prédictives. Le tableau Y contient les étiquettes de catégorie ou les réponses numériques.

auimds = augmentedImageDatastore(outputSize,X) crée un datastore d'images augmentées pour la prédiction des réponses des images du tableau X.

auimds = augmentedImageDatastore(outputSize,tbl) crée un datastore d'images augmentées pour les problèmes de classification et de régression. La table tbl contient les prédicteurs et les réponses.

auimds = augmentedImageDatastore(outputSize,tbl,responseNames) crée un datastore d'images augmentées pour les problèmes de classification et de régression. La table tbl contient les prédicteurs et les réponses. L’argument responseNames spécifie les variables de réponse de tbl.

exemple

auimds = augmentedImageDatastore(___,Name,Value) crée un datastore d'images augmentées avec des paires nom-valeur pour définir les propriétés ColorPreprocessing, DataAugmentation, OutputSizeMode et DispatchInBackground. Vous pouvez spécifier plusieurs paires nom-valeur. Mettez chaque nom de propriété entre guillemets.

Par exemple, augmentedImageDatastore([28,28],myTable,'OutputSizeMode','centercrop') crée un datastore d'images augmentées qui recadre les images au centre.

Arguments en entrée

développer tout

Datastore d’images, défini par un objet ImageDatastore.

Images, définies par un tableau numérique 4D. Les trois premières dimensions sont la hauteur, la largeur et les canaux. La dernière dimension indexe individuellement les images.

Types de données : single | double | uint8 | int8 | uint16 | int16 | uint32 | int32

Réponses pour la classification ou la régression, définies par l’un des éléments suivants :

  • Pour un problème de classification, Y est un vecteur catégoriel contenant les étiquettes des images.

  • Pour un problème de régression, Y peut être :

    • Une matrice numérique n x r, où n est le nombre d’observations et r est le nombre de réponses.

    • Un tableau numérique h x w x c x n, où h x w x c est la taille d’une seule réponse et n est le nombre d’observations.

Les réponses ne doivent contenir aucune valeur NaN.

Types de données : categorical | double

Données en entrée, définies par une table. La première colonne de tbl doit contenir les prédicteurs sous forme de chemins absolus ou relatifs vers des images ou bien des images. Le type et l’emplacement des réponses dépendent du problème :

  • Pour un problème de classification, la réponse doit être une variable catégorielle contenant les étiquettes des images. Si vous ne spécifiez pas le nom de la variable de réponse dans l’appel de augmentedImageDatastore, les réponses doivent figurer dans la deuxième colonne. Si les réponses se trouvent dans une autre colonne de tbl, vous devez spécifier le nom de la variable de réponse avec l’argument responseNames.

  • Pour un problème de régression, les réponses doivent être des valeurs numériques indiquées dans la ou les colonnes qui suivent la première colonne. Les réponses peuvent figurer dans plusieurs colonnes sous forme de scalaires ou dans une seule colonne sous forme de vecteurs numériques ou de cell arrays contenant des tableaux 3D numériques. Lorsque vous ne spécifiez pas le nom de la ou des variables de réponse, augmentedImageDatastore accepte les autres colonnes de tbl comme variables de réponse. Vous pouvez spécifier les noms des variables de réponse avec l’argument responseNames.

Les réponses ne doivent contenir aucune valeur NaN. Si des valeurs NaN sont présentes dans les données de prédicteurs, elles sont propagées dans l’apprentissage, cependant, dans la plupart des cas, l'apprentissage échoue à converger.

Types de données : table

Noms des variables de réponse de la table en entrée, définis par l’un des éléments suivants :

  • Pour les tâches de classification ou de régression à réponse unique, responseNames doit être un vecteur de caractères ou un string scalar contenant la variable de réponse de la table en entrée.

    Pour les tâches de régression à réponses multiples, responseNames doit être un tableau de chaînes de caractères ou un cell array de vecteurs de caractères contenant les variables de réponse de la table en entrée.

Types de données : char | cell | string

Propriétés

développer tout

Opérations de prétraitement des couleurs appliquées aux images en niveaux de gris ou RGB en entrée, définies par 'none', 'gray2rgb' ou 'rgb2gray'. Lorsque le datastore d’images contient un mélange d’images en niveaux de gris et RGB, utilisez ColorPreprocessing pour vous assurer que toutes les images en sortie possèdent le nombre de canaux requis par imageInputLayer.

Aucune opération de prétraitement des couleurs n’est effectuée lorsqu’une image en entrée a déjà le nombre de canaux de couleur requis. Par exemple, si vous spécifiez la valeur 'gray2rgb' et qu’une image en entrée a déjà trois canaux, aucun prétraitement des couleurs n’a lieu.

Remarque

L’objet augmentedImageDatastore convertit les images RGB en niveaux de gris avec la fonction rgb2gray. Si une image a trois canaux qui ne correspondent pas à rouge, vert et bleu (par exemple une image dans l’espace de couleur L*a*b*), l’utilisation de ColorPreprocessing peut donner de mauvais résultats.

Aucune opération de prétraitement des couleurs n’est effectuée lorsque les images en entrée ne possèdent pas 1 ou 3 canaux, par exemple les images multispectrales ou hyperspectrales. Dans ce cas, toutes les images en entrée doivent avoir le même nombre de canaux.

Types de données : char | string

Prétraitement appliqué aux images en entrée, défini par un objet imageDataAugmenter ou 'none'. Lorsque DataAugmentation est défini par 'none', aucun prétraitement n’est appliqué aux images en entrée.

Répartition des observations en arrière-plan pendant l’apprentissage, la prédiction ou la classification, définie par false ou true. Pour utiliser la répartition en arrière-plan, vous devez avoir installé Parallel Computing Toolbox™.

Les datastores d'images augmentées n’effectuent la répartition en arrière-plan que si vous les utilisez avec la fonction trainnet et les fonctions d’inférence comme predict et minibatchpredict. La répartition en arrière-plan n’a pas lieu lorsque vous appelez directement la fonction read du datastore.

Nombre d’observations renvoyées dans chaque batch. Vous ne pouvez modifier la valeur de MiniBatchSize qu’après avoir créé le datastore. Pour l’apprentissage, la prédiction et la classification, la propriété MiniBatchSize est définie à la taille de mini-batch spécifiée dans trainingOptions.

Ce propriété est en lecture seule.

Nombre total d’observations dans le datastore d'images augmentées. Le nombre d’observations correspond à la durée d’un epoch d’apprentissage.

Taille des images en sortie, définie par un vecteur de deux entiers positifs. Le premier élément spécifie le nombre de lignes dans les images en sortie. Le deuxième élément spécifie le nombre de colonnes.

Remarque

Si vous créez un augmentedImageDatastore en spécifiant la taille des images en sortie comme un vecteur de trois éléments, le datastore ignore le troisième élément. À la place, il utilise la valeur de ColorPreprocessing pour déterminer la dimensionnalité des images en sortie. Par exemple, si vous définissez OutputSize à [28 28 1] mais ColorPreprocessing à 'gray2rgb', les images en sortie ont une taille de 28 x 28 x 3.

Méthode de redimensionnement des images en sortie, définie l’un des éléments suivants.

  • 'resize' — Mettre l’image à l’échelle par interpolation bilinéaire pour l’adapter à la taille en sortie.

    Remarque

    augmentedImageDatastore utilise la méthode d’interpolation bilinéaire de imresize avec anticrénelage (antialiasing). L’interpolation bilinéaire assure un traitement rapide des images tout en évitant les distorsions telles que celles causées par l’interpolation au plus proche voisin. De son côté, imresize utilise par défaut l’interpolation bicubique avec anticrénelage pour produire une image redimensionnée de haute qualité mais avec un temps de traitement plus long.

  • 'centercrop' — Recadrer l’image d’apprentissage au centre. La taille de l’image recadrée correspond à la taille en sortie.

  • 'randcrop' — Recadrer l’image d’apprentissage de manière aléatoire. La taille de l’image recadrée de manière aléatoire correspond à la taille en sortie.

Types de données : char | string

Fonctions d'objet

combineCombine data from multiple datastores
hasdataDetermine if data is available to read
numpartitionsNumber of datastore partitions
partitionPartition a datastore
partitionByIndexPartition augmentedImageDatastore according to indices
previewPreview subset of data in datastore
readRead data from augmentedImageDatastore
readallRead all data in datastore
readByIndexRead data specified by index from augmentedImageDatastore
resetReset datastore to initial state
shuffleShuffle data in augmentedImageDatastore
subsetCreate subset of datastore or FileSet
transformTransform datastore
isPartitionableDetermine whether datastore is partitionable
isShuffleableDetermine whether datastore is shuffleable

Exemples

réduire tout

Entraînez un réseau de neurones à convolution avec des images augmentées. L’augmentation des données contribue à éviter un surajustement (overfitting) du réseau et la mémorisation des détails exacts des images d’apprentissage.

Chargez les exemples de données correspondant à des images synthétiques de chiffres écrits à la main. XTrain est un tableau 28 x 28 x 1 x 5 000, où :

  • 28 est la hauteur et la largeur des images.

  • 1 est le nombre de canaux.

  • 5 000 est le nombre d’images synthétiques de chiffres écrits à la main.

labelsTrain est un vecteur catégoriel contenant les étiquettes pour chaque observation.

load DigitsDataTrain

Réservez 1 000 images pour la validation du réseau.

idx = randperm(size(XTrain,4),1000);
XValidation = XTrain(:,:,:,idx);
XTrain(:,:,:,idx) = [];
TValidation = labelsTrain(idx);
labelsTrain(idx) = [];

Créez un objet imageDataAugmenter spécifiant les options de prétraitement pour l’augmentation des images, par exemple le redimensionnement, la rotation, la translation et la réflexion. Effectuez une translation aléatoire des images d’un maximum de trois pixels horizontalement et verticalement. Appliquez-leur également une rotation de 20 degrés maximum.

imageAugmenter = imageDataAugmenter( ...
    'RandRotation',[-20,20], ...
    'RandXTranslation',[-3 3], ...
    'RandYTranslation',[-3 3])
imageAugmenter = 
  imageDataAugmenter with properties:

           FillValue: 0
     RandXReflection: 0
     RandYReflection: 0
        RandRotation: [-20 20]
           RandScale: [1 1]
          RandXScale: [1 1]
          RandYScale: [1 1]
          RandXShear: [0 0]
          RandYShear: [0 0]
    RandXTranslation: [-3 3]
    RandYTranslation: [-3 3]

Créez un objet augmentedImageDatastore à utiliser pour l’apprentissage du réseau et spécifiez la taille des images en sortie. Pendant l’apprentissage, le datastore augmente et redimensionne les images. Il les augmente sans les enregistrer en mémoire. trainnet met à jour les paramètres du réseau puis supprime les images augmentées.

imageSize = [28 28 1];
augimds = augmentedImageDatastore(imageSize,XTrain,labelsTrain,'DataAugmentation',imageAugmenter);

Spécifiez l’architecture du réseau de neurones à convolution.

layers = [
    imageInputLayer(imageSize)
    
    convolution2dLayer(3,8,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,16,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,32,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    fullyConnectedLayer(10)
    softmaxLayer];

Spécifiez les options d’apprentissage. Le choix des options nécessite une analyse empirique. Pour explorer différentes configurations dans les options d’apprentissage au cours de vos expérimentations, vous pouvez utiliser l’application Experiment Manager.

opts = trainingOptions('sgdm', ...
    'MaxEpochs',15, ...
    'Shuffle','every-epoch', ...
    'Plots','training-progress', ...
    'Metrics','accuracy', ...
    'Verbose',false, ...
    'ValidationData',{XValidation,TValidation});

Entraînez le réseau de neurones avec la fonction trainnet. Pour la classification, utilisez la perte d’entropie croisée. Par défaut et selon disponibilité, la fonction trainnet utilise un GPU. L’apprentissage sur un GPU nécessite une licence Parallel Computing Toolbox™ et un dispositif GPU supporté. Pour plus d'information sur les dispositifs supportés, veuillez consulter GPU Computing Requirements (Parallel Computing Toolbox). Sinon, la fonction trainnet utilise le CPU. Pour spécifier l’environnement d’exécution, utilisez l’option d’apprentissage ExecutionEnvironment.

net = trainnet(augimds,layers,"crossentropy",opts);

Conseils

  • La fonction imtile permet de visualiser un grand nombre d’images transformées dans la même figure. Par exemple, le code suivant affiche un mini-batch d’images transformées provenant d’un datastore d'images augmentées nommé auimds.

    minibatch = read(auimds);
    imshow(imtile(minibatch.input))
  • Par défaut, le redimensionnement est la seule opération de prétraitement appliquée aux images. Pour activer des opérations de prétraitement supplémentaires, utilisez l’argument de type nom-valeur DataAugmentation avec un objet imageDataAugmenter. À chaque lecture d’images depuis le datastore d'images augmentées, une combinaison aléatoire différente d’opérations de prétraitement est appliquée à chaque image.

Historique des versions

Introduit dans R2018a