Tutorial sul rilevamento del cambio di inquadratura

Pubblico

Questo tutorial è stato pensato per consentirti di iniziare rapidamente a esplorare e lo sviluppo di applicazioni con l'API Video Intelligence. È pensato per chi ha dimestichezza con la programmazione di base, anche se dovresti riuscire a seguire la guida anche senza molte conoscenze in materia. Dopo aver seguito questo tutorial, dovresti essere in grado di utilizzare la documentazione di riferimento per creare le tue applicazioni di base.

Questo tutorial illustra i passaggi di un'applicazione API Video Intelligence che utilizza Python le API nel tuo codice. Lo scopo non è spiegare le librerie client Python, ma spiegare come effettuare chiamate all'API Video Intelligence. Le applicazioni in Java e Node.js sono essenzialmente simili.

Se cerchi un esempio solo di codice o un esempio in un'altra lingua, consulta la guida di istruzioni complementare.

Prerequisiti

Questo tutorial ha diversi prerequisiti:

Annota un video utilizzando il rilevamento del cambio di inquadratura

Questo tutorial illustra un'applicazione di base dell'API Video che utilizza una richiesta SHOT_CHANGE_DETECTION. Una richiesta SHOT_CHANGE_DETECTION fornisce i risultati dell'annotazione:

  • Elenco di tutte le riprese all'interno del video
  • Per ogni inquadratura, fornisci l'ora di inizio e di fine

Mostreremo prima l'intero codice. Tieni presente che abbiamo rimosso la maggior parte dei commenti da questo codice per mostrarti quanto sia breve. Forniremo ulteriori commenti man mano che esamini il codice.

import argparse

from google.cloud import videointelligence



def analyze_shots(path):
    """Detects camera shot changes."""
    video_client = videointelligence.VideoIntelligenceServiceClient()
    features = [videointelligence.Feature.SHOT_CHANGE_DETECTION]
    operation = video_client.annotate_video(
        request={"features": features, "input_uri": path}
    )
    print("\nProcessing video for shot change annotations:")

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


    for i, shot in enumerate(result.annotation_results[0].shot_annotations):
        start_time = (
            shot.start_time_offset.seconds + shot.start_time_offset.microseconds / 1e6
        )
        end_time = (
            shot.end_time_offset.seconds + shot.end_time_offset.microseconds / 1e6
        )
        print("\tShot {}: {} to {}".format(i, start_time, end_time))


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

    analyze_shots(args.path)

Questa semplice applicazione esegue le seguenti attività:

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

Esamineremo questi passaggi in modo più dettagliato di seguito.

Importa librerie

import argparse

from google.cloud import videointelligence

Importiamo argparse per consentire all'applicazione di accettare i nomi file di input come argomenti.

Per utilizzare l'API Video Intelligence, importiamo anche Libreria google.cloud.videointelligence, che contiene la directory della nostra API di chiamate e costanti di enumerazione.

Esegui l'applicazione

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

analyze_shots(args.path)

Qui analizziamo l'argomento passato per l'URI Google Cloud Storage del nome file del video e lo passiamo alla funzione main().

Autenticazione nell'API

Prima di comunicare con il servizio dell'API Video Intelligence, devi autenticare il tuo 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, l'ADC tenterà di ottenere le credenziali dal file di ambiente GOOGLE_APPLICATION_CREDENTIALS, che deve essere impostato in modo da puntare al file della chiave JSON dell'account di servizio. Dovresti aver configurato l'account di servizio e l'ambiente per utilizzare ADC nella guida rapida. Per ulteriori informazioni, consulta Configurare un account servizio.

Crea la richiesta

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

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

Questo snippet di codice esegue le seguenti attività:

  1. Costruisce il JSON per una richiesta POST al metodo annotate_video().
  2. Inserisce il percorso Google Cloud Storage del nome file del video trasmesso in la richiesta.
  3. Indica che il metodo annotate deve eseguire una SHOT_CHANGE_DETECTION.

Costruisci l'operazione a lunga esecuzione

Quando eseguiamo per la prima volta una richiesta all'API Video Intelligence, non получаем immediato; al suo posto viene visualizzato un nome operazione, memorizzato nel campo name della risposta, che possiamo poi utilizzare per verificare la presenza di risultati in un secondo momento.

Se passi il nome dell'operazione (che è una stringa numerica) al metodo Operations Service operations dell'API Video Intelligence, viene restituito lo stato corrente dell'operazione. Di seguito è riportato un esempio di risposta:

{
   "response":{
      "@type":"type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoResponse"
   },
   "name":"us-west1.17159971042783089144",
   "metadata":{
      "annotationProgress":[
         {
            "inputUri":"/video/gbikes_dinosaur.mp4",
            "updateTime":"2017-01-27T19:45:54.297807Z",
            "startTime":"2017-01-27T19:45:54.275023Z"
         }
      ],
      "@type":"type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoProgress"
   }
}

Tieni presente che al momento il campo response contiene solo un campo @type, che indica il tipo di risposta. Una volta che i risultati saranno effettivamente disponibili, il campo di risposta conterrà i risultati di quel tipo.

Controlla l'operazione

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

Utilizzando la richiesta di operazione esistente per l'operazione esistente, creiamo una while per controllare periodicamente lo stato dell'operazione. Una volta che le nostre dell'operazione ha indicato che l'operazione è done, usciamo dal ciclo e può analizzare la risposta.

Analizza la risposta

for i, shot in enumerate(result.annotation_results[0].shot_annotations):
    start_time = (
        shot.start_time_offset.seconds + shot.start_time_offset.microseconds / 1e6
    )
    end_time = (
        shot.end_time_offset.seconds + shot.end_time_offset.microseconds / 1e6
    )
    print("\tShot {}: {} to {}".format(i, start_time, end_time))

Al termine dell'operazione, la risposta conterrà un AnnotateVideoResponse, costituito da un elenco di annotationResults, uno per ogni video inviato nella richiesta. Poiché nella richiesta abbiamo inviato un solo video, prendiamo il primo shotAnnotations del risultato. Esaminiamo in dettaglio i "segmenti" per il video.

Esegui l'applicazione

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

$ python shotchange.py gs://cloud-samples-data/video/gbikes_dinosaur.mp4
operationId=us-west1.12468772851081463748
Operation us-west1.12468772851081463748 started: 2017-01-30T01:53:45.981043Z
Processing video for shot change annotations:
Finished processing.
  Shot 0: 0.0 to 5.166666
  Shot 1: 5.233333 to 10.066666
  Shot 2: 10.1 to 28.133333
  Shot 3: 28.166666 to 42.766666

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