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

Exemplos de modelos

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

Autorizações necessárias

  • Para carregar o modelo para o Cloud Storage, precisa das autorizações storage.objects.create e storage.objects.get.
  • Para carregar o modelo para o BigQuery ML, precisa das seguintes autorizações:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Para executar a inferência, precisa das seguintes autorizaçõ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.

    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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  8. Carregue um modelo para o Cloud Storage

    Siga estes passos para carregar um modelo:

    1. 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.pb e uma pasta variables para o modelo.
    2. Se necessário, crie um contentor do Cloud Storage.
    3. Carregue os artefactos do modelo para o contentor.

    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:

    • 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:
      • TENSORFLOW para um modelo do TensorFlow
      • ONNX para 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/]*].

    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:

    1. Aceda à página do BigQuery.

      Aceda ao BigQuery

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

    3. Clique no modelo.

    4. No painel do modelo apresentado, clique no separador Esquema.

    5. Consulte a secção Etiquetas. Isto identifica os campos que são gerados pelo modelo.

    6. 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 SELECT para a função ML.DECODE_IMAGE.

    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:

    • A função ML.CONVERT_COLOR_SPACE converte imagens com um espaço de cores RGB num espaço de cores diferente.
    • A função ML.CONVERT_IMAGE_TYPEconverte os valores de píxeis gerados pela função ML.DECODE_IMAGEde números de vírgula flutuante em números inteiros com um intervalo de [0, 255).
    • A função ML.RESIZE_IMAGE redimensiona imagens.

    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:

    • PROJECT_ID: o ID do projeto 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 contenha dados de imagem gerados pela função ML.DECODE_IMAGE ou 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.

    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)
      );

    O que se segue?