Tutorial de detección de etiquetas

Audiencia

Este tutorial se ha diseñado para ayudarte a empezar a explorar y desarrollar aplicaciones con la API Video Intelligence. Está diseñado para personas que tengan conocimientos básicos de Python. También deberías poder seguir el curso aunque tengas pocos conocimientos de programación. Después de completar este tutorial, deberías poder usar la documentación de referencia para crear tus propias aplicaciones básicas.

Este tutorial avanza a través de una aplicación de la API Video Intelligence que usa el código de Python. El objetivo no es explicar las bibliotecas de cliente de Python, sino cómo hacer llamadas a la API Video Intelligence mediante la función de detección de etiquetas de vídeo. Las aplicaciones en Java y Node.js son esencialmente similares.

Si buscas un ejemplo que solo incluya código o un ejemplo en otro idioma, consulta la guía práctica complementaria.

Requisitos previos

Para hacer este tutorial, debes cumplir los siguientes requisitos:

Anotar un vídeo mediante la detección de etiquetas

En este tutorial se explica cómo usar una aplicación básica de la API Video mediante una solicitud LABEL_DETECTION. Una solicitud LABEL_DETECTION anota un vídeo con etiquetas que se seleccionan en función del contenido de la imagen. Por ejemplo, un vídeo de un tren en un cruce puede generar etiquetas como "tren", "transporte" y "cruce ferroviario".

A continuación, se muestra el código completo necesario para este tutorial. La mayoría de los comentarios se han eliminado de este código para destacar lo breve que es. En su lugar, los comentarios se proporcionan más adelante a medida que analizamos el 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 sencilla aplicación realiza las siguientes tareas:

  1. Importa las bibliotecas necesarias para ejecutar la aplicación.
  2. Toma un archivo de vídeo almacenado en un URI de Cloud Storage como argumento y lo transfiere a la función main().
  3. Obtiene las credenciales para ejecutar el servicio de la API Video Intelligence.
  4. Crea una solicitud de anotación de vídeo para enviarla al servicio de vídeo.
  5. Envía la solicitud y devuelve una operación de larga duración.
  6. Itera sobre la operación de larga duración hasta que se procese el vídeo y devuelve los valores disponibles.
  7. Analiza la respuesta del servicio y la muestra al usuario.

Importar bibliotecas

import argparse

from google.cloud import videointelligence

Se importan algunas bibliotecas estándar: argparse para permitir que la aplicación acepte nombres de archivo de entrada como argumentos y sys para dar formato a la salida mientras espera las respuestas de la API. El paquete time se importa para ejecutar algunos bucles de espera sencillos.

Cuando uses la API Video Intelligence, también tendrás que importar google.cloud.videointelligence_v1 y su clase de enumeración, que contiene el directorio de nuestras llamadas a la API.

Ejecutar la aplicación

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)

En este caso, el argumento transferido se analiza para obtener el URI de Cloud Storage del nombre de archivo de vídeo y se transfiere a la función main().

Autenticar en la API

Antes de comunicarte con el servicio de API Video Intelligence, debes autenticar tu servicio mediante las credenciales adquiridas previamente. En una aplicación, la forma más sencilla de obtener credenciales es usar las credenciales predeterminadas de la aplicación (ADC). De forma predeterminada, ADC intenta obtener las credenciales del archivo de entorno GOOGLE_APPLICATION_CREDENTIALS, que debe configurarse para que apunte al archivo JSON de la clave de tu cuenta de servicio. (Deberías haber configurado tu cuenta de servicio y tu entorno para usar ADC en la guía de inicio rápido.

Construir la solicitud

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

Ahora que el servicio de la API Video Intelligence está listo, puedes crear una solicitud a ese servicio. Las solicitudes a la API Video Intelligence se envían como objetos JSON. Consulta la referencia de la API Video Intelligence para obtener información detallada sobre la estructura concreta de estas solicitudes.

Este fragmento de código realiza las siguientes tareas:

  1. Crea el JSON de una solicitud POST al método annotate_video().
  2. Inserta la ubicación de Cloud Storage del nombre de archivo de vídeo proporcionado en la solicitud.
  3. Indica que el método annotate debe realizar LABEL_DETECTION.

Comprobar la operación

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

Con la solicitud de operación de la operación en curso, se crea un bucle while para comprobar periódicamente el estado de esa operación. Una vez que la operación haya indicado que es done, se analiza la respuesta.

Analizar la respuesta

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

Una vez que se haya completado la operación, la respuesta contendrá el resultado en un AnnotateVideoResponse, que consta de una lista de annotationResults, uno por cada vídeo enviado en la solicitud. Como solo se ha enviado un vídeo en la solicitud, se toma el primer segmentLabelAnnotations de los resultados y se recorren todas las etiquetas de segmentLabelAnnotations. Si solo usas segmentLabelAnnotations, en este tutorial solo se mostrarán las anotaciones a nivel de vídeo. Cada segment_label incluye una descripción (segment_label.description), una lista de categorías de entidades (segment_label.category_entities) y una lista de segmentos que identifican la hora de inicio y de finalización de las apariciones de la etiqueta en el vídeo (debe ser un segmento que abarque todo el vídeo o el segmento de vídeo en el 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
                  }
                ]
              },
               ...
            ]
         }
      ]
   }
}

Como solo se ha enviado un vídeo en la solicitud, se imprime el primer description del primer resultado.

Ejecutar la aplicación

Para ejecutar la aplicación, solo tienes que pasarle el URI de Cloud Storage de un 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
...
 

Salida

A continuación se muestra un ejemplo de un posible 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

¡Enhorabuena! Has realizado una tarea de anotación con la API Video Intelligence.