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 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 und nicht Cloud Storage verwenden für Ihren Dataset-Speicher haben, erhalten Sie mit TFRecords möglicherweise nicht denselben Vorteil.

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ührliche Erläuterung finden Sie in der Klassifizierungskonverter-Notebook.

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 Bildklassen 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 „text_class_label“ und ein ganzzahliges Klassenlabel (SimpleDatasetConfig verwendet dieses Attribut nicht, da Eine Zuordnung ist nicht erforderlich.)
  • download_path: Pfad, von dem das Dataset heruntergeladen werden soll (SimpleDatasetConfig verwendet dieses Attribut nicht, das Attribut 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:

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central2
  2. Starten Sie eine Cloud TPU mit dem Befehl gcloud.

    $ gcloud compute tpus tpu-vm create tpu-name \
        --zone=us-central2-b \
        --accelerator-type=v4-8 \
        --version=tpu-vm-tf-2.17.0-pjrt

    Beschreibung der Befehls-Flags

    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    accelerator-type
    Mit dem Beschleunigertyp geben Sie die Version und Größe der Cloud TPU an, die Sie erstellen möchten. Weitere Informationen zu den unterstützten Beschleunigertypen für jede TPU-Version finden Sie unter TPU-Versionen.
    version
    Die Cloud TPU-Softwareversion.
  3. Stellen Sie eine SSH-Verbindung zur TPU her:

    $ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b

    Wenn Sie eine Verbindung zur TPU herstellen, ändert sich die Shell-Eingabeaufforderung von username@projectname in username@vm-name.

  4. Erforderliche Pakete installieren

    (vm)$ pip3 install opencv-python-headless pillow
  5. 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"
  6. 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)$ gcloud storage cp train* $GCS_CONVERTED
    (vm)$ gcloud storage cp validation* $GCS_CONVERTED

Bereinigen

  1. Trennen Sie die Verbindung zur Cloud TPU, sofern noch nicht geschehen:

    (vm)$ exit

    Die Eingabeaufforderung sollte nun user@projectname lauten und angeben, dass Sie sich in Cloud Shell befinden.

  2. Führen Sie in Cloud Shell gcloud aus, um die VM-Ressource zu löschen.

    $ gcloud compute tpus tpu-vm delete tpu-name \
      --zone=us-central2-b
  3. Prüfen Sie, ob die VM gelöscht wurde. Führen Sie dazu gcloud compute tpus tpu-vm list aus. Der Löschvorgang kann einige Minuten dauern. Eine Antwort wie die folgende gibt an, dass Ihre Instanzen erfolgreich gelöscht wurden.

    $ gcloud compute tpus tpu-vm list --zone=us-central2-b
    Listed 0 items.
    
  4. Führen Sie die gcloud CLI wie gezeigt aus und ersetzen Sie bucket-name durch Name des Cloud Storage-Bucket, den Sie für diese Anleitung erstellt haben:

    $ gcloud storage rm gs://bucket-name --recursive