Clasificación de imágenes con el conjunto de datos flores

En este instructivo, se usa el conjunto de datos flores para compilar un modelo de clasificación de imagen personalizado a través del aprendizaje por transferencia y modelo Inception-v3 existente para etiquetar correctamente diferentes tipos de flores con Cloud Machine Learning Engine.

El código de muestra que seguirás y los resultados que supervisarás constan de cuatro partes: Procesamiento previo de datos, entrenamiento de modelos con los datos transformados, implementación de modelos y pasos de solicitud de predicción. Todas las partes se completarán en la nube.

Qué compilarás

Ejecutarás un código de muestra a fin de procesar previamente los datos con Cloud Dataflow y usarás los datos transformados para entrenar un modelo con Cloud ML Engine. Después, implementarás el modelo entrenado en Cloud ML Engine y probarás el modelo cuando le envíes una solicitud de predicción.

En este conjunto de datos de muestra, solo tienes un pequeño conjunto de imágenes (~ 3,600). Sin más datos, no es posible usar técnicas de aprendizaje automático para entrenar adecuadamente un modelo de clasificación preciso desde cero. En su lugar, usarás un enfoque llamado aprendizaje por transferencia. En el aprendizaje por transferencia, usas un modelo previamente entrenado para extraer características de imagen que usarás a fin de entrenar un clasificador nuevo. En este instructivo en particular, usarás un modelo previamente entrenado llamado Inception.

Objetivos

En esta explicación introductoria de extremo a extremo, usarás el código de Python para las siguientes acciones:

  • Realiza el procesamiento previo de datos en la nube y lee archivos de datos originales con Cloud Dataflow a fin de convertirlos al formato TFRecord para entrenamiento.
  • Ejecuta el entrenamiento con Cloud Machine Learning Engine para obtener especificaciones de modelo óptimas.
  • Implementa el modelo entrenado.
  • Solicita una predicción del modelo entrenado y observa la precisión que resulta.

Costos

En este instructivo, se usan componentes facturables de Google Cloud Platform, que incluyen los siguientes elementos:

  • Cloud Dataflow para:
    • Procesamiento previo de datos
  • Cloud Machine Learning Engine para:
    • Entrenamiento
    • Hacer una solicitud de predicción
  • Google Cloud Storage para:
    • Almacenar datos de entrada para entrenamiento
    • Etapa de pruebas del paquete de entrenamiento
    • Escribir artefactos de entrenamiento

Usa la calculadora de precios para generar una estimación de los costos según el uso previsto.

Los usuarios nuevos de Cloud Platform pueden optar por una prueba gratuita.

Antes de comenzar

Descarga la muestra del repositorio de GitHub

macOS

  1. Descarga y extrae el archivo ZIP de muestra de Cloud ML Engine.

  2. Abre una ventana de terminal y navega al directorio que contiene el directorio extraído cloudml-samples-master.

  3. Navega al directorio cloudml-samples-master > flowers. Los comandos en este instructivo se deben ejecutar desde el directorio flowers.

    cd cloudml-samples-master/flowers
    

Cloud Shell

  1. Descarga el archivo ZIP de muestra de Cloud ML Engine.

    wget https://github.com/GoogleCloudPlatform/cloudml-samples/archive/master.zip
    
  2. Descomprime el archivo para extraer el directorio cloudml-samples-master.

    unzip master.zip
    
  3. Navega al directorio cloudml-samples-master > flowers. Los comandos en este instructivo se deben ejecutar desde el directorio flowers.

    cd cloudml-samples-master/flowers
    

Instala dependencias

La muestra ofrece un archivo requirements.txt que se puede usar para instalar las dependencias requeridas por el proyecto.

pip install --user -r requirements.txt

Configura y prueba tu entorno de Cloud

Completa los siguientes pasos para configurar una cuenta de GCP, activar la API de Cloud ML Engine y también instalar y activar el SDK de Cloud.

Configura tu proyecto de GCP

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. Select or create a Google Cloud Platform project.

    Go to the Manage resources page

  3. Asegúrate de tener habilitada la facturación para tu proyecto.

    Aprende a habilitar la facturación

  4. Habilita las Cloud Machine Learning Engine y Compute Engine API necesarias.

    Habilita las API

  5. Install and initialize the Cloud SDK.

Configura tu entorno

Elige una de las siguientes opciones para configurar tu entorno de forma local en macOS o en un entorno remoto en Cloud Shell.

Para los usuarios de macOS, se recomienda configurar su entorno con la pestaña MACOS a continuación. Cloud Shell, que se muestra en la pestaña CLOUD SHELL, está disponible en macOS, Linux y Windows. Cloud Shell proporciona una forma rápida de probar Cloud Machine Learning Engine, pero no es adecuada para el trabajo de desarrollo en curso.

macOS

  1. Comprueba la instalación de Python.
    Confirma que tienes Python instalado y, si es necesario, instálalo.

    python -V
  2. Comprueba la instalación de pip.
    pip es el administrador de paquetes de Python, incluido con las versiones actuales de Python. Comprueba si ya está instalado pip cuando ejecutes pip --version. De lo contrario, consulta cómo instalar pip.

    Puedes actualizar pip con el siguiente comando:

    pip install -U pip

    Consulta la documentación de pip para obtener más detalles.

  3. Instala virtualenv.
    virtualenv es una herramienta para crear entornos aislados de Python. Comprueba si ya está instalado virtualenv cuando ejecutes virtualenv --version. De lo contrario, instala virtualenv:

    pip install --user --upgrade virtualenv

    Para crear un entorno de desarrollo aislado en esta guía, crea un entorno virtual nuevo en virtualenv. Por ejemplo, el siguiente comando activa un entorno llamado cmle-env:

    virtualenv cmle-env
    source cmle-env/bin/activate
  4. A los fines de este instructivo, ejecuta el resto de los comandos dentro de tu entorno virtual.

    Consulta más información sobre el uso de virtualenv. Para salir de virtualenv, ejecuta deactivate.

Cloud Shell

  1. Abre Google Cloud Platform Console.

    Google Cloud Platform Console

  2. Haz clic en el botón Activar Google Cloud Shell en la parte superior de la ventana de la consola.

    Activa Google Cloud Shell

    Se abrirá una sesión de Cloud Shell dentro de un marco nuevo en la parte inferior de la consola y se mostrará un mensaje de línea de comandos. Es posible que esta sesión tarde unos segundos en inicializarse.

    Sesión de Cloud Shell

    Tu sesión de Cloud Shell está lista para usarse.

  3. Configura la herramienta de línea de comandos de gcloud para usar tu proyecto seleccionado.

    gcloud config set project [selected-project-id]

    en el que [selected-project-id] es tu ID del proyecto. (Omite los corchetes de cierre).

Verifica los componentes del SDK de Google Cloud

Para verificar que los componentes del SDK de Google Cloud estén instalados, realiza las siguientes acciones:

  1. Enumera tus modelos:

    gcloud ml-engine models list
  2. Si no creaste ningún modelo anteriormente, el comando muestra una lista vacía:

    Listed 0 items.

    Después de comenzar a crear modelos, puedes verlos listados con este comando.

  3. Si instalaste gcloud anteriormente, actualiza gcloud:

    gcloud components update

Instala TensorFlow

Para instalar TensorFlow, ejecuta el siguiente comando:

pip install --user --upgrade tensorflow

Verifica la instalación:

python -c "import tensorflow as tf; print('TensorFlow version {} is installed.'.format(tf.VERSION))"

Puedes ignorar cualquier advertencia de que la biblioteca TensorFlow no se compiló para usar ciertas instrucciones.

Para obtener más información sobre la instalación de TensorFlow, incluidas otras opciones de instalación y también información sobre solución de problemas, consulta la documentación de TensorFlow

Configura tu depósito de Cloud Storage

En esta sección, se muestra cómo crear un depósito nuevo. Puedes usar un depósito existente, pero si no es parte del proyecto que usas para ejecutar Cloud ML Engine, debes otorgar acceso de forma explícita a las cuentas de servicio de Cloud ML Engine.

  1. Especifica un nombre para tu depósito nuevo. El nombre debe ser único en todos los depósitos en Cloud Storage.

    BUCKET_NAME="your_bucket_name"

    Por ejemplo, usa el nombre de tu proyecto con -mlengine agregado:

    PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    BUCKET_NAME=${PROJECT_ID}-mlengine
  2. Comprueba el nombre del depósito que creaste.

    echo $BUCKET_NAME
  3. Selecciona una región para tu depósito y configura una variable de entorno llamada “REGION”.

    Por ejemplo, el siguiente código crea una REGION y se configura en us-central1:

    REGION=us-central1
  4. Crea el depósito nuevo:

    gsutil mb -l $REGION gs://$BUCKET_NAME

    Nota: Usa la misma región donde planeas ejecutar trabajos de Cloud ML Engine. En el ejemplo, se usa us-central1 porque esa es la región que se utiliza en las instrucciones de introducción.

Declara variables

Comienza por declarar todas las variables y hacer que estas sean de solo lectura.

 declare -r BUCKET_NAME="gs://${your_bucket_name}"
 declare -r REGION="your_valid_region"
 declare -r PROJECT_ID=$(gcloud config list project --format "value(core.project)")
 declare -r JOB_NAME="flowers_${USER}_$(date +%Y%m%d_%H%M%S)"
 declare -r GCS_PATH="${BUCKET_NAME}/${USER}/${JOB_NAME}"
 declare -r DICT_FILE=gs://cloud-ml-data/img/flower_photos/dict.txt

 declare -r MODEL_NAME=flowers
 declare -r VERSION_NAME=v1

 echo
 echo "Using job id: " $JOB_NAME
 set -v -e

Ten en cuenta que las variables BUCKET_NAME y REGION son específicas del usuario, por lo que debes completar de manera explícita el nombre de tu propio proyecto y región. A fin de obtener ayuda con la elección de una región, consulta la guía de regiones disponibles para los servicios de Cloud ML Engine.

Realiza el procesamiento previo de datos de entrenamiento y evaluación en la nube

A los fines de este instructivo, el conjunto de datos original de las imágenes de flores etiquetadas se dividió de forma aleatoria en conjuntos de datos de entrenamiento y de evaluación. De los datos originales, el 90% se reserva para el entrenamiento y el 10% se reserva con fines de evaluación. Comienza con estos dos archivos separados que se almacenan en un depósito de Cloud Storage de Google. A continuación, realiza el procesamiento previo de dos conjuntos de datos alojados en Google para extraer las características de la imagen de la capa de cuello de botella (normalmente la penúltima capa justo antes de la capa de salida final que es la que hace la clasificación) de la red de Inception. Guarda la salida de este procesamiento previo en tu propio depósito de Cloud Storage y usa estos archivos para el entrenamiento.

El procesamiento previo lleva aproximadamente 60 minutos por conjunto de datos en completarse.

Evaluación del procesamiento previo de datos

Comienza con el procesamiento previo de datos de evaluación.

python trainer/preprocess.py \
    --input_dict "$DICT_FILE" \
    --input_path "gs://cloud-ml-data/img/flower_photos/eval_set.csv" \
    --output_path "${GCS_PATH}/preproc/eval" \
    --cloud

Supervisión del procesamiento previo

A fin de supervisar el progreso del procesamiento previo, puedes usar la herramienta de línea de comandos para las entradas de registro de texto o la interfaz de usuario de supervisión basada en la Web de Dataflow en la consola, la cual proporciona una representación gráfica de cada canalización y detalles sobre el estado y la ejecución de tu trabajo.

Imprime las entradas del registro con los siguientes comandos:

gcloud dataflow jobs list
export JOB_ID="{corresponding_id}"
gcloud beta dataflow logs list $JOB_ID --importance=detailed

O navega a la interfaz de usuario de supervisión de Dataflow:

IU de supervisión de Cloud Dataflow

Procesamiento previo de los datos de entrenamiento

Realiza el procesamiento previo de los datos de entrenamiento de la misma forma que con los datos de evaluación.

python trainer/preprocess.py \
    --input_dict "$DICT_FILE" \
    --input_path "gs://cloud-ml-data/img/flower_photos/train_set.csv" \
    --output_path "${GCS_PATH}/preproc/train" \
    --cloud

La supervisión del progreso es la misma que la de los datos de evaluación.

Ejecuta el entrenamiento de modelos en la nube

Una vez que el proceso de procesamiento previo en Cloud ML Engine se complete, estarás listo para entrenar un clasificador simple. Verifica que el procesamiento previo haya finalizado luego de navegar a la página de la consola de Dataflow y de verificar el estado del trabajo.

IU de supervisión de Cloud Dataflow

Ejecuta el entrenamiento de modelos en la nube con el siguiente comando:

gcloud ml-engine jobs submit training "$JOB_NAME" \
    --stream-logs \
    --module-name trainer.task \
    --package-path trainer \
    --staging-bucket "$BUCKET_NAME" \
    --region "$REGION" \
    --runtime-version=1.10\
    -- \
    --output_path "${GCS_PATH}/training" \
    --eval_data_paths "${GCS_PATH}/preproc/eval*" \
    --train_data_paths "${GCS_PATH}/preproc/train*"

Supervisa el progreso del entrenamiento

Al igual que en la supervisión de procesamiento previo, puedes supervisar el progreso del entrenamiento a través de registros simples de texto en la línea de comandos o cuando inicies la herramienta de visualización TensorBoard y vayas a los registros de resumen que se produjeron durante el entrenamiento.

Transmite registros con la siguiente línea de comandos:

gcloud ml-engine jobs stream-logs "$JOB_NAME"

O abre la herramienta de visualización TensorBoard:

macOS

  1. Inicia TensorBoard:

    OUTPUT_PATH = "${GCS_PATH}/training"
    
    python -m tensorflow.tensorboard --logdir=$OUTPUT_PATH
    
  2. Una vez que comiences a ejecutar TensorBoard, puedes acceder a él en tu navegador en http://localhost:6006

Cloud Shell

  1. Inicia TensorBoard:

    OUTPUT_PATH = "${GCS_PATH}/training"
    
    python -m tensorflow.tensorboard --logdir=$OUTPUT_PATH --port=8080
    
  2. Selecciona "Vista previa en el puerto 8080" en el menú Vista previa Web en la parte superior de la línea de comandos.

Puedes apagar TensorBoard en cualquier momento cuando escribas ctrl+c en la línea de comandos.

Implementa y usa el modelo de predicción

Ahora tienes un modelo guardado almacenado en Google Cloud Storage listo para exportar. Piensa en el "modelo" que se crea con este comando como un contenedor para el artefacto de procesamiento óptimo (grafos de Tensorflow) que se creó durante el entrenamiento.

  1. Usa el comando gcloud ml-engine models create para nombrar y exportar el modelo guardado a Cloud ML Engine.

    gcloud ml-engine models create "$MODEL_NAME" \
      --regions "$REGION"
    
  2. Crea la primera versión del modelo. La creación de una versión implementa tu modelo definido de manera única en una instancia de Cloud y lo prepara para entregar (predecir).

    gcloud ml-engine versions create "$VERSION_NAME" \
      --model "$MODEL_NAME" \
      --origin "${GCS_PATH}/training/model" \
      --runtime-version=1.10
    

En Cloud ML Engine, se establece automáticamente la primera versión de tu modelo como predeterminada.

Envía una solicitud de predicción al modelo entrenado

Después de implementar tu modelo, puedes probar su capacidad de predicción en línea. Para ello, descarga una imagen de flor de ejemplo (margarita) del conjunto de evaluación y luego envía un mensaje de solicitud.

  1. Copia la imagen a tu disco local.

      gsutil cp \
        gs://cloud-ml-data/img/flower_photos/daisy/100080576_f52e8ee070_n.jpg \
        daisy.jpg
    

    Para realizar una solicitud de predicción, el archivo JPEG anterior debe estar codificado (con la codificación base64) en una string de JSON.

  2. Crea un mensaje de solicitud de manera local en formato JSON a partir del archivo de margarita JPEG descargado.

      python -c 'import base64, sys, json; img = base64.b64encode(open(sys.argv[1], "rb").read()); print json.dumps({"key":"0", "image_bytes": {"b64": img}})' daisy.jpg &> request.json
    

    El código anterior es la predicción en línea de Cloud ML Engine en acción.

    Si implementas una versión nueva de tu modelo, es posible que tengas que esperar a que se entregue tu solicitud. Esto podría tardar hasta 10 minutos. Para verificar el estado de tu versión implementada, navega a ML Engine > Modelos en Google Cloud Platform Console.

    Después de unos minutos, el modelo estará disponible para su uso a través de la API de predicción de Cloud ML Engine. Que es cuando se usa el comando de predicción a fin de enviar una solicitud de predicción a Cloud ML Engine de la instancia dada.

  3. Llama a la API de servicio de predicción para obtener clasificaciones.

      gcloud ml-engine predict --model ${MODEL_NAME} --json-instances request.json
    

    La respuesta debe ser similar a esta, en la que el número de predicción corresponde al tipo de flor (margarita - 0, diente de león - 1, rosas - 2, girasoles - 3, tulipanes - 4):

KEY  PREDICTION                SCORES
0      0                    [0.9980067610740662, 0.00011650333908619359,
0.00028453863342292607, 0.0006193328299559653, 0.0009433324448764324,
2.9501752578653395e-05]

La precisión de la predicción después de ejecutar este código debe ser aproximadamente del 99,8%.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haz lo siguiente:

  1. In the GCP Console, go to the Projects page.

    Go to the Projects page

  2. In the project list, select the project you want to delete and click Delete .
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

  1. Abre una ventana de terminal (si no está abierta).

  2. Usa el comando gsutil rm con la marca -r para borrar el directorio que contiene tu trabajo más reciente:

    gsutil rm -r gs://$BUCKET_NAME/$JOB_NAME
    

Si se ejecuta correctamente, el comando mostrará un mensaje similar a este:

Removing gs://my-awesome-bucket/just-a-folder/cloud-storage.logo.png#1456530077282000...
Removing gs://my-awesome-bucket/...

Repite el comando en cualquier otro directorio que hayas creado para esta muestra.

De manera alternativa, si no tienes otros datos almacenados en el depósito, puedes ejecutar el comando gsutil rm -r en el depósito.

¿Qué sigue?

Ahora completaste la explicación de un ejemplo de código de Cloud ML Engine que usa datos de imágenes de flores para procesamiento previo, entrenamiento, implementación y predicción. Ejecutaste el código para el procesamiento previo de los datos de la imagen con Cloud Dataflow, realizaste el entrenamiento en la nube, luego implementaste un modelo y lo usaste para obtener una predicción en línea.

Los siguientes recursos pueden ayudarte a obtener más información sobre Cloud ML Engine.

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

Cloud ML Engine para TensorFlow