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:
- Un modelo de TensorFlow o TensorFlow Lite en formato SavedModel.
- Un modelo de PyTorch en formato ONNX.
El modelo debe cumplir los requisitos y las limitaciones de entrada que se describen en la instrucció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 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 datostf.uint8
con valores en[0, 255)
. - La forma
[batch_size, weight, height, 3]
, donde:batch_size
debe ser-1
,None
o1
.width
yheight
deben ser mayores que 0.
- Tener el tipo de datos
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:
- ResNet 50. Para probar este modelo, consulta el tutorial sobre cómo ejecutar inferencias en una tabla de objetos con un modelo de clasificación.
- MobileNet V3. Para probar este modelo, consulta el tutorial sobre cómo ejecutar inferencias en una tabla de objetos mediante un modelo de vector de características.
Permisos obligatorios
- 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 la inferencia, necesitas los siguientes permisos:
bigquery.tables.getData
en la tabla de objetosbigquery.models.getData
en el modelobigquery.jobs.create
Antes de empezar
- 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.
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. - 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 carpetavariables
para el modelo. - Si es necesario, crea un segmento de Cloud Storage.
- Sube los artefactos del modelo al segmento.
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 TensorFlowONNX
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/]*]
.Ve a la página BigQuery.
En el panel Explorador, despliega tu proyecto, el conjunto de datos que contiene el modelo y, a continuación, el nodo Modelos.
Haz clic en el modelo.
En el panel de modelo que se abre, haz clic en la pestaña Esquema.
Consulte la sección Etiquetas. Identifica los campos que genera el modelo.
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ónML.DECODE_IMAGE
.- La función
ML.CONVERT_COLOR_SPACE
convierte imágenes con un espacio de colorRGB
a otro espacio de color. - La función
ML.CONVERT_IMAGE_TYPE
convierte los valores de píxeles que genera la funciónML.DECODE_IMAGE
de números de coma flotante a números enteros con un intervalo de[0, 255)
. - La función
ML.RESIZE_IMAGE
cambia el tamaño de las imágenes. 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ónML.DECODE_IMAGE
o por una columna de tabla que contenga datos de imagen generados porML.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.- Consulta cómo analizar tablas de objetos mediante funciones remotas.
- Prueba a ejecutar inferencias en una tabla de objetos con un modelo de vector de características.
- Prueba a ejecutar inferencias en una tabla de objetos usando un modelo de clasificación.
- Prueba a analizar una tabla de objetos mediante una función remota.
- Prueba a anotar una imagen con la función
ML.ANNOTATE_IMAGE
.
Subir un modelo a Cloud Storage
Sigue estos pasos para subir un modelo:
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:
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:
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:
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) );