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

Questo tutorial descrive come utilizzare lo script di esempio del convertitore di dati di classificazione delle immagini per convertire un set di dati di classificazione delle immagini non elaborato nel formato TFRecord utilizzato per addestrare i modelli Cloud TPU.

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

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 dei set di dati, potresti non ottenere lo stesso vantaggio da TFRecords.

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 tuoi dati.

Il Sample 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. Sottoclassifica ImageClassificationConfig per definire la configurazione necessaria per creare un'istanza di ImageClassificationBuilder.

ImageClassificationBuilder è un strumento per la creazione 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 al metodo __init__ di ImageClassificationBuilder.

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

La funzione main() crea un set di dati di immagini generate in modo casuale e istanzia un oggetto SimpleDatasetConfig che specifica il numero di classi e il percorso del set di dati su disco. Successivamente, main() esegue l'inizializzazione 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 salvarli in una serie di file TFRecord.

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

Modificare il campione di conversione dei dati per caricare il set di dati

Per convertire il set di dati in formato TFRecord, sottoclassifica la 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 es. test, addestramento e convalida)
  • text_label_map: restituisce un dizionario che modella la mappatura tra un'etichetta di classe di testo e un'etichetta di classe di numero intero (SimpleDatasetConfig non utilizza questa proprietà perché non richiede una mappatura)
  • download_path: il percorso da cui scaricare il set di dati (SimpleDatasetConfig non utilizza questa proprietà, example_generator carica i dati dal disco)

Implementa la funzione di generatore example_generator. Questo metodo deve restituire 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 scriverli su disco in formato TFRecord.

Eseguire 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=us-central2
  2. Avvia una Cloud TPU utilizzando il comando gcloud.

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

    Descrizioni dei flag dei comandi

    zone
    La zona in cui prevedi di creare la Cloud TPU.
    accelerator-type
    Il tipo di acceleratore specifica la versione e le dimensioni della Cloud TPU che vuoi creare. Per ulteriori informazioni sui tipi di acceleratori supportati per ogni versione di TPU, consulta Versioni TPU.
    version
    La versione software di Cloud TPU.
  3. Connettiti alla TPU tramite SSH:

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

    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
  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. Passa alla directory data_converter.

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

Eseguire il convertitore di dati su un set di dati falso

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 false 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

Eseguire 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 adattarci al formato ImageNet.
  • generate determina se generare o meno i dati non elaborati.
  • data_path fa riferimento al percorso in cui vengono generati i dati se generate=True o al percorso in cui vengono archiviati i dati non elaborati se generate=False.
  • num_examples_per_class_low e num_examples_per_class_high determinano quanti esempi per classe generare. Lo script genera un numero random di esempi in questo intervallo.
  • save_dir fa riferimento alla posizione in cui vengono salvati i TFRecord. Per addestrare un modello su Cloud TPU, i dati devono essere archiviati in 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 di ImageNet:

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

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

Esegui la pulizia

  1. Se non l'hai già fatto, scollega la Cloud TPU:

    (vm)$ exit

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

  2. In Cloud Shell, esegui gcloud per eliminare la risorsa VM.

    $ gcloud compute tpus tpu-vm delete tpu-name \
      --zone=us-central2-b
  3. Verifica che la VM sia stata eliminata eseguendo gcloud compute tpus tpu-vm list. L'eliminazione potrebbe richiedere alcuni minuti. Una risposta simile alla seguente indica che le istanze sono state eliminate correttamente.

    $ gcloud compute tpus tpu-vm list --zone=us-central2-b
    Listed 0 items.
    
  4. Esegui gcloud CLI come mostrato, sostituendo bucket-name con il nome del bucket Cloud Storage creato per questo tutorial:

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