Executar inferência em tabelas de objetos de imagem
Este documento descreve como usar o BigQuery ML para executar a inferência em tabelas de objetos de imagens.
Pode executar a inferência em dados de imagens usando uma tabela de objetos como entrada para a função ML.PREDICT.
Para tal, tem de escolher primeiro um modelo adequado, carregá-lo para o Cloud Storage e importá-lo para o BigQuery executando a declaração CREATE MODEL.
Pode criar o seu próprio modelo ou transferir um do TensorFlow Hub.
Limitações
- A utilização de modelos importados do BigQuery ML com tabelas de objetos só é suportada quando usa preços baseados na capacidade através de reservas. Os preços a pedido não são suportados.
- Os ficheiros de imagem associados à tabela de objetos têm de cumprir os seguintes
requisitos:
- Têm um tamanho inferior a 20 MB.
- Ter um formato JPEG, PNG ou BMP.
- O tamanho combinado dos ficheiros de imagem associados à tabela de objetos tem de ser inferior a 1 TB.
O modelo tem de ser um dos seguintes:
- Um modelo do TensorFlow ou do TensorFlow Lite no formato SavedModel.
- Um modelo do PyTorch no formato ONNX.
O modelo tem de cumprir os requisitos de entrada e as limitações descritas na declaração
CREATE MODELpara importar modelos do TensorFlow.O tamanho serializado do modelo tem de ser inferior a 450 MB.
O tamanho desserializado (na memória) do modelo tem de ser inferior a 1000 MB.
O tensor de entrada do modelo tem de cumprir os seguintes critérios:
- Ter um tipo de dados de
tf.float32com valores em[0, 1)ou ter um tipo de dados detf.uint8com valores em[0, 255). - Ter o formato
[batch_size, weight, height, 3], em que:batch_sizetem de ser-1,Noneou1.widtheheighttêm de ser superiores a 0.
- Ter um tipo de dados de
O modelo tem de ser preparado com imagens num dos seguintes espaços de cores:
RGBHSVYIQYUVGRAYSCALE
Pode usar a função
ML.CONVERT_COLOR_SPACEpara converter imagens de entrada no espaço de cores com o qual o modelo foi preparado.
Exemplos de modelos
Os seguintes modelos no TensorFlow Hub funcionam com o BigQuery ML e as tabelas de objetos de imagem:
- ResNet 50. Para experimentar usar este modelo, consulte o Tutorial: execute a inferência numa tabela de objetos usando um modelo de classificação.
- MobileNet V3. Para experimentar usar este modelo, consulte o Tutorial: execute a inferência numa tabela de objetos usando um modelo de vetor de caraterísticas.
Autorizações necessárias
- Para carregar o modelo para o Cloud Storage, precisa das autorizações
storage.objects.createestorage.objects.get. Para carregar o modelo para o BigQuery ML, precisa das seguintes autorizações:
bigquery.jobs.createbigquery.models.createbigquery.models.getDatabigquery.models.updateData
Para executar a inferência, precisa das seguintes autorizações:
bigquery.tables.getDatana tabela de objetosbigquery.models.getDatano modelobigquery.jobs.create
Antes de começar
- 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.createpermission. 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.enablepermission. 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.createpermission. 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.enablepermission. Learn how to grant roles. - Se criou o seu próprio modelo, guarde-o localmente. Se estiver a usar um modelo do TensorFlow Hub, transfira-o para o seu computador local. Se estiver a usar o TensorFlow, deve obter um ficheiro
saved_model.pbe uma pastavariablespara o modelo. - Se necessário, crie um contentor do Cloud Storage.
- Carregue os artefactos do modelo para o contentor.
PROJECT_ID: o ID do seu projeto.DATASET_ID: o ID do conjunto de dados que vai conter o modelo.MODEL_NAME: o nome do modelo.MODEL_TYPE: use um dos seguintes valores:TENSORFLOWpara um modelo do TensorFlowONNXpara um modelo PyTorch no formato ONNX
BUCKET_PATH: o caminho para o contentor do Cloud Storage que contém o modelo, no formato[gs://bucket_name/[folder_name/]*].Aceda à página do BigQuery.
No painel esquerdo, clique em Explorador:

Se não vir o painel do lado esquerdo, clique em Expandir painel do lado esquerdo para o abrir.
No painel Explorador, expanda o seu projeto e clique em Conjuntos de dados.
Clique no conjunto de dados que contém o seu modelo.
Clique no separador Modelos.
No painel do modelo apresentado, clique no separador Esquema.
Consulte a secção Etiquetas. Isto identifica os campos que são gerados pelo modelo.
Consulte a secção Funcionalidades. Isto identifica os campos que têm de ser introduzidos no modelo. Faz referência a elas na declaração
SELECTpara a funçãoML.DECODE_IMAGE.- A função
ML.CONVERT_COLOR_SPACEconverte imagens com um espaço de coresRGBnum espaço de cores diferente. - A função
ML.CONVERT_IMAGE_TYPEconverte os valores de píxeis gerados pela funçãoML.DECODE_IMAGEde números de vírgula flutuante em números inteiros com um intervalo de[0, 255). - A função
ML.RESIZE_IMAGEredimensiona imagens. PROJECT_ID: o ID do projeto que contém o modelo e a tabela de objetos.DATASET_ID: o ID do conjunto de dados que contém o modelo e a tabela de objetos.MODEL_NAME: o nome do modelo.IMAGE_DATA: os dados da imagem, representados pela saída da funçãoML.DECODE_IMAGEou por uma coluna da tabela que contenha dados de imagem gerados porML.DECODE_IMAGEou outras funções de processamento de imagens.MODEL_INPUT: o nome de um campo de entrada para o modelo.Pode encontrar estas informações inspecionando o modelo e consultando os nomes dos campos na secção Funcionalidades.TABLE_NAME: o nome da tabela de objetos.- Saiba como analisar tabelas de objetos através de funções remotas.
- Experimente executar a inferência numa tabela de objetos através de um modelo de vetor de caraterísticas.
- Experimente executar a inferência numa tabela de objetos usando um modelo de classificação.
- Experimente analisar uma tabela de objetos através de uma função remota.
- Experimente anotar uma imagem com a função
ML.ANNOTATE_IMAGE.
Carregue um modelo para o Cloud Storage
Siga estes passos para carregar um modelo:
Carregue o modelo no BigQuery ML
Carregar um modelo que funcione com tabelas de objetos de imagens é o mesmo que carregar um modelo que funcione com dados estruturados. Siga estes passos para carregar um modelo no BigQuery ML:
CREATE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME` OPTIONS( model_type = 'MODEL_TYPE', model_path = 'BUCKET_PATH');
Substitua o seguinte:
O exemplo seguinte usa o projeto predefinido e carrega um modelo do TensorFlow para o BigQuery ML como my_vision_model, usando o ficheiro saved_model.pb e a pasta 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/*');
Inspecione o modelo
Pode inspecionar o modelo carregado para ver os respetivos campos de entrada e saída. Tem de fazer referência a estes campos quando executar a inferência na tabela de objetos.
Siga estes passos para inspecionar um modelo:
Para uma inspeção mais detalhada de um modelo do TensorFlow, por exemplo, para determinar a forma da entrada do modelo, instale o TensorFlow e use o comando saved_model_cli show.
Pré-processe imagens
Tem de usar a função ML.DECODE_IMAGE para converter bytes de imagens numa representação ARRAY multidimensional. Pode usar o resultado de ML.DECODE_IMAGE diretamente numa função ML.PREDICT ou escrever os resultados de ML.DECODE_IMAGE numa coluna da tabela e fazer referência a essa coluna quando chamar ML.PREDICT.
O exemplo seguinte escreve o resultado da função ML.DECODE_IMAGE numa tabela:
CREATE OR REPLACE TABLE mydataset.mytable AS ( SELECT ML.DECODE_IMAGE(data) AS decoded_image FROM mydataset.object_table );
Use as seguintes funções para processar ainda mais as imagens de modo que funcionem com o seu modelo:
Pode usá-las como parte da função ML.PREDICT ou executá-las numa coluna de tabela que contenha dados de imagens gerados por ML.DECODE_IMAGE.
Executar inferência
Depois de carregar um modelo adequado e, opcionalmente, pré-processar os dados de imagem, pode executar a inferência nos dados de imagem.
Para executar a inferência:
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) );
Substitua o seguinte:
Exemplos
Exemplo 1
O exemplo seguinte usa a função ML.DECODE_IMAGE diretamente na função ML.PREDICT. Devolve os resultados da inferência para todas as imagens na tabela de objetos, para um modelo com um campo de entrada de input e um campo de saída 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`) );
Exemplo 2
O exemplo seguinte usa a função ML.DECODE_IMAGE diretamente na função ML.PREDICT e usa a função ML.CONVERT_COLOR_SPACE na função ML.PREDICT para converter o espaço de cores da imagem de RBG para YIQ. Também mostra como usar campos da tabela de objetos para filtrar os objetos incluídos na inferência.
Devolve os resultados da inferência para todas as imagens JPG na tabela de objetos, para um modelo com um campo de entrada de input e um campo de saída 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') );
Exemplo 3
O exemplo seguinte usa resultados de ML.DECODE_IMAGE que foram
escritos numa coluna de tabela, mas não foram processados mais. Usa ML.RESIZE_IMAGE e ML.CONVERT_IMAGE_TYPE na função ML.PREDICT para processar os dados de imagem. Devolve os resultados da inferência para todas as imagens na tabela de imagens descodificadas, para um modelo com um campo de entrada de input e um campo de saída de feature.
Crie a tabela de imagens descodificadas:
CREATE OR REPLACE TABLE `my_dataset.decoded_images` AS (SELECT ML.DECODE_IMAGE(data) AS decoded_image FROM `my_dataset.object_table`);
Executar inferência na tabela de imagens descodificadas:
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`) );
Exemplo 4
O exemplo seguinte usa resultados de ML.DECODE_IMAGE que foram
escritos numa coluna da tabela e pré-processados com
ML.RESIZE_IMAGE. Devolve os resultados da inferência para todas as imagens na tabela de imagens descodificadas, para um modelo com um campo de entrada de input e um campo de saída de feature.
Crie a tabela:
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`);
Executar inferência na tabela de imagens descodificadas:
SELECT * FROM ML.PREDICT( MODEL `my_dataset.vision_model`, (SELECT uri, decoded_image AS input FROM `my_dataset.decoded_images`) );
Exemplo 5
O exemplo seguinte usa a função ML.DECODE_IMAGE diretamente na função ML.PREDICT. Neste exemplo, o modelo tem um campo de saída de
embeddings e dois campos de entrada: um que espera uma
imagem, f_img, e outro que espera uma string, f_txt. A entrada de imagem provém da tabela de objetos e a entrada de string provém de uma tabela padrão do BigQuery que é unida à tabela de objetos através da coluna 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) );