Ejecutar inferencias en tablas de objetos de imagen

.

En este documento se describe cómo usar BigQuery ML para ejecutar inferencias en tablas de objetos de imágenes.

Puedes ejecutar inferencias en datos de imagen usando una tabla de objetos como entrada de la función ML.PREDICT.

Para ello, primero debe elegir un modelo adecuado, subirlo a Cloud Storage e importarlo a BigQuery ejecutando la instrucción CREATE MODEL. Puedes crear tu propio modelo o descargar uno de TensorFlow Hub.

Limitaciones

  • Solo se pueden usar modelos importados de BigQuery ML con tablas de objetos si se utiliza el modelo de precios basado en la capacidad mediante reservas. El modelo de precios bajo demanda no se admite.
  • Los archivos de imagen asociados a la tabla de objetos deben cumplir los siguientes requisitos:
    • Tienen un tamaño inferior a 20 MB.
    • Tener el formato JPEG, PNG o BMP.
  • El tamaño combinado de los archivos de imagen asociados a la tabla de objetos debe ser inferior a 1 TB.
  • El modelo debe ser uno de los siguientes:

  • El modelo debe cumplir los requisitos y las limitaciones de entrada que se describen en la instrucción CREATE MODELpara importar modelos de TensorFlow.

  • El tamaño serializado del modelo debe ser inferior a 450 MB.

  • El tamaño deserializado (en memoria) del modelo debe ser inferior a 1000 MB.

  • El tensor de entrada del modelo debe cumplir los siguientes criterios:

    • Tener el tipo de datos tf.float32 con valores en [0, 1) o el tipo de datos tf.uint8 con valores en [0, 255).
    • La forma [batch_size, weight, height, 3], donde:
      • batch_size debe ser -1, None o 1.
      • width y height deben ser mayores que 0.
  • El modelo debe entrenarse con imágenes en uno de los siguientes espacios de color:

    • RGB
    • HSV
    • YIQ
    • YUV
    • GRAYSCALE

    Puedes usar la función ML.CONVERT_COLOR_SPACE para convertir las imágenes de entrada al espacio de color con el que se entrenó el modelo.

Modelos de ejemplo

Los siguientes modelos de TensorFlow Hub funcionan con BigQuery ML y las tablas de objetos de imagen:

Permisos obligatorios

  • Para subir 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

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. Subir un modelo a Cloud Storage

    Sigue estos pasos para subir un modelo:

    1. Si has creado tu propio modelo, guárdalo localmente. Si usas un modelo de TensorFlow Hub, descárgalo en tu máquina local. Si usas TensorFlow, deberías obtener un archivo saved_model.pb y una carpeta variables para el modelo.
    2. Si es necesario, crea un segmento de Cloud Storage.
    3. Sube los artefactos del modelo al segmento.

    Cargar el modelo en BigQuery ML

    Cargar un modelo que funcione con tablas de objetos de imagen es lo mismo que cargar un modelo que funcione con datos estructurados. Sigue estos pasos para cargar un modelo en BigQuery ML:

    CREATE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`
    OPTIONS(
      model_type = 'MODEL_TYPE',
      model_path = 'BUCKET_PATH');

    Haz los cambios siguientes:

    • PROJECT_ID: tu ID de proyecto.
    • DATASET_ID: ID del conjunto de datos que contendrá el modelo.
    • MODEL_NAME: el nombre del modelo.
    • MODEL_TYPE: usa uno de los siguientes valores:
      • TENSORFLOW para un modelo de TensorFlow
      • ONNX para un modelo de PyTorch en formato ONNX
    • BUCKET_PATH: la ruta al segmento de Cloud Storage que contiene el modelo, en el formato [gs://bucket_name/[folder_name/]*].

    En el siguiente ejemplo se usa el proyecto predeterminado y se carga un modelo de TensorFlow en BigQuery ML como my_vision_model, usando el archivo saved_model.pb y la carpeta variables de gs://my_bucket/my_model_folder:

    CREATE MODEL `my_dataset.my_vision_model`
    OPTIONS(
      model_type = 'TENSORFLOW',
      model_path = 'gs://my_bucket/my_model_folder/*');

    Inspeccionar el modelo

    Puedes inspeccionar el modelo subido para ver cuáles son sus campos de entrada y salida. Debes hacer referencia a estos campos cuando ejecutes la inferencia en la tabla de objetos.

    Sigue estos pasos para inspeccionar un modelo:

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel Explorador, despliega tu proyecto, el conjunto de datos que contiene el modelo y, a continuación, el nodo Modelos.

    3. Haz clic en el modelo.

    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.

    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.

    Para inspeccionar un modelo de TensorFlow con más detalle (por ejemplo, para determinar la forma de la entrada del modelo), instala TensorFlow y usa el comando saved_model_cli show.

    Preprocesar imágenes

    Debe usar la ML.DECODE_IMAGE función para convertir bytes de imagen en una representación ARRAY multidimensional. Puedes usar el resultado de ML.DECODE_IMAGE directamente en una función ML.PREDICT o escribir los resultados de ML.DECODE_IMAGE en una columna de una tabla y hacer referencia a esa columna cuando llames a ML.PREDICT.

    En el siguiente ejemplo se escribe la salida de la función ML.DECODE_IMAGE en una tabla:

    CREATE OR REPLACE TABLE mydataset.mytable AS (
      SELECT ML.DECODE_IMAGE(data) AS decoded_image FROM mydataset.object_table
      );

    Usa las siguientes funciones para procesar las imágenes de forma que funcionen con tu modelo:

    Puedes usarlas como parte de la función ML.PREDICT o ejecutarlas en una columna de tabla que contenga datos de imagen generados por ML.DECODE_IMAGE.

    Ejecutar inferencia

    Una vez que hayas cargado un modelo adecuado y, opcionalmente, hayas preprocesado los datos de imagen, podrás ejecutar la inferencia en los datos de imagen.

    Para ejecutar la inferencia:

    SELECT *
    FROM ML.PREDICT(
      MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
      (SELECT [other columns from the object table,] IMAGE_DATA AS MODEL_INPUT
      FROM PROJECT_ID.DATASET_ID.TABLE_NAME)
    );

    Haz los cambios siguientes:

    • PROJECT_ID: el ID del proyecto que contiene el modelo y la tabla de objetos.
    • DATASET_ID: ID del conjunto de datos que contiene el modelo y la tabla de objetos.
    • MODEL_NAME: el nombre del modelo.
    • IMAGE_DATA: los datos de la imagen, representados por el resultado de la función ML.DECODE_IMAGE o por una columna de tabla que contenga datos de imagen generados por ML.DECODE_IMAGE u otras funciones de procesamiento de imágenes.
    • MODEL_INPUT: el nombre de un campo de entrada del modelo.Puedes encontrar esta información inspeccionando el modelo y consultando los nombres de los campos en la sección Funciones.
    • TABLE_NAME: el nombre de la tabla de objetos.

    Ejemplos

    Ejemplo 1

    En el siguiente ejemplo se utiliza la función ML.DECODE_IMAGE directamente en la función ML.PREDICT. Devuelve los resultados de inferencia de todas las imágenes de la tabla de objetos de un modelo con un campo de entrada input y un campo de salida feature:

    SELECT * FROM
    ML.PREDICT(
      MODEL `my_dataset.vision_model`,
      (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 480, 480, FALSE) AS input
      FROM `my_dataset.object_table`)
    );

    Ejemplo 2

    En el siguiente ejemplo, se utiliza la función ML.DECODE_IMAGE directamente en la función ML.PREDICT y se usa la función ML.CONVERT_COLOR_SPACE en la función ML.PREDICT para convertir el espacio de color de la imagen de RBG a YIQ. También se muestra cómo usar los campos de la tabla de objetos para filtrar los objetos incluidos en la inferencia. Devuelve los resultados de inferencia de todas las imágenes JPG de la tabla de objetos de un modelo con un campo de entrada input y un campo de salida feature:

    SELECT * FROM
      ML.PREDICT(
        MODEL `my_dataset.vision_model`,
        (SELECT uri, ML.CONVERT_COLOR_SPACE(ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 280, TRUE), 'YIQ') AS input
        FROM `my_dataset.object_table`
        WHERE content_type = 'image/jpeg')
      );

    Ejemplo 3

    En el siguiente ejemplo se usan resultados de ML.DECODE_IMAGE que se han escrito en una columna de una tabla, pero no se han procesado más. Utiliza ML.RESIZE_IMAGE y ML.CONVERT_IMAGE_TYPE en la función ML.PREDICT para procesar los datos de la imagen. Devuelve los resultados de la inferencia de todas las imágenes de la tabla de imágenes decodificadas de un modelo con un campo de entrada input y un campo de salida feature.

    Crea la tabla de imágenes decodificadas:

    CREATE OR REPLACE TABLE `my_dataset.decoded_images`
      AS (SELECT ML.DECODE_IMAGE(data) AS decoded_image
      FROM `my_dataset.object_table`);

    Ejecuta la inferencia en la tabla de imágenes decodificadas:

    SELECT * FROM
    ML.PREDICT(
      MODEL`my_dataset.vision_model`,
      (SELECT uri, ML.CONVERT_IMAGE_TYPE(ML.RESIZE_IMAGE(decoded_image, 480, 480, FALSE)) AS input
      FROM `my_dataset.decoded_images`)
    );

    Ejemplo 4

    En el siguiente ejemplo se usan resultados de ML.DECODE_IMAGE que se han escrito en una columna de una tabla y se han preprocesado con ML.RESIZE_IMAGE. Devuelve los resultados de la inferencia de todas las imágenes de la tabla de imágenes decodificadas de un modelo con un campo de entrada input y un campo de salida feature.

    Crea la tabla:

    CREATE OR REPLACE TABLE `my_dataset.decoded_images`
      AS (SELECT ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data) 480, 480, FALSE) AS decoded_image
      FROM `my_dataset.object_table`);

    Ejecuta la inferencia en la tabla de imágenes decodificadas:

    SELECT * FROM
    ML.PREDICT(
      MODEL `my_dataset.vision_model`,
      (SELECT uri, decoded_image AS input
      FROM `my_dataset.decoded_images`)
    );

    Ejemplo 5

    En el siguiente ejemplo se utiliza la función ML.DECODE_IMAGE directamente en la función ML.PREDICT. En este ejemplo, el modelo tiene un campo de salida embeddings y dos campos de entrada: uno que espera una imagen, f_img, y otro que espera una cadena, f_txt. La entrada de imagen procede de la tabla de objetos y la entrada de cadena procede de una tabla de BigQuery estándar que se combina con la tabla de objetos mediante la columna uri.

    SELECT * FROM
      ML.PREDICT(
        MODEL `my_dataset.mixed_model`,
        (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(my_dataset.my_object_table.data), 224, 224, FALSE) AS f_img,
          my_dataset.image_description.description AS f_txt
        FROM `my_dataset.object_table`
        JOIN `my_dataset.image_description`
        ON object_table.uri = image_description.uri)
      );

    Siguientes pasos