Bildklassifizierungs-Dataset zur Verwendung mit Cloud TPU konvertieren

In dieser Anleitung wird beschrieben, wie Sie mit dem Beispiel-Script zur Konvertierung von Bildklassifizierungsdaten ein Rohbildklassifizierungs-Dataset 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 Bild als einzelne Datei gelesen wird. Sie können TFRecord überall dort verwenden, wo Sie eine tf.data.Dataset-Pipeline nutzen.

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

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

Conversion-Übersicht

Der Bildklassifizierungsordner im Datenkonverterrepository auf GitHub enthält das converter-Script image_classification_data.py und die Beispielimplementierung simple_example.py, die Sie kopieren und für Ihre eigene Datenkonvertierung anpassen können.

Im Beispiel zur Konvertierung von Bildklassifizierungsdaten sind zwei Klassen definiert: ImageClassificationConfig und ImageClassificationBuilder. Diese Klassen sind in tpu/tools/data_converter/image_classification_data.py definiert.

ImageClassificationConfig ist eine abstrakte Basisklasse. Sie erstellen eine abgeleitete Klasse von ImageClassificationConfig, 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 der Methode __init__ von ImageClassificationBuilder angegeben wird.

In simple_example.py, erstellt SimpleDatasetConfig eine abgeleitete Klasse von ImageClassificationConfig. Dabei werden Eigenschaften implementiert, die die unterstützten Modi, die Anzahl der Bildklassen und einen Beispielgenerator definieren, der ein Wörterbuch mit Bilddaten und eine Bildklasse für jedes Beispiel im Dataset erstellt.

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 dem Laufwerk angibt. Als Nächstes instanziiert main() ein ImageClassificationBuilder-Objekt und übergibt die SimpleDatasetConfig-Instanz. Schließlich ruft main() die Methode download_and_prepare() auf. Wenn diese Methode aufgerufen wird, verwendet die ImageClassificationBuilder-Instanz den von SimpleDatasetConfig implementierten Generator für Beispieldaten, 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.

Datenkonvertierungsbeispiel ändern, um das Dataset zu laden

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

  • 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 Textklassenlabel und einem Ganzzahlklassenlabel modelliert. SimpleDatasetConfig verwendet diese Eigenschaft nicht, da es keine Zuordnung erfordert.
  • download_path: der Pfad, von dem Ihr Dataset heruntergeladen werden soll (SimpleDatasetConfig verwendet diese Eigenschaft nicht; example_generator lädt die Daten vom Laufwerk)

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

Datenkonvertierungsbeispiel ausführen

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

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

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

    Beschreibung der Befehls-Flags

    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten
    accelerator-type
    Der Beschleunigertyp gibt die Version und Größe der Cloud TPU an, die Sie erstellen möchten. Weitere Informationen zu den unterstützten Beschleunigertypen für die einzelnen TPU-Versionen 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. Installieren Sie die erforderlichen Pakete:

    (vm)$ pip3 install opencv-python-headless pillow
    (vm)$ pip3 install tensorflow-datasets
  5. Erstellen Sie die folgenden vom Script 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. Laden Sie das TensorFlow-TPU-Repository herunter:

    (vm)$ cd /usr/share/
    (vm)$ git clone https://github.com/tensorflow/tpu.git
    (vm)$ cd tpu/tools/data_converter

Datenkonverter für ein künstlich erzeugtes Dataset ausführen

Das Script simple_example.py befindet sich im Ordner image_classification des Beispiels zur Datenkonvertierung. Wenn Sie das Script mit den folgenden Parametern ausführen, wird künstlich ein Satz von Bildern erzeugt 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 der Roh-Datasets 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 Script simple_example.py aus:

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

Im Script simple_example.py werden die folgenden Parameter verwendet:

  • num_classes bezieht sich auf die Anzahl der Klassen im Dataset. Wir verwenden hier 1000, um dem ImageNet-Format zu entsprechen.
  • generate gibt an, 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 geben an, wie viele Beispiele pro Klasse generiert werden sollen. Das Script generiert eine zufällige Anzahl von Beispielen in diesem Bereich.
  • save_dir bezieht sich darauf, wo TFRecords gespeichert werden. 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 umgewandelten 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 update
    (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 Ihrer 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 zeigt, 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 den Namen des Cloud Storage-Buckets, den Sie für diese Anleitung erstellt haben:

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