Instructivo: Ejecuta la inferencia en una tabla de objeto con un modelo de vector de atributos

En este instructivo, se muestra cómo crear una tabla de objetos basada en las imágenes deconjunto de datos de flores y, luego, ejecutar inferencias en esa tabla de objetos con el modelo de MobileNet V3.

El modelo MobileNet V3

El modelo MobileNet V3 analiza los archivos de imagen y muestra un array de vector de atributos. El array de vector de atributos es una lista de elementos numéricos que describen las características de las imágenes analizadas. Cada vector de atributos describe un espacio de atributos multidimensionales y proporciona las coordenadas de la imagen en este espacio. Puedes usar la información del vector de atributos para una imagen de clasificación mayor, por ejemplo, mediante la similitud de coseno con el fin de agrupar imágenes similares.

La entrada del modelo MobileNet V3 toma un tensor de DType tf.float32 en la forma [-1, 224, 224, 3]. La salida es un array de tensores de tf.float32 en la forma [-1, 1024].

Permisos necesarios

  • Para crear el conjunto de datos, necesitas el permiso bigquery.datasets.create.
  • Para crear el recurso de conexión, necesitas los siguientes permisos:

    • bigquery.connections.create
    • bigquery.connections.get
  • Para otorgar permisos a la cuenta de servicio de la conexión, necesitas el siguiente permiso:

    • resourcemanager.projects.setIamPolicy
  • Para crear la tabla de objetos, necesitas los siguientes permisos:

    • bigquery.tables.create
    • bigquery.tables.update
    • bigquery.connections.delegate
  • Para crear el bucket, necesitas el permiso storage.buckets.create.

  • Para subir el conjunto de datos y el modelo a Cloud Storage, necesitas los permisos storage.objects.create y storage.objects.get.

  • Para cargar el modelo en BigQuery ML, necesitas los siguientes permisos:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Para ejecutar inferencias, necesitas los siguientes permisos:

    • bigquery.tables.getData en la tabla de objetos
    • bigquery.models.getData en el modelo
    • bigquery.jobs.create

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

  • BigQuery: se generan costos de almacenamiento para el objeto de tabla que creas en BigQuery.
  • BigQuery ML: se generan costos por el modelo que creas y la inferencia que realizas en BigQuery ML.
  • Cloud Storage: se generan costos por los objetos que almacenas en Cloud Storage.

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Para obtener más información sobre los precios de almacenamiento de BigQuery, consulta los Precios de almacenamiento en la documentación de BigQuery.

Para obtener más información sobre los precios de BigQuery ML, consulta los precios de BigQuery ML en la documentación de BigQuery.

Para obtener más información, consulta la página Precios de Cloud Storage.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita las API de BigQuery and BigQuery Connection API.

    Habilita las API

  5. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  6. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  7. Habilita las API de BigQuery and BigQuery Connection API.

    Habilita las API

Crea un conjunto de datos

Crea un conjunto de datos llamado mobilenet_inference_test:

SQL

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Editor, ejecuta la siguiente instrucción de SQL:

    CREATE SCHEMA `PROJECT_ID.mobilenet_inference_test`;
    

    Reemplaza PROJECT_ID con el ID del proyecto.

bq

  1. En la consola de Google Cloud, activa Cloud Shell.

    Activar Cloud Shell

  2. Ejecuta el comando bq mk para crear el conjunto de datos.

    bq mk --dataset --location=us PROJECT_ID:resnet_inference_test
    

    Reemplaza PROJECT_ID con el ID del proyecto.

Crear una conexión

Crea una conexión llamada lake-connection:

Consola

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. Haz clic en Agregar datos y, luego, en Fuente de datos externa.

  3. En la lista Tipo de conexión, selecciona BigLake y funciones remotas (Cloud Resource).

  4. En el campo ID de conexión, escribe lake-connection.

  5. Haga clic en Crear conexión.

  6. En el panel Explorador, expande tu proyecto, expande el nodo Conexiones externas y selecciona la conexión us.lake-connection.

  7. En el panel Información de conexión, copia el valor del campo ID de cuenta de servicio. Necesitarás esta información para otorgar permiso a la cuenta de servicio de la conexión en el bucket de Cloud Storage que crearás en el siguiente paso.

bq

  1. En Cloud Shell, ejecuta el comando bq mk para crear la conexión:

    bq mk --connection --location=us --connection_type=CLOUD_RESOURCE \
    lake-connection
    
  2. Ejecuta el comando bq show para recuperar información sobre la conexión:

    bq show --connection us.lake-connection
    
  3. En la columna properties, copia el valor de la propiedad serviceAccountId y guárdalo en algún lugar. Necesitarás esta información para otorgar permisos a la cuenta de servicio de la conexión.

Crea un bucket de Cloud Storage

  1. Crea buckets de Cloud Storage.
  2. Crea dos carpetas en el bucket, una llamada mobilenet para los archivos de modelo y otra llamada flowers para el conjunto de datos.

Otorga permisos a la cuenta de servicio de las conexiones

Consola

  1. Ir a la página IAM y administración

    Ir a IAM y administración

  2. Haz clic en Otorgar acceso.

    Se abre el cuadro de diálogo Agregar principales.

  3. En el campo Principales nuevas (New principals), ingresa el ID de la cuenta de servicio que copiaste antes.

  4. En el campo Selecciona una función, elige Cloud Storage y, luego, Visualizador de objetos de almacenamiento.

  5. Haz clic en Guardar.

gsutil

En Cloud Shell, ejecuta el siguiente comando gsutil iam ch:

gsutil iam ch serviceAccount:MEMBER:objectViewer gs://BUCKET_NAME

Reemplaza MEMBER por el ID de la cuenta de servicio que copiaste antes. Reemplaza BUCKET_NAME por el nombre del bucket que creaste previamente.

Para obtener más información, consulta Agrega una principal a una política a nivel del bucket.

Sube el conjunto de datos a Cloud Storage

Obtén los archivos de conjuntos de datos y haz que estén disponibles en Cloud Storage:

  1. Descarga el conjunto de datos de flores a tu máquina local.
  2. Descomprime el archivo flower_photos.tgz.
  3. Sube la carpeta flower_photos a la carpeta flowers en el bucket que creaste antes.
  4. Una vez que se complete la carga, borra el archivo LICENSE.txt en la carpeta flower_photos.

Crea una tabla de objetos

Crea una tabla de objetos llamada sample_images basada en el conjunto de datos de flores que subiste:

SQL

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Editor, ejecuta la siguiente instrucción de SQL:

    CREATE EXTERNAL TABLE mobilenet_inference_test.sample_images
    WITH CONNECTION `us.lake-connection`
    OPTIONS(
      object_metadata = 'SIMPLE',
      uris = ['gs://BUCKET_NAME/flowers/*']);
    

    Reemplaza BUCKET_NAME por el nombre del bucket que creaste previamente.

bq

En Cloud Shell, ejecuta el comando bq mk para crear la conexión:

bq mk --table \
--external_table_definition='gs://BUCKET_NAME/flowers/*@us.lake-connection' \
--object_metadata=SIMPLE \
mobilenet_inference_test.sample_images

Reemplaza BUCKET_NAME por el nombre del bucket que creaste previamente.

Sube el modelo a Cloud Storage.

Obtén los archivos del modelo y haz que estén disponibles en Cloud Storage:

  1. Descarga el modelo de MobileNet V3 en tu máquina local. Esto te brinda un archivo saved_model.pb y una carpeta variables para el modelo.
  2. Sube el archivo saved_model.pb y la carpeta variables a la carpeta mobilenet en el bucket que creaste antes.

Carga el modelo en BigQuery ML

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Editor, ejecuta la siguiente instrucción de SQL:

    CREATE MODEL `mobilenet_inference_test.mobilenet`
    OPTIONS(
      model_type = 'TENSORFLOW',
      model_path = 'gs://BUCKET_NAME/mobilenet/*');
    

    Reemplaza BUCKET_NAME por el nombre del bucket que creaste previamente.

Inspecciona el modelo

Inspecciona el modelo subido para ver cuáles son sus campos de entrada y salida:

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto, expande el conjunto de datos mobilenet_inference_test y, luego, expande el nodo Modelos.

  3. Haz clic en el modelo mobilenet.

  4. En el panel del modelo que se abre, haz clic en la pestaña Esquema.

  5. Consulta la sección Etiquetas. Esto identifica los campos que genera el modelo. En este caso, el valor del nombre del campo es feature_vector.

  6. Mira la sección Atributos. Esto identifica los campos que se deben ingresar en el modelo. Haz referencia a ellos en la declaración SELECT para la función ML.DECODE_IMAGE. En este caso, el valor del nombre del campo es inputs.

Ejecuta la inferencia

Ejecuta la inferencia en la tabla de objetos sample_images con el modelo mobilenet:

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Editor, ejecuta la siguiente instrucción de SQL:

    SELECT *
    FROM ML.PREDICT(
      MODEL `mobilenet_inference_test.mobilenet`,
      (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 224, FALSE) AS inputs
      FROM mobilenet_inference_test.sample_images)
    );
    

    Los resultados debería ser similar al siguiente:

    --------------------------------------------------------------------------------------------------------------
    | feature_vector         | uri                                                        | inputs               |
    —-------------------------------------------------------------------------------------------------------------
    | 0.850297749042511      | gs://mybucket/flowers/dandelion/3844111216_742ea491a0.jpg  | 0.29019609093666077  |
    —-------------------------------------------------------------------------------------------------------------
    | -0.27427938580513      |                                                            | 0.31372550129890442  |
    —-------------------------                                                            ------------------------
    | -0.23189745843410492   |                                                            | 0.039215687662363052 |
    —-------------------------                                                            ------------------------
    | -0.058292809873819351  |                                                            | 0.29985997080802917  |
    —-------------------------------------------------------------------------------------------------------------
    

Realiza una limpieza

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.