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 di immagini non elaborate nel formato TFRecord utilizzato per addestrare i modelli di Cloud TPU.

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

Consulta i seguenti documenti su TensorFlow per ulteriori informazioni sull'utilizzo di TFRecord:

Se utilizzi il framework PyTorch o JAX e non utilizzi lo spazio di archiviazione di Google Cloud per l'archiviazione del 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 realizzare la tua 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 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 di immagini. È una sottoclasse di tdfs.core.GeneratorBasedBuilder. Recupera esempi di dati dal tuo set di dati e li converte in TFRecord. I TFRecord vengono scritti in un percorso specificato dal parametro data_dir nel metodo __init__ di ImageClassificationBuilder.

In simple_example.py, SimpleDatasetConfig sottoclassi ImageClassificationConfig, con l'implementazione di proprietà che definiscono le modalità supportate, il numero di classi delle immagini e un generatore di esempi che restituisce un dizionario contenente dati immagine e una classe image per ogni esempio nel set di dati.

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

Per una spiegazione più dettagliata, consulta il blocco note della conversione di classificazione.

Prima di iniziare

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

Per convertire il set di dati in formato TFRecord, sottoclasse la classe ImageClassificationConfig che definisce le seguenti proprietà:

  • num_labels: restituisce il numero di classi di immagini
  • modalità_supportata: restituisce un elenco di modalità supportate dal set di dati (ad esempio: 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 intera (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à, il generatore example_generator carica i dati dal disco)

Implementa la funzione example_generator generator. Questo metodo deve restituire un dizionario contenente i dati dell'immagine e il nome della classe delle immagini per ogni esempio. ImageClassificationBuilder utilizza la funzione example_generator() per recuperare ogni esempio e li scrive su disco nel formato TFRecord.

Esecuzione dell'esempio di conversione dei dati

  1. Crea un bucket Cloud Storage utilizzando questo comando:

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 gs://bucket-name
    
  2. Avvia una VM di Compute Engine utilizzando il comando gcloud.

    $ 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 

    Da questo momento in poi, il prefisso (vm)$ indica che devi eseguire il comando sull'istanza VM di Compute Engine.

  3. Installa i pacchetti richiesti.

    (vm)$ pip3 install opencv-python-headless pillow
    
  4. 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"
    
  5. Passa alla directory data_converter.

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

Esecuzione del 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

Esecuzione del convertitore di dati su uno dei nostri set di dati non elaborati

  1. Crea una variabile di ambiente per la località 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 stiamo utilizzando 1000 per il 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 vengono 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 in Cloud Storage. Questa operazione può essere eseguita su Cloud Storage o sulla VM.

Ridenominazione e spostamento dei 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 install rename
    
    (vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
  2. Copia i TFRecord in Cloud Storage:

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