Tutorial sul rilevamento del cambio di inquadratura

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Pubblico

Questo tutorial è progettato per consentirti di iniziare a esplorare e sviluppare rapidamente le applicazioni con l'API Video Intelligence. È progettato per le persone che hanno familiarità con la programmazione di base, anche se non hanno conoscenze approfondite 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 illustra un'applicazione API Video Intelligence che utilizza il codice Python. Lo scopo non è spiegare le librerie client per Python, ma spiegare come effettuare chiamate all'API Video Intelligence. Le applicazioni in Java e Node.js sono essenzialmente simili.

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

Prerequisiti

Questo tutorial prevede diversi prerequisiti:

Annota un video con la funzionalità di rilevamento del cambio di inquadratura

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

  • Elenco di tutti gli scatti che si verificano nel video
  • Per ogni scatto, specifica l'ora di inizio e quella di fine

Prima mostreremo il codice completo. Tieni presente che abbiamo rimosso la maggior parte dei commenti da questo codice al fine di mostrarti la breve durata del codice. Forniremo ulteriori commenti man mano che esamineremo 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 applicazione semplice esegue le attività seguenti:

  • importa le librerie necessarie per eseguire l'applicazione.
  • Recupera un file video archiviato nell'URI Cloud Storage come argomento e passalo 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 il loop dell'operazione a lunga esecuzione fino a quando il video non viene elaborato e restituisce i valori disponibili.
  • Analizza la risposta per il servizio e mostra la risposta all'utente.

Più avanti tratteremo questi passaggi più nel dettaglio.

Importa librerie

import argparse

from google.cloud import videointelligence

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

Per l'utilizzo dell'API Video Intelligence, importiamo anche la libreria google.cloud.videointelligence, che contiene la directory delle chiamate e delle costanti di enumerazione delle API.

Esegui la tua 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 video e lo trasmettiamo 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 Credenziali predefinite dell'applicazione. Per impostazione predefinita, ADC proverà a 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 il tuo account di servizio e il tuo ambiente in modo da utilizzare ADC nella guida rapida. Per ulteriori informazioni, consulta la sezione Configurare un account di 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 nostro servizio API Video Intelligence è pronto, possiamo creare una richiesta per quel servizio. Le richieste all'API Video Intelligence vengono fornite come oggetti JSON. Consulta il riferimento dell'API Video Intelligence per informazioni complete sulla struttura specifica di tale richiesta.

Questo snippet di codice esegue le seguenti attività:

  1. Crea il file JSON per una richiesta POST al metodo annotate_video().
  2. Aggiunge nella richiesta la posizione di Google Cloud Storage del nome del file video passato.
  3. Indica che il metodo annotate deve eseguire un SHOT_CHANGE_DETECTION.

Crea l'operazione a lunga esecuzione

Quando eseguiamo una richiesta per la prima volta contro l'API Video Intelligence, non otteniamo un risultato immediato, ma riceviamo un nome operazione, memorizzato nel campo name della risposta, che possiamo utilizzare per verificare i risultati in un secondo momento.

Il passaggio del nome dell'operazione (che è una stringa numerica) al metodo operationsVideo Operations Intelligence API operations restituisce 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 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, creiamo un loop while per controllare periodicamente lo stato di tale operazione. Se la nostra operazione indica che l'operazione è done, usiamo il loop e possiamo 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))

Una volta completata l'operazione, la risposta conterrà una annotateVideoResponse, che è composta da un elenco di annotationResults, uno per ogni video inviato nella richiesta. Poiché abbiamo inviato un solo video nella richiesta, prendiamo il primo shotAnnotations del risultato. Esaminiamo tutti i &segmenti da visualizzare al video.

Esegui la nostra applicazione.

Per eseguire la nostra applicazione, è sufficiente trasmetterla all'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.