Ejecuta la inferencia en las tablas de objetos de imagen

En este documento, se describe cómo usar BigQuery ML para ejecutar inferencias en las tablas de objetos de imagen.

Descripción general

Puedes ejecutar la inferencia sobre los datos de imágenes mediante una tabla de objetos como entrada de la función ML.PREDICT.

Para ello, primero debes elegir un modelo adecuado, subirlo a Cloud Storage y, luego, importarlo a BigQuery mediante la ejecución de la declaración CREATE MODEL. Puedes crear tu propio modelo o descargar uno desde TensorFlow Hub.

Limitaciones

  • BigQuery ML para tablas de objetos solo se admite cuando se usan precios basados en la capacidad a través de reservas; no se admiten los precios según demanda.
  • Los archivos de imagen asociados con la tabla de objetos deben cumplir con los siguientes requisitos:
    • Tener menos de 20 MB
    • El formato debe ser JPEG, PNG o BMP.
  • El tamaño combinado de los archivos de imagen asociados con la tabla de objetos debe ser inferior a 1 TB.
  • El modelo debe ser uno de los siguientes:

  • El modelo debe cumplir con los requisitos y las limitaciones de entrada que se describen en Entradas compatibles.

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

  • El tamaño deserializado (en la memoria) del modelo debe ser inferior a 1,000 MB.

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

    • Tienes un tipo de datos de tf.float32 con valores en [0, 1) o un tipo de datos de tf.uint8 con valores en [0, 255).
    • Tiene la forma [batch_size, weight, height, 3], en la que:
      • 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 imágenes de entrada en el espacio de color con el que se entrenó el modelo.

Modelos de ejemplo

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

Permisos necesarios

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

Sube un modelo a Cloud Storage

Sigue estos pasos para subir un modelo:

  1. Si creaste tu propio modelo, guárdalo de forma local. Si usas un modelo de TensorFlow Hub, descárgalo en tu máquina local. Si usas TensorFlow, esto debería brindarte un archivo saved_model.pb y una carpeta variables para el modelo.
  2. Si es necesario, crea un bucket de Cloud Storage.
  3. Sube los artefactos del modelo al bucket.

Carga el modelo en BigQuery ML

Cargar un modelo que funciona con tablas de objetos de imagen es lo mismo que cargar un modelo que funciona 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');

Reemplaza lo siguiente:

  • PROJECT_ID: el ID de tu proyecto
  • DATASET_ID: El 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 bucket 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 mediante 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/*');

Inspecciona 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 ejecutas inferencias en la tabla de objetos.

Sigue estos pasos para inspeccionar un modelo:

  1. Ve a la página de BigQuery.

    Ir a BigQuery

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

  3. Haz clic en el modelo.

  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 el modelo genera.

  6. Mira la sección Funciones. Esto identifica los campos que deben ingresarse en el modelo. Haz referencia a ellos en la declaración SELECT para la función ML.DECODE_IMAGE.

Para una inspección más detallada de un modelo de TensorFlow, por ejemplo, a fin de determinar la forma de la entrada del modelo, instala TensorFlow y usa el comando saved_model_cli show.

Preprocesa imágenes

Debes usar la función ML.DECODE_IMAGE para convertir los 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 puedes escribir los resultados de ML.DECODE_IMAGE en una columna de tabla y hacer referencia a esa columna cuando llames a ML.PREDICT.

En el siguiente ejemplo, se escribe el resultado 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 aún más las imágenes a fin de que funcionen con tu modelo:

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

Ejecuta la inferencia

Una vez que hayas cargado un modelo apropiado y, opcionalmente, procesado previamente los datos de imagen, puedes ejecutar la inferencia en los datos de la 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)
);

Reemplaza lo siguiente:

  • PROJECT_ID: el ID del proyecto que contiene la tabla del modelo y el objeto.
  • DATASET_ID: el ID del conjunto de datos que contiene la tabla del modelo y del objeto.
  • MODEL_NAME: el nombre del modelo
  • IMAGE_DATA: Son los datos de imagen, representados por el resultado de la función ML.DECODE_IMAGE o mediante una columna de tabla que contiene datos de imagen de salida por ML.DECODE_IMAGE o por otras funciones de procesamiento de imágenes.
  • MODEL_INPUT: Es el nombre de un campo de entrada del modelo. Para encontrar esta información, inspecciona el modelo y observa 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 usa la función ML.DECODE_IMAGE directamente en la función ML.PREDICT. Muestra los resultados de inferencia para todas las imágenes de la tabla de objetos, para un modelo con un campo de entrada de input y un campo de salida de 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 usa 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 tablas de objetos para filtrar los objetos incluidos en la inferencia. Muestra los resultados de la inferencia para todas las imágenes JPG en la tabla de objetos, para un modelo con un campo de entrada de input y un campo de salida de 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 los resultados de ML.DECODE_IMAGE que se escribieron en una columna de la tabla, pero que ya no se procesaron. Usa ML.RESIZE_IMAGE y ML.CONVERT_IMAGE_TYPE en la función ML.PREDICT para procesar los datos de la imagen. Muestra los resultados de la inferencia para todas las imágenes de la tabla de imágenes decodificadas, para un modelo con un campo de entrada de input y un campo de salida de 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 los resultados de ML.DECODE_IMAGE que se escribieron en una columna de la tabla y se preprocesaron con ML.RESIZE_IMAGE. Muestra los resultados de la inferencia para todas las imágenes de la tabla de imágenes decodificadas, para un modelo con un campo de entrada de input y un campo de salida de 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 usa la función ML.DECODE_IMAGE directamente en la función ML.PREDICT. En este ejemplo, el modelo tiene un campo de salida de embeddings y dos campos de entrada: uno que espera una imagen, f_img, y otro que espera una string, f_txt. La entrada de imagen proviene de la tabla de objetos y la entrada de string proviene de una tabla de BigQuery estándar que se une 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)
  );

¿Qué sigue?