Entrena con el algoritmo integrado de reconocimiento de objetos en imágenes

El entrenamiento mediante algoritmos integrados en AI Platform Training te permite enviar el conjunto de datos y entrenar un modelo sin escribir ningún código de entrenamiento. En esta página, se explica cómo funciona el algoritmo integrado de reconocimiento de objetos en imágenes y cómo usarlo.

Descripción general

El algoritmo integrado de reconocimiento de objetos en imágenes usa tus conjuntos de datos de entrenamiento y validación para entrenar modelos de forma continua y, luego, da como resultado el modelo guardado más preciso que se generó durante el trabajo de entrenamiento. También puedes usar el ajuste de hiperparámetros para lograr la máxima exactitud en el modelo. El modelo guardado que se exportó se puede usar directamente en la predicción, ya sea de forma local o mediante su implementación en AI Platform Prediction para el servicio de producción.

Limitaciones

Los algoritmos integrados de imagen admiten el entrenamiento con CPU, GPU o TPU únicas. El modelo guardado resultante es compatible con la deriva en CPU y GPU.

Las siguientes funciones no son compatibles con el entrenamiento por medio del algoritmo integrado de reconocimiento de objetos en imágenes:

Tipos de máquina admitidos

Se admiten los siguientes niveles de escala y tipos de máquinas de AI Platform Training:

Autoriza a Cloud TPU para que tenga acceso al proyecto

Sigue estos pasos a fin de autorizar el nombre de la cuenta de servicio de Cloud TPU asociado a tu proyecto de Google Cloud:

  1. Llama a projects.getConfig para obtener el nombre de la cuenta de servicio de Cloud TPU. Ejemplo:

    PROJECT_ID=PROJECT_ID
    
    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
        https://ml.googleapis.com/v1/projects/$PROJECT_ID:getConfig
    
  2. Guarda el valor del campo serviceAccountProject y tpuServiceAccount que muestra la API.

  3. Inicializa la cuenta de servicio de Cloud TPU:

    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
      -H "Content-Type: application/json" -d '{}'  \
      https://serviceusage.googleapis.com/v1beta1/projects/<serviceAccountProject>/services/tpu.googleapis.com:generateServiceIdentity
    

A continuación, agrega la cuenta de servicio de Cloud TPU como miembro del proyecto con la función de agente de servicios de Cloud ML. Completa los siguientes pasos en Google Cloud Console o usa el comando de gcloud:

Console

  1. Accede a Google Cloud Console y elige el proyecto en el que usas la TPU.
  2. Elige IAM y administración > IAM.
  3. Haz clic en el botón Agregar para agregar un miembro al proyecto.
  4. Ingresa la cuenta de servicio de la TPU en el cuadro de texto Miembros.
  5. Haz clic en la lista desplegable Funciones.
  6. Habilita la función Agente de servicios de Cloud ML (Administración de servicios > Agente de servicios de Cloud ML).

gcloud

  1. Configura las variables de entorno que contengan el ID del proyecto y la cuenta de servicio de Cloud TPU:

    PROJECT_ID=PROJECT_ID
    SVC_ACCOUNT=your-tpu-sa-123@your-tpu-sa.google.com.iam.gserviceaccount.com
    
  2. Otorga la función ml.serviceAgent a la cuenta de servicio de Cloud TPU:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member serviceAccount:$SVC_ACCOUNT --role roles/ml.serviceAgent
    

Si quieres obtener más detalles para otorgar funciones a las cuentas de servicio, consulta la documentación de IAM.

Da formato a los datos de entrada para el entrenamiento

El algoritmo integrado de reconocimiento de objetos en imágenes requiere que los datos de entrada tengan el formato tf.Examples y se guarden en archivos TFRecord. La estructura de datos tf.Example y el formato de archivo TFRecord están diseñados para la lectura eficiente de datos con TensorFlow.

El formato TFRecord es un formato simple para almacenar una secuencia de registros binarios. En este caso, todos los registros contienen representaciones binarias de imágenes. Cada imagen, junto con sus etiquetas de clase, se representa como tf.Example. Puedes guardar muchos tf.Example en un solo archivo TFRecord. También puedes fragmentar un conjunto de datos grande entre varios archivos TFRecord.

Obtén más información sobre TFRecord y tf.Example.

Convierte tus imágenes a TFRecords

TensorFlow proporciona una secuencia de comandos que puedes usar para convertir las imágenes de formato JPEG a TFRecord.

Puedes usar la secuencia de comandos si se cumplen estas condiciones:

  • Almacenas las imágenes en Cloud Storage.
  • Tienes archivos CSV con las rutas de acceso a las imágenes en Cloud Storage y sus etiquetas correspondientes. Por ejemplo:

    gs://cloud-ml-data/img/flower_photos/daisy/754296579_30a9ae018c_n.jpg,daisy
    gs://cloud-ml-data/img/flower_photos/dandelion/18089878729_907ed2c7cd_m.jpg,dandelion
    
  • Almacenas estos archivos CSV en Cloud Storage.

En el siguiente ejemplo, se muestra cómo ejecutar la secuencia de comandos:

  1. Descarga la secuencia de comandos:

    curl https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/jpeg_to_tf_record.py > ./jpeg_to_tf_record.py
    
  2. Establece las variables para el ID del proyecto y el nombre del bucket, si aún no lo hiciste:

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
  3. Crea una lista de todas las etiquetas posibles para el conjunto de datos en un archivo temporal:

    cat << EOF > /tmp/labels.txt
    daisy
    dandelion
    roses
    sunflowers
    tulips
    EOF
    
  4. Ejecuta la secuencia de comandos con los datos de flores del depósito cloud-ml-data público y la lista de etiquetas:

    python -m jpeg_to_tf_record.py \
           --train_csv gs://cloud-ml-data/img/flower_photos/train_set.csv \
           --validation_csv gs://cloud-ml-data/img/flower_photos/eval_set.csv \
           --labels_file /tmp/labels.txt \
           --project_id $PROJECT_ID \
           --output_dir gs://$BUCKET_NAME/flowers_as_tf_record
    

Verifica los permisos del bucket de Cloud Storage

A fin de almacenar tus datos, usa un bucket de Cloud Storage en el mismo proyecto de Google Cloud que usas para ejecutar trabajos de AI Platform Training. De lo contrario, otorga acceso a AI Platform Training al depósito de Cloud Storage en el que se almacenan tus datos.

Formato de entrada requerido

Para entrenar con el algoritmo integrado de reconocimiento de objetos en imágenes, los datos de imagen deben estructurarse como tf.Example que incluyan los siguientes campos:

  • image/encoded es la imagen sin procesar codificada como una string.

  • image/object/class/label es una lista de etiquetas de números enteros para la imagen correspondiente (una etiqueta por cuadro).

    El conjunto de etiquetas de números enteros que se usa para tu conjunto de datos debe ser una secuencia consecutiva que comience en 1. Por ejemplo, si tu conjunto de datos tiene cinco clases, cada etiqueta debe ser un número entero en el intervalo [1, 5].

  • image/object/bbox/xmin es una lista de coordenadas normalizadas del eje x del lado izquierdo para la imagen correspondiente (una coordenada por cuadro). Cada coordenada debe estar en el intervalo [0, 1].

  • image/object/bbox/xmax es una lista de coordenadas normalizadas del eje x del lado derecho para la imagen correspondiente (una coordenada por cuadro). Cada coordenada debe estar en el intervalo [0, 1].

  • image/object/bbox/ymin es una lista de coordenadas normalizadas del eje x de la parte superior para la imagen correspondiente (una coordenada por cuadro). Cada coordenada debe estar en el intervalo [0, 1].

  • image/object/bbox/ymax es una lista de coordenadas normalizadas del eje x de la parte inferior para la imagen correspondiente (una coordenada por cuadro). Cada coordenada debe estar en el intervalo [0, 1].

En el siguiente ejemplo, se muestra la estructura de un tf.Example para una imagen que contiene dos cuadros de límite. El primer cuadro tiene la etiqueta 1, su esquina superior izquierda está en las coordenadas normalizadas (0.1, 0.4) y su esquina inferior derecha está en las coordenadas normalizadas (0.5, 0.8). El segundo cuadro tiene la etiqueta 2, la esquina superior izquierda está en las coordenadas normalizadas (0.3, 0.5) y la esquina inferior derecha está en las coordenadas normalizadas (0.4, 0.7).

{
    'image/encoded': '<encoded image data>',
    'image/object/class/label': [1, 2],
    'image/object/bbox/xmin': [0.1, 0.3],
    'image/object/bbox/xmax': [0.5, 0.4],
    'image/object/bbox/ymin': [0.4, 0.5],
    'image/object/bbox/ymax': [0.8, 0.7]
}

Este formato tf.Example sigue el mismo que se usa en la secuencia de comandos de reconocimiento de objetos TFRecord.

Obtén el mejor modelo guardado como resultado

Cuando finaliza el trabajo de entrenamiento, AI Platform Training escribe un modelo guardado de TensorFlow en el depósito de Cloud Storage que especificaste como jobDir cuando enviaste el trabajo. El modelo guardado se escribe en jobDir/model. Por ejemplo, si envías el trabajo a gs://your-bucket-name/your-job-dir, AI Platform Training escribe el modelo guardado en gs://your-bucket-name/your-job-dir/model.

Si habilitaste el ajuste de hiperparámetros, AI Platform Training muestra el modelo guardado de TensorFlow con la mayor exactitud que se obtuvo durante el proceso de entrenamiento. Por ejemplo, si enviaste un trabajo de entrenamiento con 2,500 pasos de entrenamiento y la mayor exactitud se produjo a los 2,000 pasos, se obtiene un modelo guardado de TensorFlow de ese punto en particular.

Cada prueba de AI Platform Training escribe el modelo guardado de TensorFlow con la mayor exactitud en su propio directorio dentro del bucket de Cloud Storage. Por ejemplo, gs://your-bucket-name/your-job-dir/model/trial_{trial_id}.

La firma del resultado del modelo guardado es la siguiente:

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['encoded_image'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: encoded_image_string_tensor:0
    inputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: key:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['detection_boxes'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100, 4)
        name: detection_boxes:0
    outputs['detection_classes'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100)
        name: detection_classes:0
    outputs['detection_scores'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100)
        name: detection_scores:0
    outputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Identity:0
    outputs['num_detections'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1)
        name: num_detections:0
  Method name is: tensorflow/serving/predict

Datos de entrada:

  • encoded_image: Son los bytes de imagen sin formato (no decodificados). Equivale a image/encoded almacenado en tf.Example.
  • key: Es el identificador de valor de la string del resultado de la predicción. Este valor se envía a la key del resultado. En la predicción por lotes, esto ayuda a vincular el resultado de la predicción con la entrada.

Resultados:

  • num_detections: Es la cantidad de cuadros de límite detectados.
  • detection_boxes: Es una lista de coordenadas ([ymin, xmin, ymax, xmax]) relativas (valor en [0,1]) de los cuadros de límite de detección.
  • detection_classes: Es una lista de etiquetas de clase previstas (números enteros) para cada cuadro de detección en detection_boxes.
  • detection_scores: Es una lista de scores para cada cuadro de detección en detection_boxes.
  • key: Es la clave del resultado.

El siguiente es un ejemplo de resultados de predicción:

{u'detection_classes': [1.0, 3.0, 3.0, ...],
u'key': u'test_key',
u'num_detections': 100.0,
u'detection_scores': [0.24401935935020447, 0.19375669956207275, 0.18359294533729553, ...]]}

Configuración de ejemplo

Si envías un trabajo mediante gcloud, debes crear un archivo config.yaml para las especificaciones de ajuste de hiperparámetros y tipo de máquina. Si usas Google Cloud Console, no es necesario que crees este archivo. Obtén información sobre cómo enviar un trabajo de entrenamiento.

En el siguiente archivo config.yaml de ejemplo, se muestra cómo asignar recursos TPU para el trabajo de entrenamiento:

cat << EOF > config.yaml
trainingInput:
  scaleTier: CUSTOM
  masterType: n1-standard-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: NVIDIA_TESLA_P100
      count: 1
  workerType:  cloud_tpu
  workerConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    tpuTfVersion: 1.14
    acceleratorConfig:
      type: TPU_V2
      count: 8
  workerCount: 1
EOF

Luego usa el archivo config.yaml para enviar un trabajo de entrenamiento.

Configuración del ajuste de hiperparámetros

Para usar el ajuste de hiperparámetros, incluye la configuración en el mismo archivo config.yaml que la configuración de la máquina.

Puedes encontrar explicaciones breves de cada hiperparámetro en Google Cloud Console y una explicación más completa en la referencia para el algoritmo integrado de reconocimiento de objetos en imágenes.

En el siguiente archivo config.yaml de ejemplo, se muestra cómo asignar recursos TPU para el trabajo de entrenamiento y, además, se incluye la configuración del ajuste de hiperparámetros:

cat << EOF > config.yaml
trainingInput:
  # Use a cluster with many workers and a few parameter servers.
  scaleTier: CUSTOM
  masterType: n1-standard-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: NVIDIA_TESLA_P100
      count: 1
  workerType:  cloud_tpu
  workerConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: TPU_V2
      count: 8
  workerCount: 1
  # The following are hyperparameter configs.
  hyperparameters:
   goal: MAXIMIZE
   hyperparameterMetricTag: "AP"
   maxTrials: 6
   maxParallelTrials: 3
   enableTrialEarlyStopping: True
   params:
   - parameterName: initial_learning_rate
     type: DOUBLE
     minValue: 0.001
     maxValue: 0.1
     scaleType: UNIT_LOG_SCALE
EOF

Envía un trabajo de entrenamiento de reconocimiento de objetos en imágenes

En esta sección, se explica cómo enviar un trabajo de entrenamiento con el algoritmo integrado de reconocimiento de objetos en imágenes.

Console

Selecciona tu algoritmo

  1. Ve a la página Trabajos de AI Platform Training en Google Cloud Console:

    Página Trabajos de AI Platform Training

  2. Haz clic en el botón Trabajo de entrenamiento nuevo. En las opciones que se muestran a continuación, haz clic en Entrenamiento de algoritmos integrados.

  3. En la página Crear un trabajo de entrenamiento nuevo, selecciona reconocimiento de objetos en imágenes y haz clic en Siguiente.

Selecciona tus datos de entrenamiento y validación

  1. En el cuadro desplegable debajo de Datos de entrenamiento, especifica si usas un solo archivo o varios:

    • Si usas un solo archivo, selecciona “Usar un solo archivo en un depósito de GCS”.
    • Si usas varios archivos, selecciona “Usar varios archivos almacenados en un directorio de Cloud Storage”.
  2. En Ruta del directorio, haz clic en Explorar. En el panel derecho, haz clic en el nombre del bucket en el que subiste los datos de entrenamiento y navega hasta tu archivo.

    Si seleccionas varios archivos, coloca los caracteres comodín en Nombre del comodín. La “Ruta de acceso completa de GCS” se muestra debajo para que puedas confirmar si es correcta.

  3. En el cuadro desplegable debajo de Datos de validación, especifica si usas un solo archivo o varios:

    • Si usas un solo archivo, selecciona “Usar un solo archivo en un depósito de GCS”.
    • Si usas varios archivos, selecciona “Usar varios archivos almacenados en un directorio de Cloud Storage”.
  4. En Ruta del directorio, haz clic en Explorar. En el panel derecho, haz clic en el nombre del bucket en el que subiste los datos de entrenamiento y navega hasta tu archivo.

    Si seleccionas varios archivos, coloca los caracteres comodín en Nombre del comodín. La “Ruta de acceso completa de GCS” se muestra debajo para que puedas confirmar si es correcta.

  5. En Directorio de resultados, ingresa la ruta de acceso al depósito de Cloud Storage en el que deseas que AI Platform Training almacene los resultados del trabajo de entrenamiento. Puedes completar la ruta de acceso al depósito de Cloud Storage directamente o hacer clic en el botón Explorar para seleccionarla.

    A fin de mantener el orden, crea un directorio nuevo dentro del bucket de Cloud Storage para este trabajo de entrenamiento. Puedes hacerlo desde el panel Explorar.

    Haz clic en Siguiente.

Configura los argumentos del algoritmo

Cada argumento específico del algoritmo muestra un valor predeterminado para los trabajos de entrenamiento sin ajuste de hiperparámetros. Si habilitas el ajuste de hiperparámetros en un argumento de algoritmo, debes especificar su valor mínimo y máximo.

Si deseas obtener más información sobre todos los argumentos del algoritmo, sigue los vínculos en Google Cloud Console y consulta la referencia del algoritmo integrado de reconocimiento de objetos en imágenes para conocer más detalles.

Envía el trabajo

En la pestaña Configuración del trabajo, haz lo siguiente:

  1. Ingresa un ID de trabajo único.
  2. Ingresa una región disponible (como “us-central1”).
  3. A fin de elegir los tipos de máquinas, selecciona “CUSTOM” para el nivel de escala. Aparecerá una sección para que proporciones la especificación personalizada del clúster.
    1. Selecciona un tipo de máquina disponible para el tipo principal.
    2. Si deseas usar TPU, configura el Tipo de trabajador como cloud_tpu. El recuento de trabajadores se establece de forma predeterminada en 1.

Haz clic en Listo para enviar el trabajo de entrenamiento.

gcloud

  1. Configura las variables de entorno para tu trabajo:

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
    # Specify the same region where your data is stored
    REGION="YOUR_REGION"
    
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region $REGION
    
    # Set Cloud Storage paths to your training and validation data
    # Include a wildcard if you select multiple files.
    TRAINING_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/train-*.tfrecord"
    VALIDATION_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/eval-*.tfrecord"
    
    # Specify the Docker container for your built-in algorithm selection
    IMAGE_URI="gcr.io/cloud-ml-algos/image_object_detection:latest"
    
    # Variables for constructing descriptive names for JOB_ID and JOB_DIR
    DATASET_NAME="coco"
    ALGORITHM="object_detection"
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}"
    DATE="$(date '+%Y%m%d_%H%M%S')"
    
    # Specify an ID for this job
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Specify the directory where you want your training outputs to be stored
    JOB_DIR="gs://${BUCKET_NAME}/algorithm_training/${JOB_ID}"
    
  2. Envía el trabajo:

    gcloud ai-platform jobs submit training $JOB_ID \
      --region=$REGION \
      --config=config.yaml \
      --job-dir=$JOB_DIR \
      -- \
      --training_data_path=$TRAINING_DATA_PATH \
      --validation_data_path=$VALIDATION_DATA_PATH \
      --train_batch_size=64 \
      --num_eval_images=500 \
      --train_steps_per_eval=2000 \
      --max_steps=22500 \
      --num_classes=90 \
      --warmup_steps=500 \
      --initial_learning_rate=0.08 \
      --fpn_type="nasfpn" \
      --aug_scale_min=0.8 \
      --aug_scale_max=1.2
    

  3. Una vez que enviaste el trabajo de forma correcta, puedes ver los registros si ejecutas los siguientes comandos de gcloud:

    gcloud ai-platform jobs describe $JOB_ID
    gcloud ai-platform jobs stream-logs $JOB_ID
    

¿Qué sigue?