Tutorial: Ejecutar inferencias en una tabla de objetos mediante un modelo de vector de características

En este tutorial se explica cómo crear una tabla de objetos basada en las imágenes del conjunto de datos de flores y, a continuación, cómo ejecutar la inferencia en esa tabla de objetos con el modelo MobileNet V3.

Modelo MobileNet V3

El modelo MobileNet V3 analiza archivos de imagen y devuelve una matriz de vectores de características. La matriz de vectores de características es una lista de elementos numéricos que describen las características de las imágenes analizadas. Cada vector de características describe un espacio de características multidimensional y proporciona las coordenadas de la imagen en este espacio. Puedes usar la información del vector de características de una imagen para clasificarla mejor. Por ejemplo, puedes usar la similitud del coseno para agrupar imágenes similares.

La entrada del modelo MobileNet V3 toma un tensor de DType tf.float32 con la forma [-1, 224, 224, 3]. El resultado es una matriz de tensores de tf.float32 con la forma [-1, 1024].

Permisos obligatorios

  • 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 conceder 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 segmento, 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 la inferencia, necesitas los siguientes permisos:

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

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

  • BigQuery: You incur storage costs for the object table you create in BigQuery.
  • BigQuery ML: You incur costs for the model you create and the inference you perform in BigQuery ML.
  • Cloud Storage: You incur costs for the objects you store in Cloud Storage.

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

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

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

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

Antes de empezar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery and BigQuery Connection API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery and BigQuery Connection API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  8. Crear una reserva

    Para usar un modelo importado con una tabla de objetos, debes crear una reserva que use la edición Enterprise o Enterprise Plus de BigQuery y, a continuación, crear una asignación de reserva que use el tipo de tarea QUERY.

    Crear conjunto de datos

    Crea un conjunto de datos llamado mobilenet_inference_test:

    SQL

    1. Ve a la página BigQuery.

      Ir a BigQuery

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

      CREATE SCHEMA `PROJECT_ID.mobilenet_inference_test`;

      Sustituye PROJECT_ID por el ID del proyecto.

    bq

    1. En la Google Cloud consola, 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

      Sustituye PROJECT_ID por el ID del proyecto.

    Crear una conexión

    Crea una conexión llamada lake-connection:

    Consola

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel Explorador, haz clic en Añadir datos.

      Se abrirá el cuadro de diálogo Añadir datos.

    3. En el panel Filtrar por, en la sección Tipo de fuente de datos, selecciona Bases de datos.

      También puede introducir Vertex AI en el campo Buscar fuentes de datos.

    4. En la sección Fuentes de datos destacadas, haga clic en Vertex AI.

    5. Haz clic en la tarjeta de solución Modelos de Vertex AI: federación de BigQuery.

    6. En la lista Tipo de conexión, selecciona Modelos remotos, funciones remotas y BigLake (recurso de Cloud) de Vertex AI.

    7. En el campo Connection ID (ID de conexión), escribe lake-connection.

    8. Haga clic en Crear conexión.

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

    10. En el panel Información de conexión, copia el valor del campo ID de cuenta de servicio. Necesitas esta información para conceder permiso a la cuenta de servicio de la conexión en el segmento 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 obtener información sobre la conexión:

      bq show --connection us.lake-connection
      
    3. En la columna properties, copie el valor de la propiedad serviceAccountId y guárdelo en algún lugar. Necesitas esta información para conceder permisos a la cuenta de servicio de la conexión.

    Crea un segmento de Cloud Storage

    1. Crea un segmento de Cloud Storage.
    2. Crea dos carpetas en el depósito: una llamada mobilenet para los archivos del modelo y otra llamada flowers para el conjunto de datos.

    Conceder permisos a la cuenta de servicio de la conexión

    Consola

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

      Ir a IAM y administración

    2. Haz clic en Conceder acceso.

      Se abrirá el cuadro de diálogo Añadir principales.

    3. En el campo Nuevos principales, introduce el ID de la cuenta de servicio que has copiado anteriormente.

    4. En el campo Selecciona un rol, elige Cloud Storage y, a continuación, Visor de objetos de Storage.

    5. Haz clic en Guardar.

    gcloud

    En Cloud Shell, ejecuta el gcloud storage buckets add-iam-policy-bindingcomando:

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
    --member=serviceAccount:MEMBER \
    --role=roles/storage.objectViewer

    Sustituye MEMBER por el ID de la cuenta de servicio que has copiado antes. Sustituye BUCKET_NAME por el nombre del segmento que has creado anteriormente.

    Para obtener más información, consulta Añadir un principal a una política a nivel de segmento.

    Subir el conjunto de datos a Cloud Storage

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

    1. Descarga el conjunto de datos de flores en tu máquina local.
    2. Descomprime el archivo flower_photos.tgz.
    3. Sube la carpeta flower_photos a la carpeta flowers del segmento que has creado anteriormente.
    4. Una vez que se haya completado la subida, elimina el archivo LICENSE.txt de la carpeta flower_photos.

    Crear una tabla de objetos

    Crea una tabla de objetos llamada sample_images a partir del conjunto de datos de flores que has subido:

    SQL

    1. Ve a la página BigQuery.

      Ir a BigQuery

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

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

      Sustituye BUCKET_NAME por el nombre del bucket que has creado anteriormente.

    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

    Sustituye BUCKET_NAME por el nombre del bucket que has creado anteriormente.

    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 MobileNet V3 en tu máquina local. De esta forma, obtendrás 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 del segmento que has creado anteriormente.

    Cargar el modelo en BigQuery ML

    1. Ve a la página BigQuery.

      Ir a BigQuery

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

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

      Sustituye BUCKET_NAME por el nombre del bucket que has creado anteriormente.

    Inspeccionar el modelo

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

    1. Ve a la página BigQuery.

      Ir a BigQuery

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

    3. Haz clic en el modelo mobilenet.

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

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

    6. Consulte la sección Funciones. Identifica los campos que se deben introducir en el modelo. Se hace referencia a ellos en la instrucción SELECT de la función ML.DECODE_IMAGE. En este caso, el valor del nombre del campo es inputs.

    Ejecutar inferencia

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

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel Editor, ejecuta la siguiente instrucción 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ían ser similares a los siguientes:

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

    Limpieza

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

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