Como processar conteúdo gerado pelo usuário usando as APIs Video Intelligence e Cloud Vision (tutorial)

Neste tutorial, mostramos como implantar um conjunto do Cloud Functions para processar imagens e vídeos com as APIs Cloud Vision e Cloud Video Intelligence. Essa funcionalidade foi descrita em Como processar conteúdo gerado pelo usuário com as APIs Video Intelligence e Cloud Vision.

Siga este tutorial para implantar o Cloud Functions e outros componentes do Google Cloud Platform (GCP) necessários para a solução.

Objetivos

Custos

Este tutorial usa componentes do Cloud Platform que podem ser cobrados, incluindo:

  • Cloud Functions
  • Cloud Pub/Sub
  • Cloud Storage
  • BigQuery
  • Vision API
  • Video Intelligence API

O custo para executar este tutorial pode ficar dentro do intervalo do nível gratuito. O custo sem o nível gratuito é de aproximadamente US$ 5 para testar 10 imagens e 10 vídeos. Use a calculadora de preços para gerar uma estimativa de custo com base no uso previsto. Usuários novos do Cloud Platform podem ter direito a um teste gratuito.

Antes de começar

  1. Crie um projeto do Google Cloud Platform (GCP) ou use um atual.

    Acessar a página "Projetos"

  2. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.

  3. Ative as APIs Cloud Functions, Cloud Storage, BigQuery, Vision, and Video Intelligence.

    Ative as APIs

  4. Instale e inicialize o Google Cloud SDK.

  5. Atualize e instale os componentes gcloud:

    gcloud components update && gcloud components install beta
  6. Prepare o ambiente para o desenvolvimento do Node.js.

    ACESSAR O GUIA DE CONFIGURAÇÃO

Arquitetura

O diagrama a seguir descreve a arquitetura geral:

arquitetura geral

Como clonar o repositório do GitHub

Todas as Funções do Cloud deste tutorial estão disponíveis no GitHub. Faça o download do código no GitHub usando as ferramentas da sua preferência ou use os seguintes comandos:

git clone https://github.com/GoogleCloudPlatform/cloud-functions-intelligentcontent-nodejs

Acesse o diretório clonado do repositório:

cd cloud-functions-intelligentcontent-nodejs

Como criar buckets do Cloud Storage

Os buckets do Cloud Storage oferecem um local de armazenamento para fazer o upload das imagens e dos vídeos. Siga estas etapas para criar quatro buckets diferentes do Cloud Storage:

  1. Crie um bucket para armazenar os arquivos de imagem e vídeo. Substitua [IV_BUCKET_NAME] por um nome válido de bucket do Cloud Storage.

    gsutil mb gs://[IV_BUCKET_NAME]
  2. Crie um bucket para armazenar os arquivos de imagem e vídeo filtrados. Substitua [FILTERED_BUCKET_NAME] por um nome válido de bucket do Cloud Storage.

    gsutil mb gs://[FILTERED_BUCKET_NAME]
  3. Crie um bucket para armazenar os arquivos de imagem e vídeo sinalizados. Substitua [FLAGGED_BUCKET_NAME] por um nome válido de bucket do Cloud Storage.

    gsutil mb gs://[FLAGGED_BUCKET_NAME]
  4. Crie um bucket para o Cloud Functions que será usado como local de preparo. Substitua [STAGING_BUCKET_NAME] por um nome válido de bucket do Cloud Storage.

    gsutil mb gs://[STAGING_BUCKET_NAME]

Como criar tópicos do Cloud Pub/Sub

Os tópicos do Cloud Pub/Sub são usados para mensagens de notificação do Cloud Storage e mensagens entre Cloud Functions.

  1. Crie um tópico para receber notificações do Cloud Storage sempre que um dos arquivos for enviado para o Cloud Storage. Substitua [UPLOAD_NOTIFICATION_TOPIC] por um nome de tópico válido do Cloud Pub/Sub.

    gcloud pubsub topics create [UPLOAD_NOTIFICATION_TOPIC]
  2. Crie um tópico para receber suas mensagens da API Vision. Substitua [VISION_TOPIC_NAME] por um nome de tópico válido. O valor padrão no arquivo config.json é visionapiservice.

    gcloud pubsub topics create [VISION_TOPIC_NAME]
  3. Crie um tópico para receber as mensagens da API Video Intelligence. Substitua [VIDEOIQ_TOPIC_NAME] por um nome de tópico válido. O valor padrão no arquivo config.json é videointelligenceservice.

    gcloud pubsub topics create [VIDEOIQ_TOPIC_NAME]
  4. Crie um tópico para receber as mensagens que serão armazenadas no BigQuery. Substitua [BIGQUERY_TOPIC_NAME] por um nome de tópico válido. O valor padrão no arquivo config.json é bqinsert.

    gcloud pubsub topics create [BIGQUERY_TOPIC_NAME]

Como criar notificações do Cloud Storage

  1. Crie uma notificação que seja acionada somente quando um dos novos objetos for colocado no bucket de upload de arquivos do Cloud Storage. Substitua [UPLOAD_NOTIFICATION_TOPIC] pelo tópico e [IV_BUCKET] pelo nome do bucket de upload de arquivos.

    gsutil notification create -t [UPLOAD_NOTIFICATION_TOPIC] -f json -e OBJECT_FINALIZE gs://[IV_BUCKET_NAME]
  2. Confirme se a notificação foi criada para o bucket:

    gsutil notification list gs://[IV_BUCKET_NAME]

    Saída resultante, se a função for bem-sucedida:

    Filters: Event Types: OBJECT_FINALIZE

Criar o conjunto de dados e a tabela do BigQuery

Os resultados da Vision API e da Video Intelligence API são armazenados no BigQuery.

  1. Crie o conjunto de dados do BigQuery. Substitua [PROJECT_ID] pelo ID do projeto e [DATASET_ID] pelo nome do conjunto de dados. O valor padrão [DATASET_ID] no arquivo config.json é intelligentcontentfilter.

    bq --project_id [PROJECT_ID] mk [DATASET_ID]
  2. Crie a tabela do BigQuery a partir do arquivo de esquema. Substitua [PROJECT_ID] pelo ID do projeto e [DATASET_ID].[TABLE_NAME] pelo ID do conjunto de dados e pelo nome da tabela. O valor padrão [DATASET_ID] no arquivo config.json é intelligentcontentfilter e, para [TABLE_NAME], o valor padrão é filtered_content.

    bq --project_id [PROJECT_ID] mk --schema intelligent_content_bq_schema.json -t [DATASET_ID].[TABLE_NAME]
  3. Verifique se a tabela do BigQuery foi criada. Substitua [PROJECT_ID] pelo ID do projeto e [DATASET_ID].[TABLE_NAME] pelo ID do conjunto de dados e pelo nome da tabela.

    bq --project_id [PROJECT_ID] show [DATASET_ID].[TABLE_NAME]

    Saída:

    Tabela do BigQuery

Como implantar o Cloud Functions

O próximo passo é implantar o Cloud Functions.

Editar o arquivo de configuração JSON

Depois de fazer o download do código, edite o arquivo config.json para usar intervalos específicos do Cloud Storage, nomes de tópicos do Cloud Pub/Sub e o ID do conjunto de dados do BigQuery.

{
  "VISION_TOPIC": "projects/[PROJECT-ID]/topics/visionapiservice",
  "VIDEOINTELLIGENCE_TOPIC": "projects/[PROJECT-ID]/topics/videointelligenceservice",
  "BIGQUERY_TOPIC": "projects/[PROJECT-ID]/topics/bqinsert",
  "REJECTED_BUCKET": "[FLAGGED_BUCKET_NAME]",
  "RESULT_BUCKET": "[FILTERED_BUCKET_NAME]",
  "DATASET_ID": "[DATASET_ID]",
  "TABLE_NAME": "[TABLE_NAME]",
  "GCS_AUTH_BROWSER_URL_BASE": "https://storage.cloud.google.com/" ,
  "API_Constants": {
  	"ADULT" : "adult",
  	"VIOLENCE" : "violence",
  	"SPOOF" : "spoof",
  	"MEDICAL" : "medical"
  }
}

Implantar a função GCStoPubsub

Implante a Função do Cloud GCStoPubsub, que contém a lógica para receber uma mensagem de notificação do Cloud Storage do Cloud Pub/Sub e encaminhar a mensagem para a função apropriada com outra mensagem do Cloud Pub/Sub.

  • Substitua [STAGING_BUCKET_NAME] pelo nome do bucket de preparo do Cloud Storage e [UPLOAD_NOTIIFICATION_TOPIC] pelo nome do tópico da notificação de upload de arquivos.

    gcloud functions deploy GCStoPubsub \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [UPLOAD_NOTIIFICATION_TOPIC] \
      --entry-point GCStoPubsub \
      --runtime=nodejs10

A saída da linha de comando é semelhante à mostrada a seguir para cada uma das Funções do Cloud:

Copying file:///var/folders/69/wsyfjkld5fq1w_wf7d5pxbv80030br/T/tmphzfCsc/fun.zip [Content-Type=application/zip]...
/ [1 files][138.4 KiB/138.4 KiB]
Operation completed over 1 objects/138.4 KiB.
Deploying function (may take a while - up to 2 minutes)...
...............................................................done.
availableMemoryMb: 256
entryPoint: GCStoPubsub
eventTrigger:
  eventType: providers/cloud.pubsub/eventTypes/topic.publish
  failurePolicy: {}
  resource: projects/[PROJECT-ID]/topics/intelligentcontentfileupload
latestOperation: operations/c2VjcmV0LXplcGh5ci0xMTIxL3VzLWNlbnRyYWwxL0dDU3RvUHVic3ViL0tRaGxHeVFhZHdR
name: projects/[PROJECT-ID]/locations/us-central1/functions/GCStoPubsub
serviceAccount: [PROJECT-ID]@appspot.gserviceaccount.com
sourceArchiveUrl: gs://[STAGING_BUCKET_NAME]/us-central1-GCStoPubsub-bnnmzdzqtjoo.zip
status: READY
timeout: 60s
updateTime: '2017-09-01T14:59:03Z'
versionId: '01'

Implantar a função visionAPI

  • Implante a Função do Cloud visionAPI, que contém a lógica para receber uma mensagem com o Cloud Pub/Sub, chame a API Vision e encaminhe a mensagem para a Função do Cloud insertIntoBigQuery com outra mensagem do Cloud Pub/Sub. Substitua [STAGING_BUCKET_NAME] pelo nome do bucket de preparo do Cloud Storage e [VISION_TOPIC_NAME] pelo nome do tópico da API Vision.

    gcloud functions deploy visionAPI \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [VISION_TOPIC_NAME] \
      --entry-point visionAPI \
      --runtime=nodejs10

Implantar a função videoIntelligenceAPI

  • Implante a Função do Cloud videoIntelligenceAPI, que contém a lógica para receber uma mensagem com o Cloud Pub/Sub, chame a API Video Intelligence e encaminhe a mensagem para a Função do Cloud insertIntoBigQuery com outra mensagem do Cloud Pub/Sub. Substitua [STAGING_BUCKET_NAME] pelo nome do bucket de preparo do Cloud Storage e [VIDEOIQ_TOPIC_NAME] pelo nome do tópico da API Video Intelligence.

    gcloud functions deploy videoIntelligenceAPI \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [VIDEOIQ_TOPIC_NAME] \
      --entry-point videoIntelligenceAPI \
      --timeout 540 \
      --runtime=nodejs10

Implantar a função insertIntoBigQuery

  • Implante a Função do Cloud insertIntoBigQuery, que contém a lógica para receber uma mensagem com o Cloud Pub/Sub e chamar a API BigQuery para inserir os dados na tabela do BigQuery. Substitua [STAGING_BUCKET_NAME] pelo nome do bucket de preparo do Cloud Storage e [BIGQUERY_TOPIC_NAME] pelo nome do tópico do BigQuery.

    gcloud functions deploy insertIntoBigQuery \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [BIGQUERY_TOPIC_NAME] \
      --entry-point insertIntoBigQuery \
      --runtime=nodejs10

Como testar o fluxo

O diagrama a seguir descreve o fluxo de processamento.

fluxo de processamento

Para testar o processo, faça upload dos arquivos no Cloud Storage, verifique os registros e veja os resultados no BigQuery.

  1. Faça upload de uma imagem e um arquivo de vídeo para [IV_BUCKET_NAME], em que [LOCAL_FILE_NAME] é o nome do arquivo.

    gsutil cp [LOCAL_FILE_NAME] gs://[IV_BUCKET_NAME]
  2. Para verificar se as Funções do Cloud foram acionadas e executadas com sucesso, visualize os registros dos Cloud Functions capturados no Cloud Logging:

    1. Teste GCStoPubsub:

      gcloud functions logs read --filter "finished with status" "GCStoPubsub" --limit 100

      Saída:

      Registro do GCStoPubsub

    2. Teste insertIntoBigQuery:

      gcloud functions logs read --filter "finished with status" "insertIntoBigQuery" --limit 100

      Saída:

      Registro do insertIntoBigQuery

  3. Crie comandos SQL para consultar o BigQuery. Substitua [PROJECT_ID], [DATASET_ID] e [TABLE_NAME] pelo código do projeto, código do conjunto de dados e nome da tabela do BigQuery.

    echo "
    #standardSql
    SELECT insertTimestamp,
    contentUrl,
    flattenedSafeSearch.flaggedType,
    flattenedSafeSearch.likelihood
    FROM \`${PROJECT_ID}.${DATASET_ID}.${TABLE_NAME}\`
    CROSS JOIN UNNEST(safeSearch) AS flattenedSafeSearch
    ORDER BY insertTimestamp DESC,
    contentUrl,
    flattenedSafeSearch.flaggedType
    LIMIT 1000
    " > sql.txt
    
  4. Veja os resultados do BigQuery com o seguinte comando:

    bq --project_id [PROJECT_ID] query < sql.txt

    Saída:

    Resultados do BigQuery

    Como alternativa, faça login na IU da Web do BigQuery e execute as consultas:

    1. Abra https://bigquery.cloud.google.com no navegador.
    2. Clique em Escrever consulta para iniciar uma consulta, como mostrado aqui:

      Escrever consulta

    3. Digite a instrução SQL a seguir na caixa de texto. Substitua [PROJECT_ID], [DATASET_ID] e [TABLE_NAME] pelo código do projeto, código do conjunto de dados e nome da tabela do BigQuery.

      #standardSql
      SELECT insertTimestamp,
      contentUrl,
      flattenedSafeSearch.flaggedType,
      flattenedSafeSearch.likelihood
      FROM `[PROJECT_ID].[DATASET_ID].[TABLE_NAME]`
      CROSS JOIN UNNEST(safeSearch) AS flattenedSafeSearch
      ORDER BY insertTimestamp DESC,
      contentUrl,
      flattenedSafeSearch.flaggedType
      LIMIT 1000
      

      No exemplo a seguir, mostramos a aparência desse SQL na IU:

      consulta SQL

      Saída:

      Resultados da consulta SQL

Limpeza

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que contém os recursos ou mantenha o projeto e exclua os recursos individuais.

Depois de concluir este tutorial, é possível limpar os recursos criados no Google Cloud para que eles não consumam sua cota e você não receba cobranças por eles no futuro. Veja como excluir e desativar esses recursos nas seções a seguir.

Excluir o projeto

A maneira mais fácil de eliminar o faturamento é excluir o projeto que você criou para o tutorial.

Para excluir o projeto:

  1. No Console do Cloud, acesse a página Projetos.
  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir projeto.
  3. Na caixa de diálogo, digite o ID do projeto e clique em Desligar.

Excluir todos os componentes

  1. Exclua os Cloud Functions:

    gcloud functions delete GCStoPubsub
    gcloud functions delete visionAPI
    gcloud functions delete videoIntelligenceAPI
    gcloud functions delete insertIntoBigQuery
  2. Exclua a tabela e o conjunto de dados do BigQuery, substituindo as variáveis pelos valores:

    bq --project_id [PROJECT_ID] rm -r -f [DATASET_ID]
  3. Exclua os buckets do Cloud Storage, substituindo as variáveis pelos valores:

    gsutil -m rm -r gs://[IV_BUCKET_NAME]
    gsutil -m rm -r gs://[FLAGGED_BUCKET_NAME]
    gsutil -m rm -r gs://[FILTERED_BUCKET_NAME]
    gsutil -m rm -r gs://[STAGING_BUCKET_NAME]
  4. Exclua os tópicos do Cloud Pub/Sub, substituindo as variáveis pelos valores:

    gcloud pubsub topics delete [UPLOAD_NOTIFICATION_TOPIC]
    gcloud pubsub topics delete [VISION_TOPIC_NAME]
    gcloud pubsub topics delete [VIDEOIQ_TOPIC_NAME]
    gcloud pubsub topics delete [BIGQUERY_TOPIC_NAME]

A seguir