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.
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
- El uso de modelos importados de BigQuery ML con tablas de objetos solo es compatible cuando usas precios basados en la capacidad a través de reservas. No se admiten los precios a pedido.
- 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:
- Un modelo de TensorFlow o TensorFlow Lite en formato SavedModel.
- Un modelo de PyTorch en formato ONNX.
El modelo debe cumplir con los requisitos y las limitaciones de entrada que se describen en la declaración
CREATE MODEL
para importar modelos de TensorFlow.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 detf.uint8
con valores en[0, 255)
. - Tiene la forma
[batch_size, weight, height, 3]
, en la que:batch_size
debe ser-1
,None
o1
.width
yheight
deben ser mayores que 0.
- Tienes un tipo de datos de
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:
- ResNet 50. Para intentar usar este modelo, consulta Instructivo: Ejecuta la inferencia en una tabla de objetos mediante un modelo de clasificación.
- MobileNet V3. Para intentar usar este modelo, consulta Instructivo: Ejecuta la inferencia en una tabla de objetos mediante un modelo de vector de atributos.
Permisos necesarios
- Para subir el modelo a Cloud Storage, necesitas los permisos
storage.objects.create
ystorage.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 objetosbigquery.models.getData
en el modelobigquery.jobs.create
Antes de comenzar
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery and BigQuery Connection API APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery and BigQuery Connection API APIs.
Sube un modelo a Cloud Storage
Sigue estos pasos para subir un modelo:
- 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 carpetavariables
para el modelo. - Si es necesario, crea un bucket de Cloud Storage.
- 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 proyectoDATASET_ID
: El ID del conjunto de datos que contendrá el modelo.MODEL_NAME
: el nombre del modeloMODEL_TYPE
: Usa uno de los siguientes valores:TENSORFLOW
para un modelo de TensorFlowONNX
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 ejecutes inferencias en la tabla de objetos.
Sigue estos pasos para inspeccionar un modelo:
Ve a la página de BigQuery.
En el panel Explorador, expande tu proyecto, expande el conjunto de datos que contiene el modelo y, luego, expande el nodo Modelos.
Haz clic en el modelo.
En el panel del modelo que se abre, haz clic en la pestaña Esquema.
Consulta la sección Etiquetas. Esto identifica los campos que genera el modelo.
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ónML.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:
- La función
ML.CONVERT_COLOR_SPACE
convierte imágenes con un espacio de colorRGB
en un espacio de color diferente. - La función
ML.CONVERT_IMAGE_TYPE
convierte los valores de píxeles que genera la funciónML.DECODE_IMAGE
de números de punto flotante a números enteros con un rango de[0, 255)
. - La función
ML.RESIZE_IMAGE
cambia el tamaño de las imágenes.
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 el objeto.MODEL_NAME
: el nombre del modeloIMAGE_DATA
: Son los datos de imagen, representados por el resultado de la funciónML.DECODE_IMAGE
o mediante una columna de tabla que contiene datos de imagen de salida porML.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?
- Aprende a analizar tablas de objetos mediante funciones remotas.
- Intenta ejecutar la inferencia en una tabla de objeto mediante un modelo de vector de atributos.
- Intenta ejecutar la inferencia en una tabla de objeto mediante un modelo de clasificación.
- Intenta analizar una tabla de objetos con una función remota.
- Intenta anotar una imagen con la función
ML.ANNOTATE_IMAGE
.