Conversione di un set di dati di classificazione delle immagini da utilizzare con Cloud TPU

TFRecord

TFRecord rendono la lettura di file di grandi dimensioni da Cloud Storage più efficiente rispetto alla lettura di ogni immagine come file individuale. Puoi utilizzare TFRecord ovunque utilizzi una pipeline tf.data.Dataset.

Per ulteriori informazioni sull'utilizzo di TFRecord, consulta i seguenti documenti di TensorFlow:

Se utilizzi il framework PyTorch o JAX e non utilizzi Cloud Storage per l'archiviazione del set di dati, potresti non ottenere lo stesso vantaggio dai TFRecord.

Panoramica delle conversioni

La cartella di classificazione delle immagini all'interno del repository del convertitore di dati su GitHub contiene lo script converter, image_classification_data.py e un'implementazione di esempio, simple_example.py, che puoi copiare e modificare per eseguire la conversione dei dati.

L'esempio del convertitore di dati di classificazione delle immagini definisce due classi, ImageClassificationConfig e ImageClassificationBuilder. Queste classi sono definite in tpu/tools/data_converter/image_classification_data.py.

ImageClassificationConfig è una classe base astratta. Puoi creare una sottoclasse di ImageClassificationConfig per definire la configurazione necessaria per creare un'istanza di ImageClassificationBuilder.

ImageClassificationBuilder è un generatore di set di dati TensorFlow per i set di dati di classificazione delle immagini. È una sottoclasse di tdfs.core.GeneratorBasedBuilder. Recupera gli esempi di dati dal set di dati e li converte in TFRecord. I TFRecord vengono scritti in un percorso specificato dal parametro data_dir del metodo __init__ di ImageClassificationBuilder.

In simple_example.py, SimpleDatasetConfig crea una sottoclasse di ImageClassificationConfig, implementando le proprietà che definiscono le modalità supportate, il numero di classi di immagini e un generatore di esempi che produce un dizionario contenente i dati delle immagini e una classe di immagini per ogni esempio nel set di dati.

La funzione main() crea un set di dati di dati di immagini generati in modo casuale e crea un'istanza di un oggetto SimpleDatasetConfig specificando il numero di classi e il percorso del set di dati sul disco. Successivamente, main() crea un'istanza di un oggetto ImageClassificationBuilder, passando l'istanza SimpleDatasetConfig. Infine, main() chiama download_and_prepare(). Quando viene chiamato questo metodo, l'istanza ImageClassificationBuilder utilizza il generatore di esempi di dati implementato da SimpleDatasetConfig per caricare ogni esempio e salvarlo in una serie di file TFRecord.

Per una spiegazione più dettagliata, consulta il notebook del convertitore di classificazione.

Modifica l'esempio di conversione dei dati per caricare il set di dati

Per convertire il set di dati nel formato TFRecord, crea una sottoclasse della classe ImageClassificationConfig definendo le seguenti proprietà:

  • num_labels: restituisce il numero di classi di immagini
  • supported_modes: restituisce un elenco di modalità supportate dal set di dati (ad esempio: test, addestramento e convalida)
  • text_label_map: restituisce un dizionario che modella il mapping tra un'etichetta di classe di testo e un'etichetta di classe intera (SimpleDatasetConfig non utilizza questa proprietà, perché non richiede un mapping)
  • download_path: il percorso da cui scaricare il set di dati (SimpleDatasetConfig non utilizza questa proprietà, il example_generator() carica i dati dal disco)

Implementa la funzione del generatore example_generator(). Questo metodo deve produrre un dizionario contenente i dati dell'immagine e il nome della classe dell'immagine per ogni esempio. ImageClassificationBuilder utilizza la funzione example_generator() per recuperare ogni esempio e scriverlo su disco in formato TFRecord.

Esegui l'esempio di conversione dei dati

  1. Crea un bucket Cloud Storage utilizzando il seguente comando:

    gcloud storage buckets create gs://BUCKET_NAME --project=PROJECT_ID --location=LOCATION

    Sostituisci quanto segue:

    • BUCKET_NAME: un nome per il bucket.
    • PROJECT_ID: il tuo ID progetto.
    • LOCATION: la località in cui verrà creato il bucket. Ad esempio, US-CENTRAL1.
  2. Crea una Cloud TPU utilizzando il gcloud compute instances create comando.

    $ gcloud compute instances create TPU_NAME \
        --machine-type=MACHINE_TYPE \
        --zone=ZONE \
        --image-family=IMAGE_FAMILY \
        --image-project=IMAGE_PROJECT \
        --maintenance-policy=TERMINATE

    Sostituisci quanto segue:

    • TPU_NAME: un nome per la TPU.
    • MACHINE_TYPE: il tipo di macchina da utilizzare per la VM TPU. Per ulteriori informazioni, consulta Tipi di macchine TPU.
    • ZONE: la zona in cui verrà creata la TPU.
    • IMAGE_FAMILY: la famiglia di immagini dell'immagine del sistema operativo che vuoi utilizzare. Verrà utilizzata l'immagine più recente non deprecata associata a questa famiglia. Per specificare un'immagine specifica, sostituisci il flag --image-family con il flag --image e imposta il relativo valore su un'immagine del sistema operativo supportata. Per un elenco dei sistemi operativi supportati, consulta Immagini del sistema operativo TPU.
    • IMAGE_PROJECT: l'ID progetto dell'immagine del sistema operativo. Per un elenco degli ID progetto associati a ogni immagine pubblica, consulta Immagini del sistema operativo TPU.
  3. Connettiti alla TPU tramite SSH:

    $ gcloud compute ssh TPU_NAME --zone=ZONE

    Quando ti connetti alla TPU, il prompt della shell cambia da username@projectname a username@vm-name.

  4. Installa i pacchetti richiesti.

    (vm)$ pip3 install opencv-python-headless pillow
    (vm)$ pip3 install tensorflow-datasets
  5. Crea le seguenti variabili di ambiente utilizzate dallo script.

    (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. Scarica il repository TensorFlow TPU.

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

Esegui il convertitore di dati su un set di dati fittizi

Lo script simple_example.py si trova nella cartella image_classification dell'esempio del convertitore di dati. L'esecuzione dello script con i seguenti parametri genera un insieme di immagini fittizie e le converte in TFRecord.

(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

Esegui il convertitore di dati su uno dei nostri set di dati non elaborati

  1. Crea una variabile di ambiente per la posizione dei dati non elaborati.

    (vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
  2. Esegui lo script simple_example.py.

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

Lo script simple_example.py accetta i seguenti parametri:

  • num_classes si riferisce al numero di classi nel set di dati. Qui utilizziamo 1000 per corrispondere al formato ImageNet.
  • generate determina se generare o meno i dati non elaborati.
  • data_path si riferisce al percorso in cui vengono generati i dati se generate=True o al percorso in cui sono archiviati i dati non elaborati se generate=False.
  • num_examples_per_class_low e num_examples_per_class_high determinano il numero di esempi da generare per classe. Lo script genera un numero casuale di esempi in questo intervallo.
  • save_dir si riferisce alla posizione in cui vengono salvati i TFRecord salvati. Per addestrare un modello su Cloud TPU, i dati devono essere archiviati su Cloud Storage. Può essere su Cloud Storage o sulla VM.

Rinomina e sposta i TFRecord in Cloud Storage

L'esempio seguente utilizza i dati convertiti con il modello ResNet.

  1. Rinomina i TFRecord nello stesso formato dei TFRecord ImageNet:

    (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. Copia i TFRecord in Cloud Storage:

    (vm)$ gcloud storage cp train* $GCS_CONVERTED
    (vm)$ gcloud storage cp validation* $GCS_CONVERTED

Libera spazio

  1. Disconnettiti da Cloud TPU, se non l'hai già fatto:

    (vm)$ exit

    Il tuo prompt dovrebbe ora essere user@projectname, a indicare che ti trovi in Cloud Shell.

  2. In Cloud Shell, esegui il gcloud compute instances delete comando per eliminare la VM TPU.

    $ gcloud compute instances delete TPU_NAME \
        --zone=ZONE
  3. Verifica che la VM sia stata eliminata eseguendo il gcloud compute instances list comando. L'eliminazione potrebbe richiedere alcuni minuti.

    $ gcloud compute instances list --zone=ZONE
  4. Elimina il bucket eseguendo il seguente comando, sostituendo BUCKET_NAME con il nome del bucket che hai creato per questo tutorial:

    $ gcloud storage rm gs://BUCKET_NAME --recursive