RandAugment für die Bildklassifizierung mit Keras/TensorFlow PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

RandAugment für die Bildklassifizierung mit Keras/TensorFlow

Die Datenaugmentation dient seit langem dazu, einen „statischen“ Datensatz durch transformierte Varianten zu ersetzen und so die Invarianz von zu stärken Faltungsneurale Netze (CNNs), und führt normalerweise zu Robustheit gegenüber Eingaben.

Hinweis: Invarianz läuft darauf hinaus, Modelle beim Treffen von Entscheidungen für bestimmte Störungen blind zu machen. Ein Bild einer Katze ist immer noch ein Bild einer Katze, wenn Sie es spiegeln oder drehen.

Während die Datenerweiterung in der Form, die wir verwendet haben, codiert sie a Mangel des Wissens über translationale Varianz, die für Objekterkennung, semantische und Instanzsegmentierung usw. wichtig ist – die Invarianz es ist oft günstig für Klassifikationsmodelle, und daher wird Augmentation häufiger und aggressiver auf Klassifikationsmodelle angewendet.

Arten der Augmentation

Die Augmentation war anfangs sehr einfach – kleine Drehungen, horizontale und vertikale Flips, Kontrast- oder Helligkeitsschwankungen usw. In den letzten Jahren wurden ausgefeiltere Methoden entwickelt, darunter auch Ausgeschnitten (räumlicher Ausfall, der zufällig schwarze Quadrate in die Eingabebilder einfügt) und Verwechseln (Vertauschen von Bildteilen und Aktualisieren von Etikettenproportionen) und deren Kombination – CutMix. Die neueren Erweiterungsmethoden berücksichtigen tatsächlich Etiketten, und Methoden wie CutMix ändern die Etikettenproportionen so, dass sie den Proportionen des Bildes entsprechen, das von Teilen jeder Klasse eingenommen wird, die gemischt werden.

Mit einer wachsenden Liste möglicher Augmentationen haben einige begonnen, sie zufällig (oder zumindest eine Teilmenge davon) anzuwenden, mit der Idee, dass ein zufälliger Satz von Augmentationen die Robustheit von Modellen stärkt und den ursprünglichen Satz durch einen viel größeren ersetzt Raum der Eingabebilder. Das ist wo RandAugment tritt ein!

KerasCV und RandAugment

KerasCV ist ein separates Paket, aber immer noch eine offizielle Ergänzung zu Keras, die vom Keras-Team entwickelt wurde. Dies bedeutet, dass es die gleiche Politur und Intuitivität wie das Hauptpaket erhält, sich aber auch nahtlos in reguläre Keras-Modelle und deren Schichten integriert. Der einzige Unterschied, den Sie jemals bemerken werden, ist der Anruf keras_cv.layers... statt keras.layers....

KerasCV befindet sich zum Zeitpunkt des Schreibens noch in der Entwicklung und enthält bereits 27 neue Vorverarbeitungsschichten. RandAugment, CutMix und MixUp einige von ihnen zu sein. Schauen wir uns an, wie es aussieht, sich zu bewerben RandAugment zu Bildern und wie wir einen Klassifikator mit und ohne zufällige Augmentation trainieren können.

Zuerst installieren keras_cv:

$ pip install keras_cv

Hinweis: KerasCV benötigt TensorFlow 2.9, um zu funktionieren. Wenn Sie es noch nicht haben, führen Sie es aus $ pip install -U tensorflow zuerst.

Importieren wir nun TensorFlow, Keras und KerasCV zusammen mit den TensorFlow-Datensätzen für den einfachen Zugriff auf Imagenette:

import tensorflow as tf
from tensorflow import keras
import keras_cv
import tensorflow_datasets as tfds

Lassen Sie uns ein Bild laden und es in seiner ursprünglichen Form anzeigen:

import matplotlib.pyplot as plt
import cv2

cat_img = cv2.cvtColor(cv2.imread('cat.jpg'), cv2.COLOR_BGR2RGB)
cat_img = cv2.resize(cat_img, (224, 224))
plt.imshow(cat_img)

Jetzt bewerben wir uns RandAugment dazu mehrmals und schau dir die Ergebnisse an:

fig = plt.figure(figsize=(10,10))
for i in range(16):
    ax = fig.add_subplot(4,4,i+1)
    aug_img = keras_cv.layers.RandAugment(value_range=(0, 255))(cat_img)
    
    ax.imshow(aug_img.numpy().astype('int'))

RandAugment für die Bildklassifizierung mit Keras/TensorFlow PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Die Schicht hat a magnitude Argument, das standardmäßig ist 0.5 und kann geändert werden, um den Effekt der Augmentation zu erhöhen oder zu verringern:

fig = plt.figure(figsize=(10,10))
for i in range(16):
    ax = fig.add_subplot(4,4,i+1)
    aug_img = keras_cv.layers.RandAugment(value_range=(0, 255), magnitude=0.1)(cat_img)
    ax.imshow(aug_img.numpy().astype('int'))

Bei Einstellung auf einen niedrigen Wert wie z 0.1 – Sie werden eine viel weniger aggressive Augmentation sehen:

RandAugment für die Bildklassifizierung mit Keras/TensorFlow PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Da es sich um eine Ebene handelt, kann sie innerhalb von Modellen oder in verwendet werden tf.data Pipelines beim Erstellen von Datensätzen. Das macht RandAugment ziemlich flexibel! Weitere Argumente sind die augmentations_per_image und rate Argumente, die zusammenarbeiten.

Aussichten für 0...augmentations_per_image, fügt die Ebene der Pipeline eine zufällige Vorverarbeitungsebene hinzu, die auf ein Bild angewendet werden soll. Im Falle des Verzugs 3 – Der Pipeline werden drei verschiedene Operationen hinzugefügt. Dann wird eine Zufallszahl für jede Erweiterung in der Pipeline abgetastet – und wenn sie kleiner ist als rate (standardmäßig um 0.9) – die Augmentation wird angewendet.

Im Wesentlichen besteht eine Wahrscheinlichkeit von 90 %, dass jede (zufällige) Erweiterung in der Pipeline auf das Bild angewendet wird.

Sehen Sie sich unseren praxisnahen, praktischen Leitfaden zum Erlernen von Git an, mit Best Practices, branchenweit akzeptierten Standards und einem mitgelieferten Spickzettel. Hören Sie auf, Git-Befehle zu googeln und tatsächlich in Verbindung, um es!

Dies bedeutet natürlich, dass nicht alle Augmentationen angewendet werden müssen, insbesondere wenn Sie die senken rate. Sie können auch anpassen, welche Operationen durch a erlaubt sind RandomAugmentationPipeline Schicht, die RandAugment ist der Spezialfall von. Eine separate Anleitung auf RandomAugmentationPipeline wird in Kürze veröffentlicht.

Trainieren eines Classifiers mit und ohne RandAugment

Um den Aspekt der Datenvorbereitung/des Ladens zu vereinfachen und sich darauf zu konzentrieren RandAugment, verwenden wir tfds So laden Sie einen Teil von Imagenette:

(train, valid_set, test_set), info = tfds.load("imagenette", 
                                           split=["train[:70%]", "validation", "train[70%:]"],
                                           as_supervised=True, with_info=True)

class_names = info.features["label"].names
n_classes = info.features["label"].num_classes
print(f'Class names: {class_names}') 
print('Num of classes:', n_classes) 

print("Train set size:", len(train)) 
print("Test set size:", len(test_set)) 
print("Valid set size:", len(valid_set)) 

Wir haben nur einen Teil der Trainingsdaten geladen, um eine Überanpassung des Datensatzes in weniger Epochen zu erleichtern (was unser Experiment effektiv schneller laufen lässt). Da die Bilder in Imagenette unterschiedliche Größen haben, erstellen wir eine preprocess() Funktion, die ihre Größe ändert, um das Dataset zuzuordnen, sowie eine augment() Funktion, die Bilder in a erweitert tf.data.Dataset:

def preprocess(images, labels):
  return tf.image.resize(images, (224, 224)), tf.one_hot(labels, 10)
  
def augment(images, labels):
  inputs = {"images": images, "labels": labels}
  outputs = keras_cv.layers.RandAugment(value_range=(0, 255))(inputs)
  return outputs['images'], outputs['labels']

Jetzt – wir haben die Etiketten One-Hot kodiert. Wir mussten nicht unbedingt, aber für Augmentationen wie CutMix die Etiketten und ihre Proportionen manipulieren, müssen Sie. Da möchten Sie diese vielleicht auch anwenden RandAugment funktioniert wirklich gut mit ihnen, um robuste Klassifikatoren zu erstellen – lassen wir die One-Hot-Codierung drin. RandAugment nimmt genau aus diesem Grund ein Wörterbuch mit Bildern und Beschriftungen auf – einige Erweiterungen, die Sie hinzufügen können, ändern tatsächlich die Beschriftungen, daher sind sie obligatorisch. Sie können die erweiterten Bilder und Beschriftungen aus extrahieren outputs Wörterbuch leicht, daher ist dies ein zusätzlicher, aber einfacher Schritt, der während der Erweiterung durchgeführt werden muss.

Lassen Sie uns die vorhandenen Datensätze zuordnen, von denen zurückgegeben wird tfds an. Nach der Installation können Sie HEIC-Dateien mit der preprocess() Funktion, stapeln Sie sie und erweitern Sie nur den Trainingssatz:

valid_set = valid_set.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set = train.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set_aug = train.map(preprocess).map(augment_data, 
                                          num_parallel_calls=tf.data.AUTOTUNE).batch(32).prefetch(tf.data.AUTOTUNE)

Lassen Sie uns ein Netzwerk trainieren! keras_cv.models hat einige eingebaute Netzwerke, ähnlich wie keras.applications. Auch wenn die Liste noch kurz ist – sie wird sich mit der Zeit erweitern und übernehmen keras.applications. Die API ist sehr ähnlich, daher wird das Portieren von Code für die meisten Praktiker ziemlich einfach sein:


effnet = keras_cv.models.EfficientNetV2B0(include_rescaling=True, include_top=True, classes=10)
          
effnet.compile(
    loss='categorical_crossentropy',
    optimizer='adam',
    metrics=['accuracy']
)

history = effnet.fit(train_set, epochs=25, validation_data = valid_set)

Alternativ können Sie den Strom verwenden keras.applications:

effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)

effnet.compile(
  loss='categorical_crossentropy',
  optimizer='adam',
  metrics=['accuracy']
)

history1 = effnet.fit(train_set, epochs=50, validation_data=valid_set)

Dies führt zu einem Modell, das nicht wirklich gut abschneidet:

Epoch 1/50
208/208 [==============================] - 60s 238ms/step - loss: 2.7742 - accuracy: 0.2313 - val_loss: 3.2200 - val_accuracy: 0.3085
...
Epoch 50/50
208/208 [==============================] - 48s 229ms/step - loss: 0.0272 - accuracy: 0.9925 - val_loss: 2.0638 - val_accuracy: 0.6887

Lassen Sie uns nun dasselbe Netzwerk-Setup auf dem erweiterten Dataset trainieren. Jeder Stapel wird individuell erweitert, so dass, wann immer derselbe Stapel von Bildern (in der nächsten Epoche) auftaucht, sie unterschiedliche Erweiterungen haben:

effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)
effnet.compile(
  loss='categorical_crossentropy',
  optimizer='adam',
  metrics=['accuracy']
)

history2 = effnet.fit(train_set_aug, epochs=50, validation_data = valid_set)
Epoch 1/50
208/208 [==============================] - 141s 630ms/step - loss: 2.9966 - accuracy: 0.1314 - val_loss: 2.7398 - val_accuracy: 0.2395
...
Epoch 50/50
208/208 [==============================] - 125s 603ms/step - loss: 0.7313 - accuracy: 0.7583 - val_loss: 0.6101 - val_accuracy: 0.8143

Viel besser! Während Sie noch andere Erweiterungen anwenden möchten, wie z CutMix und MixUp, zusammen mit anderen Trainingstechniken, um die Genauigkeit des Netzwerks zu maximieren – einfach RandAugment erheblich geholfen und kann mit einer längeren Augmentationspipeline vergleichbar sein.

Wenn man die Trainingskurven vergleicht, ist darunter auch das Training und Validierungskurven – es wird nur deutlich, wie viel RandAugment hilft:

RandAugment für die Bildklassifizierung mit Keras/TensorFlow PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

In der nicht erweiterten Pipeline passt das Netzwerk über (die Trainingsgenauigkeit erreicht die Obergrenze) und die Validierungsgenauigkeit bleibt niedrig. In der erweiterten Pipeline wird die Trainingsgenauigkeit bleibt von Anfang bis Ende niedriger als die Validierungsgenauigkeit.

Bei einem höheren Trainingsverlust ist sich das Netzwerk der Fehler, die es immer noch macht, viel bewusster, und es können mehr Aktualisierungen vorgenommen werden, um es gegenüber den Transformationen unveränderlich zu machen. Ersteres sieht keinen Aktualisierungsbedarf, Letzteres dagegen und hebt die Potenzialgrenze an.

Zusammenfassung

KerasCV ist ein separates Paket, aber immer noch eine offizielle Ergänzung zu Keras, die vom Keras-Team entwickelt wurde und darauf abzielt, Ihren Keras-Projekten einen branchenstarken Lebenslauf zu verleihen. KerasCV befindet sich zum Zeitpunkt des Schreibens noch in der Entwicklung und enthält bereits 27 neue Vorverarbeitungsschichten. RandAugment, CutMix und MixUp einige von ihnen zu sein.

In dieser kurzen Anleitung haben wir uns angesehen, wie Sie es verwenden können RandAugment eine Reihe zufälliger Transformationen aus einer gegebenen Liste angewendeter Transformationen anzuwenden und wie einfach es ist, sie in jede Keras-Trainingspipeline aufzunehmen.

Weiter gehen – Praktisches Deep Learning für Computer Vision

Ihre neugierige Natur macht Lust auf mehr? Wir empfehlen Ihnen, sich unsere anzuschauen Kurs: „Praxisnahes Deep Learning für Computer Vision mit Python“.

RandAugment für die Bildklassifizierung mit Keras/TensorFlow PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Ein weiterer Computer Vision-Kurs?

Wir werden keine Klassifizierung von MNIST-Ziffern oder MNIST-Mode durchführen. Sie haben ihren Teil vor langer Zeit erfüllt. Zu viele Lernressourcen konzentrieren sich auf grundlegende Datensätze und grundlegende Architekturen, bevor fortgeschrittene Blackbox-Architekturen die Last der Leistung schultern.

Wir wollen uns konzentrieren Entmystifizierung, Praktikabilität, Verständnis, Intuition und echte Projekte. Möchte lernen wie du kannst einen Unterschied machen? Wir nehmen Sie mit auf eine Reise von der Art und Weise, wie unser Gehirn Bilder verarbeitet, über das Schreiben eines forschungstauglichen Deep-Learning-Klassifikators für Brustkrebs bis hin zu Deep-Learning-Netzwerken, die „halluzinieren“, Ihnen die Prinzipien und die Theorie durch praktische Arbeit beibringen und Sie mit dem ausstatten Know-how und Tools, um ein Experte für die Anwendung von Deep Learning zur Lösung von Computer Vision zu werden.

Was ist da drin?

  • Die ersten Prinzipien des Sehens und wie Computern das „Sehen“ beigebracht werden kann
  • Verschiedene Aufgaben und Anwendungen von Computer Vision
  • Das Handwerkszeug, das Ihnen die Arbeit erleichtert
  • Suchen, Erstellen und Verwenden von Datensätzen für Computer Vision
  • Die Theorie und Anwendung von Convolutional Neural Networks
  • Umgang mit Domänenverschiebung, Kookkurrenz und anderen Verzerrungen in Datensätzen
  • Übertragen Sie Lernen und nutzen Sie die Trainingszeit und Rechenressourcen anderer zu Ihrem Vorteil
  • Aufbau und Schulung eines hochmodernen Brustkrebsklassifikators
  • Wie man Mainstream-Ideen mit einer gesunden Portion Skepsis begegnet und die Auswirkungen weit verbreiteter Techniken versteht
  • Visualisierung des „Konzeptraums“ eines ConvNet mit t-SNE und PCA
  • Fallstudien darüber, wie Unternehmen Computer-Vision-Techniken einsetzen, um bessere Ergebnisse zu erzielen
  • Richtige Modellbewertung, Visualisierung des latenten Raums und Identifizierung der Aufmerksamkeit des Modells
  • Durchführen von Domänenrecherchen, Bearbeiten eigener Datensätze und Etablieren von Modelltests
  • Modernste Architekturen, die Weiterentwicklung von Ideen, was sie einzigartig macht und wie man sie umsetzt
  • KerasCV – eine WIP-Bibliothek zum Erstellen hochmoderner Pipelines und Modelle
  • Wie man Papiere parst, liest und selbst umsetzt
  • Modellauswahl je nach Anwendung
  • Erstellen einer End-to-End-Pipeline für maschinelles Lernen
  • Landschaft und Intuition zur Objekterkennung mit Faster R-CNNs, RetinaNets, SSDs und YOLO
  • Instanz- und semantische Segmentierung
  • Objekterkennung in Echtzeit mit YOLOv5
  • Training von YOLOv5-Objektdetektoren
  • Arbeiten mit Transformers unter Verwendung von KerasNLP (industriestarke WIP-Bibliothek)
  • Integrieren von Transformers in ConvNets zum Generieren von Bildunterschriften
  • DeepDream
  • Deep-Learning-Modelloptimierung für Computer Vision

Zeitstempel:

Mehr von Stapelmissbrauch