Datenerweiterung | Verwendung von Deep Learning mit eingeschränkten Daten - Teil 2

Dieser Artikel enthält einen umfassenden Überblick über die bildspezifischen Datenerweiterungstechniken für Deep Learning. Dies ist Teil 2 von So verwenden Sie Deep Learning, wenn Sie über eingeschränkte Daten verfügen. Kasse Teil 1 hier.

Wir waren alle dort. Sie haben ein herausragendes Konzept, das mithilfe eines maschinellen Lernmodells implementiert werden kann. Sie öffnen Ihren Webbrowser und suchen nach relevanten Daten. Möglicherweise finden Sie einen Datensatz mit einigen hundert Bildern.

Sie erinnern sich, dass die gängigsten Datensätze Bilder in der Größenordnung von Zehntausenden (oder mehr) enthalten. Sie erinnern sich auch an jemanden, der erwähnt, dass ein großer Datensatz für eine gute Leistung entscheidend ist. Sich enttäuscht fühlend, wunderst du dich; Kann mein hochmodernes neuronales Netzwerk mit der geringen Datenmenge, über die ich verfüge, eine gute Leistung erbringen?

Die Antwort ist ja! Aber bevor wir uns auf die Magie einlassen, das zu verwirklichen, müssen wir über einige grundlegende Fragen nachdenken.

Warum werden große Datenmengen benötigt?

Anzahl der Parameter (in Millionen) für gängige neuronale Netze.

Wenn Sie ein Modell für maschinelles Lernen trainieren, passen Sie seine Parameter so an, dass eine bestimmte Eingabe (z. B. ein Bild) einer Ausgabe (eine Bezeichnung) zugeordnet werden kann. Unser Optimierungsziel ist es, den Sweet Spot zu finden, an dem der Verlust unseres Modells gering ist. Dies geschieht, wenn Ihre Parameter richtig eingestellt werden.

Neuronale Netze nach dem Stand der Technik haben typischerweise Parameter in der Größenordnung von Millionen!

Wenn Sie viele Parameter haben, müssen Sie Ihrem maschinellen Lernmodell natürlich eine proportionale Anzahl von Beispielen zeigen, um eine gute Leistung zu erzielen. Außerdem ist die Anzahl der benötigten Parameter proportional zur Komplexität der von Ihrem Modell auszuführenden Aufgabe.

Wie erhalte ich mehr Daten, wenn ich keine "mehr Daten" habe?

Sie müssen nicht nach neuen Bildern suchen, die Ihrem Datensatz hinzugefügt werden können. Warum? Denn neuronale Netze sind von Anfang an nicht klug. Zum Beispiel würde ein schlecht trainiertes neuronales Netzwerk denken, dass diese drei unten gezeigten Tennisbälle unterschiedliche, einzigartige Bilder sind.

Derselbe Tennisball, aber übersetzt.

Um mehr Daten zu erhalten, müssen wir nur geringfügige Änderungen an unserem vorhandenen Datensatz vornehmen. Kleinere Änderungen wie Spiegelungen oder Übersetzungen oder Rotationen. Unser neuronales Netzwerk würde denken, dass dies ohnehin unterschiedliche Bilder sind.

Datenerweiterung im Spiel

Ein neuronales Faltungsnetzwerk, das Objekte auch dann robust klassifizieren kann, wenn es in unterschiedlichen Ausrichtungen platziert ist, soll die Eigenschaft Invarianz haben. Insbesondere kann eine CNN gegenüber der Translation, dem Standpunkt, der Größe oder der Beleuchtung (oder einer Kombination der obigen) unveränderlich sein.

Dies ist im Wesentlichen die Voraussetzung für die Datenerweiterung. Im realen Szenario wird möglicherweise ein Datensatz mit Bildern erstellt, die unter bestimmten Bedingungen aufgenommen wurden. Unsere Zielanwendung kann jedoch unter verschiedenen Bedingungen wie unterschiedlicher Ausrichtung, Position, Skalierung, Helligkeit usw. existieren. Wir berücksichtigen diese Situationen, indem wir unser neuronales Netzwerk mit zusätzlichen synthetisch modifizierten Daten trainieren.

Kann Augmentation helfen, auch wenn ich viele Daten habe?

Ja. Dies kann dazu beitragen, die Menge der relevanten Daten in Ihrem Datensatz zu erhöhen. Dies hängt damit zusammen, wie neuronale Netze lernen. Lassen Sie es mich anhand eines Beispiels veranschaulichen.

Die beiden Klassen in unserem hypothetischen Datensatz. Die linke steht für Marke A (Ford) und die rechte für Marke B (Chevrolet).

Stellen Sie sich vor, Sie haben einen Datensatz, der aus zwei Automarken besteht, wie oben gezeigt. Nehmen wir an, dass alle Autos der Marke A genau wie auf dem Bild links ausgerichtet sind (d. H. Alle Autos sind nach links gerichtet). Ebenso sind alle Fahrzeuge der Marke B genau wie auf dem Bild rechts ausgerichtet (d. H. Nach rechts gerichtet). Nun speisen Sie diesen Datensatz in Ihr hochmodernes neuronales Netzwerk ein und hoffen, nach dem Training beeindruckende Ergebnisse zu erzielen.

Ein Ford-Auto (Marke A), aber nach rechts gerichtet.

Nehmen wir an, es wurde trainiert, und Sie geben das obige Bild an, das ein Auto der Marke A ist. Ihr neuronales Netzwerk gibt jedoch an, dass es sich um ein Auto der Marke B handelt! Sie sind verwirrt. Haben Sie mit Ihrem hochmodernen neuronalen Netzwerk nicht nur eine Genauigkeit von 95% für Ihren Datensatz erzielt? Ich übertreibe nicht, ähnliche Vorfälle und Fehlentwicklungen sind in der Vergangenheit aufgetreten.

Warum passiert das? Das passiert, weil die meisten Algorithmen für maschinelles Lernen so funktionieren. Es findet die offensichtlichsten Merkmale, die eine Klasse von einer anderen unterscheiden. Hier war das Merkmal, dass alle Autos der Marke A nach links und alle Autos der Marke B nach rechts gerichtet waren.

Ihr neuronales Netzwerk ist nur so gut wie die Daten, die Sie ihm zuführen.

Wie verhindern wir das? Wir müssen die Anzahl irrelevanter Features im Datensatz reduzieren. Für unseren obigen Automodellklassifizierer besteht eine einfache Lösung darin, Bilder von Autos beider Klassen, die in die andere Richtung zeigen, zu unserem ursprünglichen Datensatz hinzuzufügen. Besser noch, Sie können die Bilder im vorhandenen Datensatz einfach horizontal spiegeln, sodass sie zur anderen Seite zeigen! Wenn Sie nun das neuronale Netzwerk auf diesen neuen Datensatz trainieren, erhalten Sie die Leistung, die Sie erhalten möchten.

Indem Sie eine Erweiterung durchführen, können Sie verhindern, dass Ihr neuronales Netzwerk irrelevante Muster erlernt, was die Gesamtleistung wesentlich steigert.

Anfangen

Bevor wir uns mit den verschiedenen Augmentationstechniken befassen, müssen wir uns zunächst mit einem Problem befassen.

Wo erweitern wir die Daten in unserer ML-Pipeline?

Die Antwort mag ziemlich offensichtlich erscheinen; Führen wir eine Erweiterung durch, bevor wir die Daten dem Modell zuführen, oder? Ja, aber Sie haben hier zwei Möglichkeiten. Eine Möglichkeit besteht darin, alle erforderlichen Transformationen im Voraus durchzuführen und so die Größe Ihres Datasets wesentlich zu erhöhen. Die andere Möglichkeit besteht darin, diese Transformationen in einem Mini-Batch auszuführen, bevor Sie sie Ihrem maschinellen Lernmodell hinzufügen.

Die erste Option wird als Offline-Erweiterung bezeichnet. Diese Methode wird für relativ kleinere Datasets bevorzugt, da Sie die Größe des Datasets am Ende um einen Faktor erhöhen würden, der der Anzahl der von Ihnen durchgeführten Transformationen entspricht ein Faktor von 2).

Die zweite Option ist als Online-Augmentation oder Augmentation on the fly bekannt. Diese Methode wird für größere Datensätze bevorzugt, da Sie sich die explosive Vergrößerung nicht leisten können. Stattdessen würden Sie Transformationen für die Minibatches durchführen, die Sie Ihrem Modell zuführen würden. Einige Frameworks für maschinelles Lernen unterstützen die Online-Erweiterung, die auf der GPU beschleunigt werden kann.

Beliebte Augmentationstechniken

In diesem Abschnitt werden einige grundlegende, aber leistungsstarke Augmentationstechniken vorgestellt, die im Allgemeinen verwendet werden. Bevor wir diese Techniken untersuchen, wollen wir der Einfachheit halber eine Annahme treffen. Die Annahme ist, dass wir nicht berücksichtigen müssen, was jenseits der Bildgrenze liegt. Wir verwenden die folgenden Techniken, sodass unsere Annahme gültig ist.

Was würde passieren, wenn wir eine Technik verwenden, die uns zwingt, zu erraten, was jenseits der Bildgrenze liegt? In diesem Fall müssen wir einige Informationen interpolieren. Wir werden dies im Detail besprechen, nachdem wir die Arten der Augmentation behandelt haben.

Für jede dieser Techniken geben wir auch den Faktor an, um den sich die Größe Ihres Datasets erhöhen würde (auch bekannt als Data Augmentation Factor).

1. Flip

Sie können Bilder horizontal und vertikal spiegeln. Einige Frameworks bieten keine Funktion für vertikale Spiegelungen. Eine vertikale Umkehrung entspricht jedoch einer Drehung eines Bildes um 180 Grad und einer anschließenden horizontalen Umkehrung. Unten finden Sie Beispiele für Bilder, die gespiegelt sind.

Von links haben wir das Originalbild, gefolgt von dem horizontal gespiegelten Bild und dem vertikal gespiegelten Bild.

Sie können Flips ausführen, indem Sie einen der folgenden Befehle aus Ihren bevorzugten Paketen verwenden. Datenvergrößerungsfaktor = 2 bis 4x

# NumPy.'img '= Ein einzelnes Bild.
flip_1 = np.fliplr (img)
# TensorFlow. 'x' = Ein Platzhalter für ein Bild.
Form = [Höhe, Breite, Kanäle]
x = tf.placeholder (dtype = tf.float32, shape = shape)
flip_2 = tf.image.flip_up_down (x)
flip_3 = tf.image.flip_left_right (x)
flip_4 = tf.image.random_flip_up_down (x)
flip_5 = tf.image.random_flip_left_right (x)

2. Drehung

Eine wichtige Anmerkung zu dieser Operation ist, dass die Bildabmessungen nach dem Drehen möglicherweise nicht beibehalten werden. Wenn es sich bei Ihrem Bild um ein Quadrat handelt, wird durch Drehen im rechten Winkel die Bildgröße beibehalten. Wenn es sich um ein Rechteck handelt, wird durch Drehen um 180 Grad die Größe beibehalten. Durch Drehen des Bildes um feinere Winkel wird auch die endgültige Bildgröße geändert. Wir werden im nächsten Abschnitt sehen, wie wir mit diesem Problem umgehen können. Unten finden Sie Beispiele für rechtwinklig gedrehte quadratische Bilder.

Die Bilder werden gegenüber dem vorherigen um 90 Grad im Uhrzeigersinn gedreht, während wir uns von links nach rechts bewegen.

Sie können Rotationen mit einem der folgenden Befehle aus Ihren bevorzugten Paketen ausführen. Datenvergrößerungsfaktor = 2 bis 4x

# Platzhalter: 'x' = Ein einzelnes Bild, 'y' = Ein Stapel von Bildern
# 'k' bezeichnet die Anzahl der Umdrehungen um 90 Grad gegen den Uhrzeigersinn
Form = [Höhe, Breite, Kanäle]
x = tf.placeholder (dtype = tf.float32, shape = shape)
rot_90 = tf.image.rot90 (img, k = 1)
rot_180 = tf.image.rot90 (img, k = 2)
# In jedem Winkel drehen. Im folgenden Beispiel wird der Winkel im Bogenmaß angegeben
Form = [Charge, Höhe, Breite, 3]
y = tf.placeholder (dtype = tf.float32, shape = shape)
rot_tf_180 = tf.contrib.image.rotate (y, angle = 3.1415)
# Scikit-Image. 'angle' = Grad. 'img' = Eingabebild
# Einzelheiten zum Modus finden Sie im folgenden Abschnitt zur Interpolation.
rot = skimage.transform.rotate (img, angle = 45, mode = 'reflect')

3. Skalieren

Das Bild kann nach außen oder innen skaliert werden. Beim Skalieren nach außen ist die endgültige Bildgröße größer als die ursprüngliche Bildgröße. Die meisten Bild-Frameworks schneiden einen Ausschnitt aus dem neuen Bild aus, wobei die Größe dem Originalbild entspricht. Wir werden uns im nächsten Abschnitt mit der nach innen gerichteten Skalierung befassen, da sie die Bildgröße verringert und uns zwingt, Annahmen darüber zu treffen, was jenseits der Grenze liegt. Unten sehen Sie Beispiele oder Bilder, die skaliert werden.

Von links haben wir das Originalbild, das Bild um 10% nach außen und das Bild um 20% nach außen skaliert.

Sie können die Skalierung mithilfe der folgenden Befehle mit scikit-image durchführen. Datenvergrößerungsfaktor = beliebig.

# Scikit Image. 'img' = Eingabebild, 'scale' = Skalierungsfaktor
# Einzelheiten zum Modus finden Sie im folgenden Abschnitt zur Interpolation.
scale_out = skimage.transform.rescale (img, scale = 2.0, mode = 'constant')
scale_in = skimage.transform.rescale (img, scale = 0.5, mode = 'constant')
# Vergessen Sie nicht, die Bilder auf die ursprüngliche Größe zuzuschneiden (z
# scale_out)

4. Zuschneiden

Im Gegensatz zur Skalierung wird nur ein Ausschnitt aus dem Originalbild zufällig ausgewählt. Wir ändern dann die Größe dieses Abschnitts auf die ursprüngliche Bildgröße. Diese Methode wird im Volksmund als zufälliges Zuschneiden bezeichnet. Nachfolgend finden Sie Beispiele für zufälliges Zuschneiden. Wenn Sie genau hinsehen, können Sie den Unterschied zwischen dieser Methode und der Skalierung feststellen.

Von links haben wir das Originalbild, einen quadratischen Ausschnitt von links oben und einen quadratischen Ausschnitt von rechts unten. Die zugeschnittenen Bereiche wurden auf die ursprüngliche Bildgröße verkleinert.

Sie können mit dem folgenden Befehl für TensorFlow zufällige Ernten durchführen. Datenvergrößerungsfaktor = beliebig.

# TensorFlow. 'x' = Ein Platzhalter für ein Bild.
original_size = [Höhe, Breite, Kanäle]
x = tf.placeholder (dtype = tf.float32, shape = original_size)
# Verwenden Sie die folgenden Befehle, um zufällige Ernten durchzuführen
crop_size = [new_height, new_width, channels]
seed = np.random.randint (1234)
x = tf.random_crop (x, size = crop_size, seed = seed)
output = tf.images.resize_images (x, size = original_size)

5. Übersetzung

Bei der Übersetzung wird das Bild nur in X- oder Y-Richtung (oder in beiden Richtungen) verschoben. Im folgenden Beispiel wird davon ausgegangen, dass das Bild jenseits seiner Begrenzung einen schwarzen Hintergrund hat und entsprechend übersetzt wird. Diese Methode der Vergrößerung ist sehr nützlich, da sich die meisten Objekte fast überall im Bild befinden können. Dies zwingt Ihr neuronales Faltungsnetzwerk dazu, überall zu suchen.

Von links haben wir das Originalbild, das Bild nach rechts übersetzt und das Bild nach oben übersetzt.

Mit den folgenden Befehlen können Sie Übersetzungen in TensorFlow ausführen. Datenvergrößerungsfaktor = beliebig.

# pad_left, pad_right, pad_top, pad_bottom bezeichnen das Pixel
# Verschiebung. Setzen Sie einen von ihnen auf den gewünschten Wert und setzen Sie ihn auf 0
Form = [Stapel, Höhe, Breite, Kanäle]
x = tf.placeholder (dtype = tf.float32, shape = shape)
# Wir verwenden zwei Funktionen, um die gewünschte Augmentation zu erzielen
x = tf.image.pad_to_bounding_box (x, pad_top, pad_left, height + pad_bottom + pad_top, width + pad_right + pad_left)
output = tf.image.crop_to_bounding_box (x, pad_bottom, pad_right, height, width)

6. Gaußsches Rauschen

Überanpassung tritt normalerweise auf, wenn Ihr neuronales Netzwerk versucht, Hochfrequenzmerkmale (häufig vorkommende Muster) zu lernen, die möglicherweise nicht nützlich sind. Das Gaußsche Rauschen mit dem Mittelwert Null weist im Wesentlichen Datenpunkte auf allen Frequenzen auf, wodurch die Hochfrequenzmerkmale effektiv verzerrt werden. Dies bedeutet auch, dass niederfrequente Komponenten (normalerweise Ihre beabsichtigten Daten) ebenfalls verzerrt sind, aber Ihr neuronales Netzwerk kann lernen, darüber hinauszusehen. Das Hinzufügen der richtigen Geräuschmenge kann die Lernfähigkeit verbessern.

Eine abgeschwächte Version davon ist das Salz- und Pfefferrauschen, das sich als zufällige schwarze und weiße Pixel darstellt, die über das Bild verteilt sind. Dies ähnelt dem Effekt, der durch Hinzufügen von Gaußschem Rauschen zu einem Bild erzeugt wird, kann jedoch eine geringere Informationsverzerrung aufweisen.

Von links haben wir das Originalbild, Bild mit hinzugefügtem Gaußschen Rauschen, Bild mit hinzugefügtem Salz- und Pfefferrauschen

Mit dem folgenden Befehl in TensorFlow können Sie Ihrem Bild Gaußsches Rauschen hinzufügen. Datenvergrößerungsfaktor = 2x.

#TensorFlow. 'x' = Ein Platzhalter für ein Bild.
Form = [Höhe, Breite, Kanäle]
x = tf.placeholder (dtype = tf.float32, shape = shape)
# Hinzufügen von Gaußschem Rauschen
noise = tf.random_normal (shape = tf.shape (x), mean = 0.0, stddev = 1.0,
dtype = tf.float32)
output = tf.add (x, noise)

Fortgeschrittene Augmentationstechniken

In der realen Welt können natürliche Daten immer noch unter einer Vielzahl von Bedingungen existieren, die mit den oben beschriebenen einfachen Methoden nicht berücksichtigt werden können. Nehmen wir zum Beispiel die Aufgabe, die Landschaft auf dem Foto zu identifizieren. Die Landschaft kann alles sein: gefrorene Tundren, Wiesen, Wälder und so weiter. Klingt nach einer einfachen Klassifizierungsaufgabe, oder? Du hättest recht, bis auf eine Sache. Wir übersehen ein entscheidendes Merkmal in den Fotos, das sich auf die Leistung auswirken würde - Die Jahreszeit, in der das Foto aufgenommen wurde.

Wenn unser neuronales Netz nicht versteht, dass bestimmte Landschaften unter verschiedenen Bedingungen (Schnee, Feuchtigkeit, Licht usw.) existieren können, kann es gefrorene Seeufer fälschlicherweise als Gletscher oder feuchte Felder als Sümpfe kennzeichnen.

Eine Möglichkeit, diese Situation zu entschärfen, besteht darin, weitere Bilder hinzuzufügen, sodass wir alle saisonalen Veränderungen berücksichtigen. Aber das ist eine mühsame Aufgabe. Stellen Sie sich vor, wie cool es wäre, Effekte wie verschiedene Jahreszeiten künstlich zu erzeugen, wenn Sie unser Datenerweiterungskonzept erweitern?

Bedingte GANs zur Rettung!

Bedingte GANs können ein Bild von einer Domäne in ein Bild in eine andere Domäne umwandeln, ohne ins Detail zu gehen. Wenn Sie der Meinung sind, dass dies zu vage klingt, ist dies nicht der Fall. das ist buchstäblich, wie mächtig dieses neuronale Netzwerk ist! Im Folgenden finden Sie ein Beispiel für bedingte GANs, mit denen Fotos von Sommerlandschaften in Winterlandschaften umgewandelt werden.

Ändern der Jahreszeiten mit einem CycleGAN (Quelle: https://junyanz.github.io/CycleGAN/)

Das obige Verfahren ist robust, aber rechenintensiv. Eine billigere Alternative wäre ein sogenannter neuronaler Transfer. Es erfasst die Textur / das Ambiente / das Erscheinungsbild eines Bildes (auch bekannt als "Stil") und mischt es mit dem Inhalt eines anderen. Mit dieser leistungsstarken Technik erzielen wir einen ähnlichen Effekt wie mit unserer bedingten GAN (diese Methode wurde sogar eingeführt, bevor die cGANs erfunden wurden!).

Der einzige Nachteil dieser Methode ist, dass die Ausgabe eher künstlerisch als realistisch aussieht. Es gibt jedoch einige Fortschritte, wie z. B. den unten gezeigten Deep Photo Style Transfer, die zu beeindruckenden Ergebnissen führen.

Deep Photo Style Transfer. Beachten Sie, wie wir den gewünschten Effekt auf unseren Datensatz erzielen können. (Quelle: https://arxiv.org/abs/1703.07511)

Wir haben diese Techniken nicht eingehend untersucht, da wir uns nicht mit ihrer inneren Arbeit befassen. Wir können vorhandene trainierte Modelle zusammen mit der Magie des Transferlernens verwenden, um sie für die Erweiterung zu verwenden.

Ein kurzer Hinweis zur Interpolation

Was ist, wenn Sie ein Bild übersetzen möchten, das keinen schwarzen Hintergrund hat? Was wäre, wenn Sie nach innen skalieren wollten? Oder in feineren Winkeln drehen? Nachdem wir diese Transformationen durchgeführt haben, müssen wir die ursprüngliche Bildgröße beibehalten. Da unser Bild keine Informationen zu Dingen außerhalb seiner Grenzen enthält, müssen wir einige Annahmen treffen. Normalerweise wird angenommen, dass der Abstand hinter der Bildgrenze an jedem Punkt die Konstante 0 ist. Wenn Sie diese Transformationen durchführen, erhalten Sie daher einen schwarzen Bereich, in dem das Bild nicht definiert ist.

Von links ein um 45 Grad gegen den Uhrzeigersinn gedrehtes Bild, ein nach rechts verschobenes Bild und ein nach innen skaliertes Bild.

Aber ist das die richtige Annahme? Im realen Szenario ist es meistens ein Nein. Bildverarbeitung und ML-Frameworks haben einige Standardmethoden, mit denen Sie entscheiden können, wie der unbekannte Raum ausgefüllt werden soll. Sie sind wie folgt definiert.

Von links haben wir die Modi Konstante, Kante, Reflektieren, Symmetrisch und Umbrechen.

1. Konstante

Die einfachste Interpolationsmethode besteht darin, den unbekannten Bereich mit einem konstanten Wert zu füllen. Dies funktioniert möglicherweise nicht für natürliche Bilder, aber für Bilder, die in einem monochromen Hintergrund aufgenommen wurden

2. Kante

Die Randwerte des Bildes werden nach dem Rand erweitert. Diese Methode kann für milde Übersetzungen verwendet werden.

3. Reflektieren

Die Bildpixelwerte werden entlang der Bildgrenze reflektiert. Diese Methode eignet sich für kontinuierliche oder natürliche Hintergründe mit Bäumen, Bergen usw.

4. Symmetrisch

Dieses Verfahren ähnelt dem Reflektieren, mit der Ausnahme, dass an der Reflexionsgrenze eine Kopie der Randpixel erstellt wird. Normalerweise können Reflect und Symmetric synonym verwendet werden. Bei sehr kleinen Bildern oder Mustern werden jedoch Unterschiede sichtbar.

5. Wrap

Das Bild wird nur über die Grenzen hinweg wiederholt, als würde es gekachelt. Diese Methode wird nicht so häufig verwendet wie die anderen, da sie für viele Szenarien keinen Sinn ergibt.

Außerdem können Sie Ihre eigenen Methoden für den Umgang mit undefiniertem Speicherplatz entwerfen. Normalerweise reichen diese Methoden jedoch für die meisten Klassifizierungsprobleme aus.

Wenn ich also ALLE diese Techniken verwende, wäre mein ML-Algorithmus robust, oder?

Wenn Sie es richtig verwenden, dann ja! Was ist der richtige Weg, den Sie fragen? Nun, manchmal sind nicht alle Augmentationstechniken für einen Datensatz sinnvoll. Betrachten Sie noch einmal unser Auto-Beispiel. Im Folgenden finden Sie einige Möglichkeiten, wie Sie das Bild ändern können.

Das erste Bild (von links) ist das Original, das zweite wird horizontal gespiegelt, das dritte um 180 Grad und das letzte um 90 Grad (im Uhrzeigersinn) gedreht.

Sicher, es handelt sich um Bilder desselben Autos, aber in Ihrer Zielanwendung werden Autos möglicherweise nie in dieser Ausrichtung angezeigt.

Wenn Sie beispielsweise nur zufällige Autos auf der Straße klassifizieren, ist nur das zweite Bild im Datensatz sinnvoll. Wenn Sie jedoch eine Versicherungsgesellschaft besitzen, die sich mit Autounfällen befasst, und auch Modelle verkehrter, kaputter Autos identifizieren möchten, ist das dritte Bild sinnvoll. Das letzte Bild ist möglicherweise für beide oben genannten Szenarien nicht sinnvoll.

Der Punkt ist, dass wir bei der Verwendung von Augmentationstechniken darauf achten müssen, keine irrelevanten Daten zu erhöhen.

Lohnt sich der Aufwand wirklich?

Sie erwarten wahrscheinlich, dass einige Ergebnisse Sie dazu motivieren, die Extrameile zu gehen. Fair genug; Ich habe das auch abgedeckt. Lassen Sie mich anhand eines Spielzeugbeispiels beweisen, dass Augmentation wirklich funktioniert. Sie können dieses Experiment zur Überprüfung replizieren.

Erstellen wir zwei neuronale Netze, um Daten in eine von vier Klassen einzuteilen: Katze, Löwe, Tiger oder Leopard. Der Haken ist, dass einer keine Datenerweiterung verwendet, während der andere dies tut. Sie können den Datensatz von diesem Link herunterladen.

Wenn Sie den Datensatz ausgecheckt haben, werden Sie feststellen, dass nur 50 Bilder pro Klasse für Training und Test vorhanden sind. Natürlich können wir für einen der Klassifikatoren keine Erweiterung verwenden. Um die Chancen fairer zu gestalten, verwenden wir Transfer Learning, um den Modellen mit der geringen Datenmenge eine bessere Chance zu geben.

Die vier Klassen in unserem Datensatz.

Verwenden wir für diejenigen ohne Augmentation ein VGG19-Netzwerk. Ich habe hier eine TensorFlow-Implementierung geschrieben, die auf dieser Implementierung basiert. Sobald Sie mein Repo geklont haben, können Sie den Datensatz von hier und vgg19.npy (für das Transferlernen verwendet) von hier abrufen. Sie können das Modell jetzt ausführen, um die Leistung zu überprüfen.

Ich würde jedoch zustimmen, dass das Schreiben von zusätzlichem Code für die Datenerweiterung in der Tat ein wenig mühsam ist. Um unser zweites Modell zu bauen, habe ich mich an Nanonets gewandt. Sie verwenden intern Transfer Learning und Data Augmentation, um mit minimalen Daten die besten Ergebnisse zu erzielen. Sie müssen lediglich die Daten auf ihre Website hochladen und warten, bis sie auf ihren Servern eingelernt wurden (normalerweise ca. 30 Minuten). Was weißt du, es ist perfekt für unser Vergleichsexperiment.

Nach Abschluss des Trainings können Sie Aufrufe an die API anfordern, um die Testgenauigkeit zu berechnen. Testen Sie mein Repo nach einem Beispielcode-Snippet (vergessen Sie nicht, die ID Ihres Modells in das Code-Snippet einzugeben).

Ergebnisse
VGG19 (keine Augmentation) - 76% Testgenauigkeit (höchste)
Nanonets (mit Augmentation) - 94,5% Testgenauigkeit

Beeindruckend, nicht wahr? Tatsache ist, dass die meisten Modelle mit mehr Daten eine gute Leistung erbringen. Um einen konkreten Beweis zu liefern, habe ich die folgende Tabelle erwähnt. Es zeigt die Fehlerrate gängiger neuronaler Netze in den Datensätzen Cifar 10 (C10) und Cifar 100 (C100). C10 + und C100 + Spalten sind die Fehlerraten mit Datenerweiterung.

Fehlerraten populärer neuronaler Netze in den Datensätzen Cifar 10 und Cifar 100. (Quelle: DenseNet)

Vielen Dank für das Lesen dieses Artikels! Wenn Sie das getan haben, klicken Sie auf diesen Klatschknopf! Ich hoffe, es gibt Aufschluss über die Datenerweiterung. Wenn Sie Fragen haben, können Sie mich über soziale Medien erreichen oder mir eine E-Mail senden (bharathrajn98@gmail.com).

Über Nanonets: Nanonets erstellt APIs, um Entwicklern das vertiefte Lernen zu vereinfachen. Besuchen Sie uns unter https://www.nanonets.com für mehr)