Konvertieren eines Bildklassifizierungs-Datasets zur Verwendung mit Cloud TPU


In dieser Anleitung wird beschrieben, wie Sie mit dem Skript Beispiel für die Konvertierung von Bildklassifizierungsdaten ein Rohformat zur Klassifizierung von Bildern in das TFRecord-Format konvertieren, das zum Trainieren von Cloud TPU-Modellen verwendet wird.

Mithilfe von TFRecords können große Dateien aus Google Cloud Storage effizienter gelesen werden, als wenn jedes Image als einzelne Datei gelesen wird. Sie können TFRecord überall dort verwenden, wo Sie eine tf.data.Dataset-Pipeline verwenden.

Weitere Informationen zur Verwendung von TFRecord finden Sie in den folgenden TensorFlow-Dokumenten:

Wenn Sie das PyTorch- oder JAX-Framework verwenden und keinen Google Cloud-Speicher für Ihren Dataset-Speicher verwenden, erhalten Sie möglicherweise nicht den gleichen Vorteil von TFRecords.

Konvertierung – Übersicht

Der Bildklassifizierungsordner im Datenkonverter-Repository auf GitHub enthält das Skript converter, image_classification_data.py und die Beispielimplementierung simple_example.py, die Sie kopieren und in Ihre eigene Datenkonvertierung anpassen können.

Das Beispiel für die Bildklassifikationsdaten-Konvertierung definiert zwei Klassen, ImageClassificationConfig und ImageClassificationBuilder. Diese Klassen sind in tpu/tools/data_converter/image_classification_data.py definiert.

ImageClassificationConfig ist eine einfache Basisklasse. Sie leiten die Unterklasse ImageClassificationConfig ab, um die Konfiguration zu definieren, die zum Instanziieren von ImageClassificationBuilder erforderlich ist.

ImageClassificationBuilder ist ein TensorFlow-Dataset-Builder für Bildklassifizierungs-Datasets. Es ist eine abgeleitete Klasse von tdfs.core.GeneratorBasedBuilder. Es ruft Beispieldaten aus Ihrem Dataset ab und konvertiert sie in TFRecords. Die TFRecords werden in einen Pfad geschrieben, der durch den Parameter data_dir zur Methode __init__ von ImageClassificationBuilder angegeben wird.

In simple_example.py , SimpleDatasetConfig erstellt eine Unterklasse von ImageClassificationConfig, Implementieren von Eigenschaften, die die unterstützten Modi definieren, implementieren Anzahl von Bildklassen und ein Beispielgenerator, der ein Wörterbuch mit Bilddaten und eine Bildklasse für jedes Beispiel im Dataset hervorbringt.

Die Funktion main() erstellt ein Dataset mit zufällig generierten Bilddaten und instanziiert ein SimpleDatasetConfig - Objekt, das die Anzahl der Klassen und den Pfad zum Dataset auf der Festplatte angibt. Als Nächstes instanziiert main() ein Objekt ImageClassificationBuilder und übergibt die Instanz SimpleDatasetConfig. Schließlich ruft main() download_and_prepare() auf. Wenn diese Methode aufgerufen wird, verwendet die ImageClassificationBuilder -Instanz den von SimpleDatasetConfig implementierten Beispielgenerator für Daten, um jedes Beispiel zu laden und in einer Reihe von TFRecord-Dateien zu speichern.

Eine ausführlichere Erläuterung finden Sie im Classification Converter Notebook.

Hinweise

Datenkonvertierungsbeispiel ändern, um das Dataset zu laden

Um Ihr Dataset in das TFRecord-Format zu konvertieren, erstellen Sie eine Unterklasse der Klasse ImageClassificationConfig, die die folgenden Eigenschaften definiert:

  • num_labels: Gibt die Anzahl der Image-Klassen zurück
  • supported_modes: Gibt eine Liste der Modi zurück, die von Ihrem Dataset unterstützt werden (z. B. testen, trainieren und validieren)
  • text_label_map: Gibt ein Wörterbuch zurück, das die Zuordnung zwischen einem Textklassenlabel und einem Ganzzahlklassenlabel modelliert. SimpleDatasetConfig verwendet diese Eigenschaft nicht, da keine Zuordnung erforderlich ist.
  • Download-Pfad - der Pfad, von dem Ihr Dataset heruntergeladen werden soll (SimpleDatasetConfig verwendet diese Eigenschaft nicht, example_generator lädt die Daten von der Festplatte)

Implementieren Sie die example_generator-Generatorfunktion. Diese Methode muss ein Wörterbuch mit den Bilddaten und dem Namen der Bildklasse für jedes Beispiel liefern. ImageClassificationBuilder verwendet die Funktion example_generator(), um jedes Beispiel abzurufen und im TFRecord-Format auf die Festplatte zu schreiben.

Das Daten-konvertierungs-Beispiel wird ausgeführt

  1. Erstellen Sie mit dem folgenden Befehl einen Cloud Storage-Bucket:

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 gs://bucket-name
    
  2. Starten Sie mit dem Befehl gcloud eine Compute Engine-VM.

    $ gcloud compute tpus execution-groups create \
     --vm-only \
     --zone=us-central1-b \
     --name=imageclassificationconverter \
     --tf-version=2.5.0
    
    gcloud compute ssh imageclassificationconverter --zone=us-central1-b 

    Ab jetzt bedeutet das Präfix (vm)$, dass Sie den Befehl auf der Compute Engine-VM-Instanz ausführen sollten.

  3. Erforderliche Pakete installieren

    (vm)$ pip3 install opencv-python-headless pillow
    
  4. Erstellen Sie die folgenden vom Skript verwendeten Umgebungsvariablen.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export CONVERTED_DIR=$HOME/tfrecords
    (vm)$ export GENERATED_DATA=$HOME/data
    (vm)$ export GCS_CONVERTED=$STORAGE_BUCKET/data_converter/image_classification/tfrecords
    (vm)$ export GCS_RAW=$STORAGE_BUCKET/image_classification/raw
    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  5. Wechseln Sie zum Verzeichnis data_converter.

    (vm)$ cd /usr/share/tpu/tools/data_converter
    

Datenkonverter für ein künstliches Dataset ausführen

Das Skript simple_example.py befindet sich im Ordner image_classification des Datenkonverter-Beispiels. Wenn Sie das Skript mit den folgenden Parametern ausführen, wird ein Satz gefälschter Bilder generiert und in TFRecords konvertiert.

(vm)$ python3 image_classification/simple_example.py \
  --num_classes=1000 \
  --data_path=$GENERATED_DATA \
  --generate=True \
  --num_examples_per_class_low=10 \
  --num_examples_per_class_high=11 \
  --save_dir=$CONVERTED_DIR

Datenkonverter für eines unserer Rohdatasets ausführen

  1. Erstellen Sie eine Umgebungsvariable für den Speicherort der Rohdaten.

    (vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
    
  2. Führen Sie das Skriptsimple_example.py aus:

    (vm)$ python3 image_classification/simple_example.py \
    --num_classes=1000 \
    --data_path=$GCS_RAW \
    --generate=False \
    --save_dir=$CONVERTED_DIR
    

Das Skript simple_example.py verwendet die folgenden Parameter:

  • num_classes bezieht sich auf die Anzahl der Klassen im Dataset. Wir verwenden hier 1000, um dem ImageNet-Format zu entsprechen.
  • generate bestimmt, ob die Rohdaten generiert werden sollen.
  • data_path bezieht sich auf den Pfad, in dem die Daten generiert werden, wenn generate=True, oder den Pfad, in dem die Rohdaten gespeichert werden, wenn generate=False.
  • num_examples_per_class_low und num_examples_per_class_high bestimmen, wie viele Beispiele pro Klasse generiert werden sollen. Das Skript generiert eine zufällige Anzahl von Beispielen in diesem Bereich.
  • save_dir bezieht sich darauf, wo TFRecords gespeichert sind. Zum Trainieren eines Modells in Cloud TPU müssen die Daten in Cloud Storage gespeichert werden. Dies kann in Cloud Storage oder auf der VM geschehen.

TFRecords umbenennen und in Cloud Storage verschieben

Im folgenden Beispiel werden die konvertierten Daten mit dem ResNet-Modell verwendet.

  1. Benennen Sie die TFRecords in dasselbe Format wie ImageNet TFRecords um:

    (vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/
    (vm)$ sudo apt install rename
    
    (vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
  2. Kopieren Sie die TFRecords in Cloud Storage:

    (vm)$ gsutil -m cp train* $GCS_CONVERTED
    (vm)$ gsutil -m cp validation* $GCS_CONVERTED