Executar inferência em tabelas de objetos de imagem

Neste documento, descrevemos como usar o BigQuery ML para executar inferência em tabelas de objetos de imagem.

Informações gerais

Execute a inferência em dados de imagem usando uma tabela de objetos como entrada para a função ML.PREDICT.

Para fazer isso, primeiro escolha um modelo apropriado, faça upload dele para o Cloud Storage e importe-o para o BigQuery executando a instrução CREATE MODEL. É possível criar seu próprio modelo ou fazer o download de um do TensorFlow Hub.

Limitações

  • O BigQuery ML para tabelas de objetos só é compatível com preços baseados em capacidade por meio de reservas. Os preços sob demanda não são compatíveis.
  • Os arquivos de imagem associados à tabela de objetos precisam atender aos seguintes requisitos:
    • têm menos de 20 MB;
    • Ter um formato JPEG, PNG ou BMP.
  • O tamanho combinado dos arquivos de imagem associados à tabela de objetos precisa ser menor que 1 TB.
  • O modelo precisa ser um dos seguintes:

  • O modelo precisa atender aos requisitos e limitações de entrada descritos em Entradas compatíveis.

  • O tamanho serializado do modelo precisa ser inferior a 450 MB.

  • O tamanho desserializado (na memória) do modelo precisa ser menor que 1.000 MB.

  • O tensor de entrada do modelo precisa atender aos seguintes critérios:

    • Ter um tipo de dados de tf.float32 com valores em [0, 1) ou um tipo de dados de tf.uint8 com valores em [0, 255).
    • Ter o formato [batch_size, weight, height, 3], em que:
      • Precisa ser batch_size, -1, None, ou 1.
      • width e height precisam ser maiores que 0.
  • O modelo precisa ser treinado com imagens em um dos seguintes espaços de cor:

    • RGB
    • HSV
    • YIQ
    • YUV
    • GRAYSCALE

    É possível usar a função ML.CONVERT_COLOR_SPACE para converter imagens de entrada no espaço de cores com que o modelo foi treinado.

Exemplos de modelos

Os seguintes modelos no TensorFlow Hub funcionam com o BigQuery ML e tabelas de objetos de imagem:

Permissões necessárias

  • Para fazer o upload do modelo para o Cloud Storage, você precisa das permissões storage.objects.create e storage.objects.get.
  • Para carregar o modelo no BigQuery ML, você precisa das seguintes permissões:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Para executar a inferência, você precisa das seguintes permissões:

    • bigquery.tables.getData na tabela de objetos
    • bigquery.models.getData no modelo
    • bigquery.jobs.create

Antes de começar

  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.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery and BigQuery Connection API APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery and BigQuery Connection API APIs.

    Enable the APIs

Fazer upload de um modelo para o Cloud Storage

Siga estas etapas para fazer upload de um modelo:

  1. Se você criou seu próprio modelo, salve-o localmente. Se você estiver usando um modelo do TensorFlow Hub, faça o download dele na sua máquina local. Se você estiver usando o TensorFlow, ele terá um arquivo saved_model.pb e uma pasta variables para o modelo.
  2. Se necessário, crie um bucket do Cloud Storage.
  3. Faça o upload dos artefatos do modelo no bucket:

Carregar o modelo no BigQuery ML

Carregar um modelo que funciona com tabelas de objetos de imagem é o mesmo que carregar um modelo que funciona com dados estruturados. Siga estas etapas 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:

  • PROJECT_ID: o ID do projeto.
  • DATASET_ID: o ID do conjunto de dados para conter o modelo.
  • MODEL_NAME: o nome do modelo
  • MODEL_TYPE: Use um dos seguintes valores:
    • TENSORFLOW para um modelo do TensorFlow
    • ONNX para um modelo PyTorch no formato ONNX
  • BUCKET_PATH: o caminho para o bucket do Cloud Storage que contém o modelo, no formato [gs://bucket_name/[folder_name/]*].

O exemplo a seguir usa o projeto padrão e carrega um modelo do TensorFlow no BigQuery ML como my_vision_model, usando o arquivo 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/*');

Inspecionar o modelo

É possível inspecionar o modelo enviado para conferir quais são os campos de entrada e saída. Você precisa fazer referência a esses campos ao executar a inferência na tabela de objetos.

Siga estas etapas para inspecionar um modelo:

  1. Acessar a página do BigQuery.

    Ir para o BigQuery

  2. No painel Explorer, expanda seu projeto, expanda o conjunto de dados que contém o modelo e o nó Modelos.

  3. Clique no modelo.

  4. No painel de modelo que é aberto, clique na guia Esquema.

  5. Confira a seção Rótulos. Isso identifica os campos que são gerados pelo modelo.

  6. Confira a seção Recursos. Isso identifica os campos que precisam ser inseridos no modelo. Faça referência a elas na instrução SELECT da função ML.DECODE_IMAGE.

Para uma inspeção mais detalhada de um modelo TensorFlow, por exemplo, para determinar o formato da entrada do modelo, instale o TensorFlow e use o comando saved_model_cli show.

Pré-processar imagens

Use a função ML.DECODE_IMAGE para converter bytes de imagem em uma representação ARRAY multidimensional. É possível usar a saída ML.DECODE_IMAGE diretamente em uma função ML.PREDICT ou gravar os resultados de ML.DECODE_IMAGE em uma coluna da tabela e referenciar essa coluna ao chamar ML.PREDICT.

O exemplo a seguir grava a saída da função ML.DECODE_IMAGE em uma 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 para que elas funcionem com seu modelo:

É possível usá-las como parte da função ML.PREDICT ou executá-las em uma coluna da tabela que contém a saída de dados de imagem de ML.DECODE_IMAGE.

Executar inferência

Depois de carregar um modelo apropriado e, como opção, pré-processar os dados da imagem, é possível executar a inferência nos dados da imagem.

Para executar a inferência, faça o seguinte:

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:

  • 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ção ML.DECODE_IMAGE ou por uma coluna da tabela que contém a saída de dados de imagem por ML.DECODE_IMAGE ou outras funções de processamento de imagem.
  • MODEL_INPUT: o nome de um campo de entrada para o modelo. É possível encontrar essa informação inspecionando o modelo e observando os nomes dos campos na seção Recursos.
  • TABLE_NAME: o nome da tabela de objetos.

Examples

Exemplo 1

O exemplo a seguir usa a função ML.DECODE_IMAGE diretamente na função ML.PREDICT. Ele retorna os resultados de inferência de 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 a seguir usa a função ML.DECODE_IMAGE diretamente na função ML.PREDICT e a função ML.CONVERT_COLOR_SPACE na função ML.PREDICT para converter o espaço de cor da imagem de RBG para YIQ. Ele também mostra como usar os campos da tabela de objetos para filtrar os objetos incluídos na inferência. Ele retorna os resultados de inferência de 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 a seguir usa resultados de ML.DECODE_IMAGE que foram gravados em uma coluna da tabela, mas não foram processados. Ele usa ML.RESIZE_IMAGE e ML.CONVERT_IMAGE_TYPE na função ML.PREDICT para processar os dados da imagem. Ele retorna os resultados de inferência de todas as imagens na tabela de imagens decodificadas para um modelo com um campo de entrada de input e um campo de saída de feature.

Crie a tabela de imagens decodificadas:

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

Execute inferência na tabela de imagens 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`)
);

Exemplo 4

O exemplo a seguir usa resultados de ML.DECODE_IMAGE que foram gravados em uma coluna da tabela e pré-processados usando ML.RESIZE_IMAGE. Ele retorna os resultados de inferência de todas as imagens na tabela de imagens decodificadas 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`);

Execute inferência na tabela de imagens decodificadas:

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

Exemplo 5

O exemplo a seguir usa a função ML.DECODE_IMAGE diretamente na função ML.PREDICT. No exemplo a seguir, o modelo tem um campo de saída 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 vem da tabela de objetos, e a entrada de string vem de uma tabela padrão do BigQuery associada à tabela de objetos usando a 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)
  );

A seguir