Tutorial sul rilevamento delle etichette

Pubblico

Questo tutorial è progettato per aiutarti a esplorare e sviluppare applicazioni con l'API Video Intelligence. È progettato per persone che hanno familiarità con Python. Dovresti anche essere in grado di seguirlo con conoscenze limitate di programmazione. Dopo aver seguito questo tutorial, dovresti essere in grado di utilizzare la documentazione di riferimento per creare le tue applicazioni di base.

Questo tutorial descrive un'applicazione API Video Intelligence utilizzando il codice Python. Lo scopo qui non è spiegare le librerie client di Python, ma spiegare come effettuare chiamate all'API Video Intelligence utilizzando la funzionalità di rilevamento delle etichette dei video. Le applicazioni in Java e Node.js sono sostanzialmente simili.

Se stai cercando un esempio di solo codice o un esempio in un'altra lingua, consulta la guida illustrativa complementare.

Prerequisiti

Questo tutorial ha i seguenti prerequisiti:

Aggiungere annotazioni a un video utilizzando il rilevamento etichette

Questo tutorial illustra un'applicazione di base con API Video, utilizzando una richiesta LABEL_DETECTION. Una richiesta LABEL_DETECTION annota un video con etichette (o "tag") selezionate in base ai contenuti dell'immagine. Ad esempio, un video di un treno che attraversa un incrocio potrebbe produrre etichette quali "treno", "trasporti", "passaggio a livello".

Di seguito è riportato l'intero codice necessario per questo tutorial. La maggior parte dei commenti sono stati rimossi da questo codice per evidenziare la brevità del codice. Invece, i commenti vengono forniti in seguito durante la spiegazione del codice.

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)

Questa semplice applicazione esegue le seguenti attività:

  1. Importa le librerie necessarie per eseguire l'applicazione.
  2. Recupera come argomento un file video archiviato nell'URI Cloud Storage e lo passa alla funzione main().
  3. Recupera le credenziali per eseguire il servizio API Video Intelligence.
  4. Crea una richiesta di annotazione video da inviare al servizio video.
  5. Invia la richiesta e restituisce un'operazione a lunga esecuzione.
  6. Crea un loop dell'operazione a lunga esecuzione finché il video non viene elaborato e restituisce i valori disponibili.
  7. Analizza la risposta per il servizio e mostra la risposta all'utente.

Importa librerie

import argparse

from google.cloud import videointelligence

Vengono importate alcune librerie standard: argparse per consentire all'applicazione di accettare i nomi file di input come argomenti e sys per la formattazione dell'output in attesa delle risposte dell'API. Il pacchetto time è stato importato per eseguire alcuni semplici loop di attesa.

Quando utilizzi l'API Video Intelligence, dovrai anche importare google.cloud.videointelligence_v1 e la relativa classe di enumerazione, che contiene la directory delle nostre chiamate API.

Eseguire l'applicazione

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)

In questo caso, l'argomento passato viene analizzato per l'URI Cloud Storage del nome file video e viene passato alla funzione main().

Autenticazione nell'API

Prima di comunicare con il servizio API Video Intelligence, devi autenticare il servizio utilizzando le credenziali acquisite in precedenza. All'interno di un'applicazione, il modo più semplice per ottenere le credenziali è utilizzare le Credenziali predefinite dell'applicazione (ADC). Per impostazione predefinita, ADC tenta di ottenere le credenziali dal file di ambiente GOOGLE_APPLICATION_CREDENTIALS, che deve essere impostato in modo da puntare al file di chiavi JSON dell'account di servizio. Devi aver configurato l'account di servizio e l'ambiente per l'utilizzo di ADC nella Guida rapida.

Crea la richiesta

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

Ora che il servizio API Video Intelligence è pronto, puoi creare una richiesta per quel servizio. Le richieste all'API Video Intelligence vengono fornite come oggetti JSON. Per informazioni complete sulla struttura specifica di una richiesta di questo tipo, consulta la documentazione di riferimento sull'API Video Intelligence.

Questo snippet di codice esegue le seguenti attività:

  1. Crea il codice JSON per una richiesta POST al metodo annotate_video().
  2. Inserisci nella richiesta il percorso Cloud Storage del nome file video passato.
  3. Indica che il metodo annotate deve eseguire LABEL_DETECTION.

Controlla l'operazione

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

Utilizzando la richiesta esistente per l'operazione esistente, viene creato un loop while per verificare periodicamente lo stato di quell'operazione. Quando l'operazione ha indicato che l'operazione è done, la risposta viene analizzata.

Analizza la risposta

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 volta completata l'operazione, la risposta conterrà il risultato in una AnnotateVideoResponse, che consiste in un elenco di annotationResults, uno per ogni video inviato nella richiesta. Poiché nella richiesta è stato inviato un solo video, viene preso il primo segmentLabelAnnotations dei risultati e vengono visualizzate in loop tutte le etichette in segmentLabelAnnotations. Se utilizzi solo segmentLabelAnnotations, questo tutorial mostra solo le annotazioni a livello di video. Ogni segment_label include una descrizione (segment_label.description), un elenco di categorie di entità (segment_label.category_entities) e un elenco di segmenti che identificano l'ora di inizio/fine delle occorrenze di etichetta nel video (deve essere un segmento che copri l'intero video o segmento video nel caso di 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
                  }
                ]
              },
               ...
            ]
         }
      ]
   }
}

Poiché nella richiesta è stato inviato un solo video, viene stampato il primo description del primo risultato.

esegui l'applicazione

Per eseguire l'applicazione, è sufficiente passare l'URI Cloud Storage di un video:

$ 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
...
 

Output

Di seguito è riportato un esempio di un possibile output.

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

Complimenti! Hai eseguito un'attività di annotazione utilizzando l'API Video Intelligence.