Main Content

augmentedImageDatastore

Transformieren von Stapeln zur Bilddatenerweiterung

Beschreibung

Ein erweiterter Bild-Datastore transformiert Stapel von Trainings-, Validierungs-, Test- und Vorhersagedaten mit optionaler Vorverarbeitung wie Größenänderung, Drehung und Spiegelung. Ändern Sie die Größe der Bilder, damit sie mit der Eingabegröße Ihres Deep-Learning-Netzes kompatibel sind. Erweitern Sie die Trainingsbilddaten mit zufälligen Vorverarbeitungsoperationen, um zu verhindern, dass das Netz eine Überanpassung vornimmt und sich die exakten Details der Trainingsbilder merkt.

Um ein Netz mit erweiterten Bildern zu trainieren, stellen Sie den augmentedImageDatastore für die trainnet-Funktion bereit. Weitere Informationen finden Sie unter Preprocess Images for Deep Learning.

  • Wenn Sie einen erweiterten Bild-Datastore als Quelle für Trainingsbilder verwenden, stört der Datastore die Trainingsdaten für jede Epoche nach dem Zufallsprinzip, sodass jede Epoche einen etwas anderen Datensatz verwendet. Die tatsächliche Anzahl der Trainingsbilder in jeder Epoche ändert sich nicht. Die transformierten Bilder werden nicht im Speicher abgelegt.

  • Eine imageInputLayer normalisiert Bilder anhand des Mittelwerts der erweiterten Bilder und nicht anhand des Mittelwerts des ursprünglichen Datensatzes. Dieser Mittelwert wird einmal für die erste erweiterte Epoche berechnet. Alle anderen Epochen verwenden den gleichen Mittelwert, sodass sich das Durchschnittsbild während des Trainings nicht ändert.

  • Verwenden Sie einen erweiterten Bild-Datastore für die effiziente Vorverarbeitung von Bildern für Deep Learning, einschließlich der Größenänderung von Bildern. Verwenden Sie nicht die Option ReadFcn von ImageDatastore-Objekten. ImageDatastore ermöglicht das Stapellesen von JPG- oder PNG-Bilddateien mit Prefetching. Wenn Sie die Option ReadFcn auf eine benutzerdefinierte Funktion setzen, dann führt der ImageDatastore keinen Prefetch aus und ist in der Regel deutlich langsamer.

Standardmäßig passt ein augmentedImageDatastore nur die Größe der Bilder an, um sie an die Ausgabegröße anzupassen. Sie können Optionen für zusätzliche Bildtransformationen mithilfe eines imageDataAugmenter konfigurieren.

Erstellung

Beschreibung

auimds = augmentedImageDatastore(outputSize,imds) erstellt einen erweiterten Bild-Datastore für Klassifizierungsprobleme mit Bildern aus dem Bild-Datastore imds und stellt die Eigenschaft OutputSize ein.

auimds = augmentedImageDatastore(outputSize,X,Y) erstellt einen erweiterten Bild-Datastore für Klassifizierungs- und Regressionsprobleme. Das Array X enthält die Prädiktorvariablen und das Array Y enthält die kategorischen Bezeichnungen oder numerischen Antworten.

auimds = augmentedImageDatastore(outputSize,X) erstellt einen erweiterten Bild-Datastore für die Vorhersage von Reaktionen auf Bilddaten im Array X.

auimds = augmentedImageDatastore(outputSize,tbl) erstellt einen erweiterten Bild-Datastore für Klassifizierungs- und Regressionsprobleme. Die Tabelle tbl enthält Prädiktoren und Antworten.

auimds = augmentedImageDatastore(outputSize,tbl,responseNames) erstellt einen erweiterten Bild-Datastore für Klassifizierungs- und Regressionsprobleme. Die Tabelle tbl enthält Prädiktoren und Antworten. Das Argument responseNames spezifiziert die Antwortvariablen in tbl.

Beispiel

auimds = augmentedImageDatastore(___,Name,Value) erstellt einen erweiterten Bild-Datastore, wobei Name-Wert-Paare zum Festlegen der Eigenschaften ColorPreprocessing, DataAugmentation, OutputSizeMode, und DispatchInBackground verwendet werden. Sie können mehrere Name-Wert-Paare angeben. Setzen Sie jeden Eigenschaftsnamen in Anführungszeichen.

Zum Beispiel erstellt augmentedImageDatastore([28,28],myTable,'OutputSizeMode','centercrop') einen erweiterten Bild-Datastore, der Bilder von der Mitte her beschneidet.

Eingangsargumente

alle erweitern

Bild-Datastore, angegeben als ein ImageDatastore-Objekt.

Bilder, angegeben als numerisches 4D-Array. Die ersten drei Dimensionen sind die Höhe, die Breite und die Kanäle, und die letzte Dimension indiziert die einzelnen Bilder.

Datentypen: single | double | uint8 | int8 | uint16 | int16 | uint32 | int32

Antworten für die Klassifizierung oder Regression, angegeben als eine der folgenden Möglichkeiten:

  • Bei einem Klassifizierungsproblem ist Y ein kategorischer Vektor, der die Bildkennzeichnungen enthält.

  • Bei einem Regressionsproblem kann Y eines der Folgenden sein:

    • numerische nxr Matrix. Dabei ist n die Anzahl der Beobachtungen und r die Anzahl der Antworten.

    • numerisches hxwxcxn Array. Dabei ist hxwxc die Größe einer einzelnen Antwort und n die Anzahl der Beobachtungen.

Antworten dürfen keine NaNs enthalten.

Datentypen: categorical | double

Eingabedaten, angegeben als Tabelle. tbl muss die Prädiktoren in der ersten Spalte entweder als absolute oder relative Bildpfade oder Bilder enthalten. Die Art und der Ort der Antworten hängen vom Problem ab:

  • Bei einem Klassifizierungsproblem muss die Antwort eine kategoriale Variable sein, die Bezeichnungen für die Bilder enthält. Wenn der Name der Antwortvariablen nicht im Aufruf von augmentedImageDatastore angegeben wird, müssen die Antworten in der zweiten Spalte stehen. Wenn die Antworten in einer anderen Spalte von tbl stehen, müssen Sie den Namen der Antwortvariablen mit dem Argument responseNames angeben.

  • Bei einem Regressionsproblem müssen die Antworten numerische Werte in der Spalte oder den Spalten nach der ersten Spalte sein. Die Antworten können entweder in mehreren Spalten als Skalare oder in einer einzigen Spalte als numerische Vektoren oder Zellarrays mit numerischen 3D-Arrays vorliegen. Wenn Sie den oder die Namen der Antwortvariablen nicht angeben, akzeptiert augmentedImageDatastore die übrigen Spalten von tbl als Antwortvariablen. Sie können die Namen der Antwortvariablen mit dem Argument responseNames angeben.

Antworten dürfen keine NaN-Werte enthalten. Wenn NaNs in den Prädiktor-Daten vorkommen, werden sie durch das Training propagiert, in den meisten Fällen konvergiert das Training jedoch nicht.

Datentypen: table

Namen der Antwortvariablen in der Eingabetabelle, angegeben als einer der folgenden Möglichkeiten:

  • Bei Klassifizierungs- oder Regressionsaufgaben mit einer einzigen Antwort muss responseNames ein Zeichenvektor oder ein Stringskalar sein, der die Antwortvariable in der Eingabetabelle enthält.

    Bei Regressionsaufgaben mit Mehrfachantworten muss responseNames ein String-Array oder ein Zellarray von Zeichenvektoren sein, die die Antwortvariablen in der Eingabetabelle enthalten.

Datentypen: char | cell | string

Eigenschaften

alle erweitern

Bei der Vorverarbeitung ausgeführte Farboperationen, die an eingegebenen Graustufen- oder RGB-Bildern durchgeführt werden, werden als 'none', 'gray2rgb', oder 'rgb2gray' angegeben. Wenn der Bild-Datastore eine Mischung aus Graustufen- und RGB-Bildern enthält, verwenden Sie ColorPreprocessing um sicherzustellen, dass alle Ausgabebilder über die von imageInputLayer erforderliche Anzahl von Kanälen verfügen.

Wenn ein Eingabebild bereits über die erforderliche Anzahl von Farbkanälen verfügt, wird keine Farbvorverarbeitung durchgeführt. Wenn Sie zum Beispiel den Wert 'gray2rgb' angeben und ein Eingabebild bereits drei Kanäle hat, findet keine Farbvorverarbeitung statt.

Hinweis

Das augmentedImageDatastore-Objekt wandelt mithilfe der rgb2gray-Funktion RGB-Bilder in Graustufen um. Wenn ein Bild drei Kanäle hat, die nicht den Kanälen Rot, Grün und Blau entsprechen (z. B. ein Bild im L*a*b*-Farbraum), dann kann die Verwendung von ColorPreprocessing zu schlechten Ergebnissen führen.

Es wird keine Farbvorverarbeitung durchgeführt, wenn die Eingangsbilder nicht 1 oder 3 Kanäle haben, wie z. B. bei multispektralen oder hyperspektralen Bildern. In diesem Fall müssen alle Eingabebilder über die gleiche Anzahl von Kanälen verfügen.

Datentypen: char | string

Vorverarbeitung, die auf Eingabebilder angewendet wird, die als imageDataAugmenter-Objekt oder 'none' angegeben sind. Wenn DataAugmentation auf 'none' eingestellt ist, erfolgt keine Vorverarbeitung die Eingabebilder.

Dispatching von Beobachtungen im Hintergrund während des Trainings, der Vorhersage oder der Klassifizierung, angegeben als false oder true. Um das Dispatching im Hintergrund zu verwenden, müssen Sie über die Parallel Computing Toolbox™ verfügen.

Erweiterte Bild-Datastores führen Hintergrund-Dispatching nur durch, wenn sie mit der trainnet-Funktion und Inferenzfunktionen wie predict und minibatchpredict verwendet werden. Das Dispatching im Hintergrund findet nicht statt, wenn Sie die read-Funktion des Datastores direkt aufrufen.

Anzahl der Beobachtungen, die in jedem Stapel ausgegeben werden. Sie können den Wert von MiniBatchSize erst ändern, nachdem Sie den Datastore erstellt haben. Für Training, Vorhersage und Klassifizierung wird MiniBatchSize auf die Ministapel-Größe gesetzt, die in trainingOptions definiert ist.

Diese Eigenschaft ist schreibgeschützt.

Gesamtzahl der Beobachtungen in dem erweiterten Bild-Datastore. Die Anzahl der Beobachtungen entspricht der Länge einer Trainingsepoche.

Größe der Ausgabebilder, angegeben als Vektor aus zwei positiven Ganzzahlen. Das erste Element gibt die Anzahl der Zeilen in den Ausgabebildern an, das zweite Element die Anzahl der Spalten.

Hinweis

Wenn Sie einen augmentedImageDatastore erstellen, indem Sie die Bildausgabegröße als Drei-Elemente-Vektor angeben, ignoriert der Datastore das dritte Element. Stattdessen verwendet der Datastore den Wert von ColorPreprocessing, um die Dimensionalität der Ausgabebilder zu bestimmen. Wenn Sie zum Beispiel OutputSize als [28 28 1] festlegen, aber ColorPreprocessing als 'gray2rgb' angeben, dann haben die ausgegebenen Bilder die Größe 28x28x3.

Methode zur Größenänderung der Ausgabebilder, angegeben als eine der folgenden Möglichkeiten:

  • 'resize': Skalieren des Bilds mittels bilinearer Interpolation, um es an die Ausgabegröße anzupassen.

    Hinweis

    augmentedImageDatastore verwendet die bilineare Interpolationsmethode von imresize mit Antialiasing. Die bilineare Interpolation ermöglicht eine schnelle Bildverarbeitung und vermeidet gleichzeitig Verzerrungen, wie sie bei der Interpolation mit den nächsten Nachbarn auftreten. Im Gegensatz dazu verwendet imresize bei der Standardeinstellung die bikubische Interpolation mit Antialiasing, um ein qualitativ hochwertiges Bild mit veränderter Größe zu erzeugen, allerdings auf Kosten einer längeren Verarbeitungszeit.

  • 'centercrop': Entnimmt einen Ausschnitt aus der Mitte des Trainingsbildes. Der Ausschnitt hat die gleiche Größe wie die Ausgabegröße.

  • 'randcrop': Entnimmt einen zufälligen Ausschnitt aus dem Trainingsbild. Der Zufallsausschnitt hat die gleiche Größe wie die Ausgabegröße.

Datentypen: char | string

Objektfunktionen

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

Beispiele

alle reduzieren

Trainieren Sie ein faltendes neuronales Netz unter Verwendung erweiterter Bilddaten. Durch Daten-Augmentation kann verhindert werden, dass das Netz eine Überanpassung vornimmt und sich die exakten Details der Trainingsbilder merkt.

Laden Sie die Beispieldaten, die aus synthetischen Bildern von handgeschriebenen Ziffern bestehen. XTrain ist ein 28x28x1x5000-Array, wobei:

  • 28 die Höhe und Breite der Bilder ist.

  • 1 die Anzahl der Kanäle ist.

  • 5000 die Anzahl der synthetischen Bilder von handgeschriebenen Ziffern ist.

labelsTrain ist ein kategorischer Vektor, der die Bezeichnungen für jede Beobachtung enthält.

load DigitsDataTrain

Halten Sie 1000 der Bilder für die Netzvalidierung zurück.

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

Erstellen Sie ein imageDataAugmenter-Objekt, das Vorverarbeitungsoptionen für die Bildvergrößerung angibt, z. B. Größenänderung, Drehung, Übersetzung und Spiegelung. Verschieben Sie die Bilder zufällig um bis zu drei Pixel horizontal und vertikal und drehen Sie die Bilder in einem Winkel von bis zu 20 Grad.

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]

Erstellen Sie ein augmentedImageDatastore-Objekt, das für das Netztraining verwendet werden soll, und geben Sie die Größe der Bildausgabe an. Während des Trainings führt der Datastore eine Bildvergrößerung durch und verändert die Größe der Bilder. Der Datastore erweitert die Bilder, ohne sie im Arbeitsspeicher zu speichern. trainnet aktualisiert die Netzparameter und verwirft dann die erweiterten Bilder.

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

Legen Sie die Architektur des faltenden neuronalen Netzes fest.

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];

Legen Sie die Trainingsoptionen fest. Die Auswahl aus diesen Optionen erfordert eine empirische Analyse. Um verschiedene Konfigurationen von Trainingsoptionen durch Experimente zu untersuchen, können Sie die App Experiment Manager verwenden.

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

Trainieren Sie das neuronale Netz mit der Funktion trainnet. Verwenden Sie zur Klassifizierung den Kreuzentropieverlust. Standardmäßig verwendet die trainnet-Funktion eine GPU, sofern vorhanden. Für das Training auf einem Grafikprozessor sind eine Parallel Computing Toolbox™-Lizenz und ein unterstütztes Grafikprozessorgerät erforderlich. Informationen zu unterstützten Geräten finden Sie unter GPU Computing Requirements (Parallel Computing Toolbox). Andernfalls verwendet die trainnet-Funktion die CPU. Um die Ausführungsumgebung festzulegen, verwenden Sie die Trainingsoption ExecutionEnvironment.

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

Tipps

  • Sie können viele transformierte Bilder in derselben Abbildung visualisieren, indem Sie die Funktion imtile verwenden. Dieser Code zeigt zum Beispiel einen Ministapel transformierter Bilder aus einem erweiterten Bild-Datastore namens auimds an.

    minibatch = read(auimds);
    imshow(imtile(minibatch.input))
  • Standardmäßig ist die Größenänderung die einzige Bildvorverarbeitung, die an Bildern vorgenommen wird. Aktivieren Sie zusätzliche Vorverarbeitungsoperationen, indem Sie das Name-Werte-Paar-Argument DataAugmentation mit einem imageDataAugmenter-Objekt verwenden. Jedes Mal, wenn Bilder aus dem erweiterten Bild-Datastore gelesen werden, wird eine andere zufällige Kombination von Vorverarbeitungsvorgängen auf jedes Bild angewendet.

Versionsverlauf

Eingeführt in R2018a