Tutorial de deteção de etiquetas

Público-alvo

Este tutorial foi concebido para ajudar a começar a explorar e desenvolver aplicações com a Video Intelligence API. Foi concebido para pessoas com conhecimentos básicos de Python. Também deve conseguir seguir as instruções com conhecimentos de programação limitados. Depois de seguir este tutorial, deve conseguir usar a documentação de referência para criar as suas próprias aplicações básicas.

Este tutorial explica passo a passo uma aplicação da API Video Intelligence que usa código Python. O objetivo aqui não é explicar as bibliotecas cliente Python, mas sim explicar como fazer chamadas para a API Video Intelligence através da funcionalidade de deteção de etiquetas de vídeo. As aplicações em Java e Node.js são essencialmente semelhantes.

Se procura um exemplo apenas com código ou um exemplo noutro idioma, consulte o guia de instruções complementar.

Pré-requisitos

Este tutorial tem os seguintes pré-requisitos:

Anote um vídeo através da deteção de etiquetas

Este tutorial explica como criar uma aplicação básica da API Video com um pedido LABEL_DETECTION. Um pedido LABEL_DETECTION anota um vídeo com etiquetas (ou "tags") selecionadas com base no conteúdo da imagem. Por exemplo, um vídeo de um comboio numa passagem de nível pode gerar etiquetas como "comboio", "transportes" e "passagem de nível".

Segue-se o código completo necessário para este tutorial. A maioria dos comentários foi removida deste código para realçar a sua brevidade. Em alternativa, os comentários são fornecidos mais tarde à medida que analisamos o código.

import argparse

from google.cloud import videointelligence



def analyze_labels(path):
    """Detects labels given a GCS path."""
    video_client = videointelligence.VideoIntelligenceServiceClient()
    features = [videointelligence.Feature.LABEL_DETECTION]
    operation = video_client.annotate_video(
        request={"features": features, "input_uri": path}
    )
    print("\nProcessing video for label annotations:")

    result = operation.result(timeout=90)
    print("\nFinished processing.")

    segment_labels = result.annotation_results[0].segment_label_annotations
    for i, segment_label in enumerate(segment_labels):
        print("Video label description: {}".format(segment_label.entity.description))
        for category_entity in segment_label.category_entities:
            print(
                "\tLabel category description: {}".format(category_entity.description)
            )

        for i, segment in enumerate(segment_label.segments):
            start_time = (
                segment.segment.start_time_offset.seconds
                + segment.segment.start_time_offset.microseconds / 1e6
            )
            end_time = (
                segment.segment.end_time_offset.seconds
                + segment.segment.end_time_offset.microseconds / 1e6
            )
            positions = "{}s to {}s".format(start_time, end_time)
            confidence = segment.confidence
            print("\tSegment {}: {}".format(i, positions))
            print("\tConfidence: {}".format(confidence))
        print("\n")


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("path", help="GCS file path for label detection.")
    args = parser.parse_args()

    analyze_labels(args.path)

Esta aplicação simples realiza as seguintes tarefas:

  1. Importa as bibliotecas necessárias para executar a aplicação.
  2. Usa um ficheiro de vídeo armazenado no URI do Cloud Storage como argumento e transmite-o à função main().
  3. Obtém credenciais para executar o serviço da API Video Intelligence.
  4. Cria um pedido de anotação de vídeo para enviar ao serviço de vídeo.
  5. Envia o pedido e devolve uma operação de longa duração.
  6. Faz um ciclo sobre a operação de longa duração até o vídeo ser processado e devolve os valores disponíveis.
  7. Analisa a resposta para o serviço e apresenta-a ao utilizador.

Importe bibliotecas

import argparse

from google.cloud import videointelligence

São importadas algumas bibliotecas padrão: argparse para permitir que a aplicação aceite nomes de ficheiros de entrada como argumentos e sys para formatar a saída enquanto aguarda respostas da API. O pacote time é importado para executar alguns ciclos de espera simples.

Quando usar a Video Intelligence API, também tem de importar o google.cloud.videointelligence_v1 e a respetiva classe de enumeração, que contém o diretório das nossas chamadas API.

Execute a aplicação

parser = argparse.ArgumentParser(
    description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument("path", help="GCS file path for label detection.")
args = parser.parse_args()

analyze_labels(args.path)

Aqui, o argumento transmitido é analisado para o URI do Cloud Storage do nome do ficheiro de vídeo e é transmitido para a função main().

Autentique-se na API

Antes de comunicar com o serviço Video Intelligence API, tem de autenticar o seu serviço através de credenciais adquiridas anteriormente. Numa aplicação, a forma mais simples de obter credenciais é usar as Credenciais padrão da aplicação (ADC). Por predefinição, o ADC tenta obter credenciais a partir do ficheiro de ambiente GOOGLE_APPLICATION_CREDENTIALS, que deve ser definido para apontar para o ficheiro de chave JSON da sua conta de serviço. (Deve ter configurado a sua conta de serviço e ambiente para usar o ADC no guia de início rápido.

Construa o pedido

video_client = videointelligence.VideoIntelligenceServiceClient()
features = [videointelligence.Feature.LABEL_DETECTION]
operation = video_client.annotate_video(
    request={"features": features, "input_uri": path}
)

Agora que o serviço Video Intelligence API está pronto, pode criar um pedido para esse serviço. Os pedidos à API Video Intelligence são fornecidos como objetos JSON. Consulte a referência da API Video Intelligence para informações completas sobre a estrutura específica de tal pedido.

Este fragmento do código realiza as seguintes tarefas:

  1. Constrói o JSON para um pedido POST para o método annotate_video().
  2. Injeta a localização do Cloud Storage do nome do ficheiro de vídeo transmitido no pedido.
  3. Indica que o método annotate deve executar LABEL_DETECTION.

Verifique a operação

result = operation.result(timeout=90)
print("\nFinished processing.")

Usando o pedido de operação existente para a operação existente, é construído um ciclo while para verificar periodicamente o estado dessa operação. Assim que a operação indicar que está done, a resposta é analisada.

Analise a resposta

segment_labels = result.annotation_results[0].segment_label_annotations
for i, segment_label in enumerate(segment_labels):
    print("Video label description: {}".format(segment_label.entity.description))
    for category_entity in segment_label.category_entities:
        print(
            "\tLabel category description: {}".format(category_entity.description)
        )

    for i, segment in enumerate(segment_label.segments):
        start_time = (
            segment.segment.start_time_offset.seconds
            + segment.segment.start_time_offset.microseconds / 1e6
        )
        end_time = (
            segment.segment.end_time_offset.seconds
            + segment.segment.end_time_offset.microseconds / 1e6
        )
        positions = "{}s to {}s".format(start_time, end_time)
        confidence = segment.confidence
        print("\tSegment {}: {}".format(i, positions))
        print("\tConfidence: {}".format(confidence))
    print("\n")

Assim que a operação estiver concluída, a resposta vai conter o resultado num AnnotateVideoResponse, que consiste numa lista de annotationResults, um para cada vídeo enviado no pedido. Uma vez que apenas foi enviado um vídeo no pedido, é usado o primeiro segmentLabelAnnotations dos resultados. Todas as etiquetas em segmentLabelAnnotations são processadas em ciclo. Se usar apenas segmentLabelAnnotations, este tutorial apresenta apenas anotações ao nível do vídeo. Cada segment_label inclui uma descrição (segment_label.description), uma lista de categorias de entidades (segment_label.category_entities) e uma lista de segmentos que identificam a hora de início/fim das ocorrências da etiqueta no vídeo (deve ser um segmento que abranja todo o vídeo ou segmento de vídeo no caso de segment_label_annotations).

{
   "name":"us-west1.12089999971048628582",
   "metadata":{
      "@type":"type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoProgress",
      "annotationProgress":[
         {
            "inputUri":"gs://YOUR_BUCKET/YOUR_OBJECT",
            "updateTime":"2020-01-31T01:49:52.498015Z",
            "startTime":"2020-01-31T01:49:43.056481Z"
         }
      ]
   },
   "done": true,
   "response":{
      "@type":"type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoResponse",
      "annotationResults":[
         {
            "inputUri":"gs://YOUR_BUCKET/YOUR_OBJECT",
            "segmentLabelAnnotations": [
              {
                "entity": {
                  "entityId": "/m/01yrx",
                  "languageCode": "en-US"
                },
                "segments": [
                  {
                    "segment": {
                      "startTimeOffset": "0s",
                      "endTimeOffset": "14.833664s"
                    },
                    "confidence": 0.98509187
                  }
                ]
              },
               ...
            ]
         }
      ]
   }
}

Uma vez que apenas foi enviado um vídeo no pedido, é apresentado o primeiro description do primeiro resultado.

Execute a sua aplicação

Para executar a sua aplicação, basta transmitir-lhe o URI do Cloud Storage de um vídeo:

$ python labels.py gs://YOUR_BUCKET/YOUR_OBJECT
Operation us-west1.4757250774497581229 started: 2020-01-30T01:46:30.158989Z
Operation processing ...
The video has been successfully processed.

Video label description: urban area
        Label category description: city
        Segment 0: 0.0s to 38.752016s
        Confidence: 0.946980476379


Video label description: traffic
        Segment 0: 0.0s to 38.752016s
        Confidence: 0.94105899334


Video label description: vehicle
        Segment 0: 0.0s to 38.752016s
        Confidence: 0.919958174229
...
 

Resultado

Segue-se um exemplo de um possível resultado.

Processing video for label annotations:

Finished processing. Video label description: crowd Label category description: people Segment 0: 0.0s to 60.24s Confidence: 0.527720749378

Video label description: official Label category description: person Segment 0: 0.0s to 60.24s Confidence: 0.372822880745

Video label description: audience Label category description: people Segment 0: 0.0s to 60.24s Confidence: 0.501719772816

Video label description: news Segment 0: 0.0s to 60.24s Confidence: 0.867252230644

Video label description: people Label category description: person Segment 0: 0.0s to 60.24s Confidence: 0.46747264266

Video label description: politics Segment 0: 0.0s to 60.24s Confidence: 0.319397002459

Parabéns! Realizou uma tarefa de anotação com a Video Intelligence API!