Convierte un conjunto de datos de clasificación de imágenes para usarlo con Cloud TPU

En este instructivo, se describe cómo usar la secuencia de comandos de ejemplo del convertidor de datos de clasificación de imágenes a fin de convertir un conjunto de datos sin procesar para la clasificación de imágenes en el formato TFRecord que usan los modelos de Tensorflow de Cloud TPU. El [repositorio de clasificación de imágenes](https://github.com/tensorflow/tpu/tree/master/tools/data_converter en github contiene la secuencia de comandos converter, image_classification_data.py y una implementación de muestra, simple_example.py, que puedes copiar y modificar para realizar tu propia conversión de datos.

El ejemplo del convertidor de datos de clasificación de imágenes define dos clases, ImageClassificationConfig y ImageClassificationBuilder. Estas clases se definen en tpu/tools/data_converter/image_classification_data.py.

ImageClassificationConfig es una clase básica abstracta. Subclasificas ImageClassificationConfig a fin de definir la configuración necesaria para crear una instancia de ImageClassificationBuilder.

ImageClassificationBuilder es un compilador de conjuntos de datos de Tensorflow para conjuntos de datos de clasificación de imágenes. Es una subclase de tdfs.core.GeneratorBasedBuilder. Recupera ejemplos de datos de tu conjunto de datos y los convierte en TFRecords. Los TFRecords se escriben en una ruta de acceso especificada por el parámetro data_dir en el método __init__ de ImageClassificationBuilder.

En simple_example.py, SimpleDatasetConfig subclasifica a ImageClassificationConfig, implementando propiedades que definen los modos admitidos, la cantidad de clases de imagen y un generador de ejemplos que produce un diccionario que contiene datos de imagen y una clase de imagen para cada ejemplo del conjunto de datos.

La función main() crea un conjunto de datos de datos de imagen generados aleatoriamente y crea una instancia de un objeto SimpleDatasetConfig que especifica la cantidad de clases y la ruta de acceso al conjunto de datos en el disco. A continuación, main() crea una instancia de un objeto ImageClassificationBuilder y pasa la instancia SimpleDatasetConfig. Por último, main() llama a download_and_prepare(). Cuando se llama a este método, la instancia ImageClassificationBuilder usa el generador de ejemplos de datos implementado por SimpleDatasetConfig para cargar cada ejemplo y los guarda en una serie de archivos TFRecord.

Para obtener una explicación más detallada, consulta Notebook del convertidor de clasificación.

Modifica la muestra de conversión de datos para cargar tu conjunto de datos

Para convertir tu conjunto de datos en formato TFRecord, crea una subclase de la clase ImageClassificationConfig que defina las siguientes propiedades:

  • num_labels - muestra la cantidad de clases de imágenes
  • support_modes: muestra una lista de modos compatibles con tu conjunto de datos (por ejemplo, probar, entrenar y validar).
  • text_label_map: muestra un diccionario que modela la asignación entre una etiqueta de clase de texto y una de clase de número entero (SimpleDatasetConfig no usa esta propiedad porque no requiere una asignación).
  • ruta_descarga: la ruta de acceso desde la que se descarga tu conjunto de datos (SimpleDatasetConfig no usa esta propiedad, ya que example_generator carga los datos desde el disco).

Implementa la función de generador example_generator. Este método debe generar un diccionario que contenga los datos de la imagen y el nombre de la clase de imagen de cada ejemplo. ImageClassificationBuilder usa la función example_generator() para recuperar cada ejemplo y escribirlos en el disco en formato TFRecord.

Cómo ejecutar la muestra de conversión de datos

  1. Crea un depósito de Cloud Storage con el siguiente comando:

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 -b on gs://bucket-name
    
  2. Crea la VM con el comando ctpu:

    ctpu up --vm-only \
      --zone=us-central1-b \
      --name=img-class-converter \
      --tf-version=2.2
    
    gcloud compute ssh img-class-converter --zone=us-central1-b 

    A partir de este momento, el prefijo (vm)$ indica que debes ejecutar el comando en la instancia de VM de Compute Engine.

  3. Instala los paquetes obligatorios.

    (vm)$ pip3 install opencv-python-headless pillow
    
  4. Crea las siguientes variables de entorno que usa la secuencia de comandos.

    (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. Cambia al directorio data_converter.

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

Ejecuta el convertidor de datos en un conjunto de datos falso

La secuencia de comandos simple_example.py se encuentra en la carpeta image_classification del ejemplo del convertidor de datos. Si ejecutas la secuencia de comandos con los siguientes parámetros, se genera un conjunto de imágenes falsas y las convierte en TFRecords.

(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

Ejecuta el convertidor de datos en uno de nuestros conjuntos de datos sin procesar

  1. Crea una variable de entorno para la ubicación de los datos sin procesar.

    (vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
    
  2. Ejecuta la secuencia de comandos simple_example.py:

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

La secuencia de comandos simple_example.py toma los siguientes parámetros:

  • num_classes hace referencia a la cantidad de clases en el conjunto de datos. Estamos usando 1,000 para coincidir con el formato de ImageNet
  • generate determina si se deben generar los datos sin procesar.
  • data_path se refiere a la ruta de acceso donde se deben generar los datos si generate=True o la ruta de acceso donde se almacenan los datos sin procesar si generate=False.
  • num_examples_per_class_low y num_examples_per_class_high determinan cuántos ejemplos generar por clase. La secuencia de comandos genera una cantidad aleatoria de ejemplos en este rango.
  • save_dir hace referencia a dónde se deben guardar los TFRecords guardados. Para entrenar un modelo en Cloud TPU, los datos se deben almacenar en Cloud Storage. Puede ser en Cloud Storage o en la VM.

Cambia el nombre y mueve los TFRecords a Cloud Storage

En el siguiente ejemplo, se usan los datos convertidos con el modelo ResNet TF 1.x.

  1. Cambia el nombre de los TFRecords al mismo formato que el de ImageNet TFRecords:

    (vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/
    (vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
  2. Copia los TFRecords a Cloud Storage:

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

Ejecuta ResNet en el conjunto de datos generado

  1. Crea la TPU:

    (vm)$ export TPU_NAME=imageclassificationconverter
    (vm)$ ctpu up --zone=us-central1-b 
    --tpu-only
    --tpu-size=v2-8
    --name=${TPU_NAME}

  2. Crea una variable de entorno para el directorio del depósito de almacenamiento que contiene el modelo.

    (vm)$ export MODEL_BUCKET=${STORAGE_BUCKET}/image_classification_converter
    
  3. Ejecuta el modelo

    (vm)$ cd /usr/share/tpu/models/official/resnet
    (vm)$ python3 resnet_main.py --tpu=${TPU_NAME} 
    --data_dir=${GCS_CONVERTED}
    --config_file=configs/cloud/v3-8.yaml
    --model_dir=${MODEL_BUCKET}
    --num_train_images=10000
    --num_eval_images=10000