Filtro movimento di Vertex AI Vision

1. Obiettivi

Panoramica

Questo codelab si concentra sulla creazione di un'applicazione Vertex AI Vision end-to-end per dimostrare l'invio di video con la funzionalità di filtro dei movimenti. In questo tutorial esamineremo i diversi parametri nella configurazione del filtro movimento:

  • Sensibilità del rilevamento dei movimenti
  • Durata minima dell'evento
  • Finestra temporale
  • Tempo di raffreddamento
  • Zona di rilevamento dei movimenti

Cosa imparerai a fare

  • Come importare i video per lo streaming
  • Diverse funzionalità disponibili in Filtro movimento e come utilizzarle
  • Dove controllare le statistiche del filtro movimento
  • Come regolare l'impostazione in base al video

2. Prima di iniziare

  1. Nella console Google Cloud, nella pagina di selezione del progetto, seleziona o crea un progetto Google Cloud. Nota: se non prevedi di conservare le risorse che crei in questa procedura, crea un progetto invece di selezionarne uno esistente. Una volta completata questa procedura, puoi eliminare il progetto e tutte le relative risorse. Vai al selettore dei progetti
  2. Verifica che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come controllare se la fatturazione è abilitata per un progetto.
  3. Abilita le API Compute Engine e Vision AI. Abilita le API

Crea un account di servizio:

  1. Nella console Google Cloud, vai alla pagina Crea account di servizio. Vai a Crea account di servizio
  2. Seleziona il progetto.
  3. Nel campo Nome account di servizio, inserisci un nome. La console Google Cloud compila il campo ID account di servizio in base a questo nome. Nel campo Descrizione account di servizio, inserisci una descrizione. Ad esempio, Account di servizio per la guida rapida.
  4. Fai clic su Crea e continua.
  5. Per fornire l'accesso al progetto, concedi i seguenti ruoli all'account di servizio: Vision AI > Editor Vision AI, Compute Engine > Amministratore istanze Compute (beta), Storage > Visualizzatore oggetti Storage † . Nell'elenco Seleziona un ruolo, seleziona un ruolo. Per altri ruoli, fai clic su Aggiungi un altro ruolo e aggiungi ogni ruolo aggiuntivo. Nota: il campo Ruolo influisce sulle risorse a cui può accedere il tuo account di servizio nel progetto. Puoi revocare questi ruoli o concederne altri in un secondo momento. Negli ambienti di produzione, non concedere i ruoli Proprietario, Editor o Visualizzatore. Concedi invece un ruolo predefinito o un ruolo personalizzato che soddisfi le tue esigenze.
  6. Fai clic su Continua.
  7. Fai clic su Fine per completare la creazione dell'account di servizio. Non chiudere la finestra del browser. Lo utilizzerai nel passaggio successivo.

Crea una chiave dell'account di servizio:

  1. Nella console Google Cloud, fai clic sull'indirizzo email dell'account di servizio che hai creato.
  2. Fai clic su Chiavi.
  3. Fai clic su Aggiungi chiave e poi su Crea nuova chiave.
  4. Fai clic su Crea. Un file della chiave JSON viene scaricato sul computer.
  5. Fai clic su Chiudi.
  6. Installa e inizializza Google Cloud CLI.

† Il ruolo è necessario solo se copi un file video di esempio da un bucket Cloud Storage.

3. Filtro di movimento

Il filtro Movimento acquisisce segmenti di video di prodotti e in movimento che contengono eventi di movimento. Modificando la sensibilità al movimento, la durata minima dell'evento, la finestra temporale, il periodo di attesa e la zona di rilevamento dei movimenti, l'utente può configurare il filtro in base alle proprie esigenze.

Configurazione del filtro movimento

Nel filtro movimento sono disponibili 5 configurazioni per la personalizzazione.

  1. Sensibilità di rilevamento del movimento: indica quanto deve essere sensibile il rilevamento del movimento.
  2. Durata minima evento: la durata minima di un evento di movimento che verrà acquisito.
  3. Finestra temporale: il tempo che deve trascorrere prima che la registrazione del video inizi prima che venga rilevato un evento di movimento.
  4. Periodo di attesa: al termine di un evento di movimento, viene effettuato un periodo di attesa con la durata specificata. Durante il periodo di attesa, gli eventi di movimento non verranno attivati.
  5. Zona di rilevamento dei movimenti: zona configurata dall'utente per specificare dove deve essere eseguito il rilevamento dei movimenti. (verrà descritto in una sezione successiva)

Sensibilità di rilevamento del movimento

Utilizza il flag motion_detection_sensitivity nel comando vaictl.
Stringa. Mezzo predefinito. Puoi scegliere tra Bassa, Media o Alta.

Maggiore è la sensibilità del rilevamento del movimento, maggiore è la sensibilità al rumore e ai movimenti più piccoli. Questa impostazione è consigliata per le situazioni in cui sono presenti oggetti in movimento più piccoli (ad esempio persone da lontano) e illuminazione stabile.

D'altra parte, la sensibilità ridotta è meno sensibile alle interferenze dell'illuminazione. Questa impostazione è perfetta per le interferenze di illuminazione, ad esempio in ambienti esterni, e per una qualità video inferiore, in cui potrebbero esserci più rumori. Poiché questa impostazione è il filtro più aggressivo di tutti, potrebbe ignorare i movimenti di piccoli oggetti.

Durata minima degli eventi

Utilizza il flag min_event_length_in_seconds nel comando vaictl.
Numero intero. Il valore predefinito è 10 secondi. Intervallo compreso tra 0 e 3600 secondi.

La durata minima dei video degli eventi di movimento che verranno analizzati una volta rilevato un segmento di eventi di movimento nel frame.

Finestra temporale

Utilizza il flag look_back_window_in_seconds nel comando vaictl.
Numero intero. Il valore predefinito è 3 secondi. Intervallo compreso tra 0 e 3600 secondi.

La finestra temporale indica il periodo di tempo memorizzato nella cache prima che venga rilevato un evento di movimento. È utile quando ci interessa vedere cosa succede nell'inquadratura pochi secondi prima che vengano rilevati eventi di movimento.

Periodo di attesa

Utilizza il flag cool_down_period_in_seconds nel comando vaictl.
Numero intero. Il valore predefinito è 300 secondi. Intervallo compreso tra 0 e 3600 secondi.

Il periodo di attesa indica il tempo per cui il rilevamento dei movimenti viene messo in pausa dopo che è stato acquisito un evento di movimento. Durante il periodo di attesa, non verrà eseguito alcun calcolo per rilevare il movimento.

4. Esempio di filtro di movimento di base

Manuale dell'SDK Vaictl

Per consultare il manuale di vaictl per lo stream di input con filtro movimento, utilizza il comando riportato di seguito.

vaictl send video-file applying motion-filter -h

Preparare un video di esempio

  1. Puoi copiare un video di esempio con il seguente comando gsutil cp. Sostituisci la seguente variabile:
  • ORIGINE: la posizione di un file video da utilizzare. Puoi utilizzare la tua sorgente file video (ad esempio gs://BUCKET_NAME/FILENAME.mp4) o il video di esempio (gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4)(video con persone e veicoli, source)
export SOURCE=gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4
gsutil cp $SOURCE .

Prepara le variabili di ambiente

Imposta le seguenti variabili di ambiente per utilizzare il modello di comando fornito.

variabili vaictl

  • PROJECT_ID: l'ID del tuo progetto Google Cloud.
  • LOCATION_ID: l'ID della tua località. Ad esempio us-central1. Per ulteriori informazioni, consulta Località cloud.
  • LOCAL_FILE: il nome di un file video locale. Ad esempio street_vehicles_people.mp4.
  • Flag -loop: facoltativo. Esegue il looping dei dati del file per simulare lo streaming.
export PROJECT_ID=<Your Google Cloud project ID>
export LOCATION_ID=us-central1

Variabili del filtro di movimento

  • MOTION_SENSITIVITY: la sensibilità del rilevamento dei movimenti.
  • MIN_EVENT_LENGTH: durata minima degli eventi di movimento.
  • LOOK_BACK_WINDOW: la durata da acquisire prima del primo movimento in un evento di movimento.
  • COOL_DOWN_PERIOD: il periodo in cui il rilevamento dei movimenti viene messo in pausa dopo l'acquisizione di un evento di movimento.
export MOTION_SENSITIVITY=<low or medium or high>
export MIN_EVENT_LENGTH=<0-3600>
export LOOK_BACK_WINDOW=<0-3600>
export COOL_DOWN_PERIOD=<0-3600>

Preparare il comando del filtro movimento

Esistono due opzioni per utilizzare il filtro di movimento con lo stream di input. La prima è inviare gli eventi di movimento a uno stream nella console Cloud. La seconda opzione è inviare gli eventi di movimento allo spazio di archiviazione locale.

Invio dei risultati alla console cloud

Puoi utilizzare vaictl per trasmettere in streaming i dati video di output alla console cloud. Per iniziare, attiva l'API Vision AI nella console Cloud.

Registra un nuovo stream

  1. Fai clic sulla scheda Stream nel riquadro a sinistra di Vertex AI Vision.
  2. Fai clic su Registrati
  3. In Nome stream, inserisci motion-detection-stream
  4. Nella regione, inserisci us-central1
  5. Fai clic su Registrati

Invio dei risultati allo stream

Questo comando trasmette in streaming un file video a uno stream. Se utilizzi il flag –loop, il video rimane in loop nello stream fino a quando non interrompi il comando. Eseguiremo questo comando come job in background in modo che lo streaming continui.

Aggiungi nohup all'inizio e & alla fine per creare un job in background.

INPUT_VIDEO=street_vehicles_people.mp4

vaictl -p $PROJECT \
       -l $LOCATION_ID \
       -c application-cluster-0 \
       --service-endpoint visionai.googleapis.com \
  send video-file  --file-path $INPUT_VIDEO \
  applying motion-filter
         --motion-sensitivity=$MOTION_SENSITIVITY \
         --min-event-length=$MIN_EVENT_LENGTH \
         --lookback-length=$LOOK_BACK_WINDOW \
         --cooldown-length=$COOL_DOWN_PERIOD \
  to streams motion-detection-stream --loop

Potrebbero essere necessari circa 100 secondi tra l'avvio dell'operazione di importazione vaictl e la visualizzazione del video nella dashboard.

Una volta che l'importazione dello stream è disponibile, puoi visualizzare il feed video nella scheda Stream della dashboard di Vertex AI Vision selezionando lo stream traffic-stream.

Vai alla scheda Stream

Invio dei risultati allo spazio di archiviazione locale

Questo comando trasmette in streaming un file video a uno stream.

Aggiungi nohup all'inizio e & alla fine per renderlo un job in background.

INPUT_VIDEO=street_vehicles_people.mp4
OUTPUT_PATH=<path_to_store_motion_events_on_local_disk>

nohup vaictl -p $PROJECT \
             -l $LOCATION_ID \
             -c application-cluster-0 \
             --service-endpoint visionai.googleapis.com \
  send video-file  --file-path $INPUT_VIDEO \
  applying motion-filter
         --motion-sensitivity=$MOTION_SENSITIVITY \
         --min-event-length=$MIN_EVENT_LENGTH \
         --lookback-length=$LOOK_BACK_WINDOW \
         --cooldown-length=$COOL_DOWN_PERIOD \
  to mp4file --mp4-file-path=$OUTPUT_PATH --loop

5. Zona di rilevamento dei movimenti

In questa sezione approfondiremo l'utilizzo della zona di rilevamento dei movimenti e come configurarla. Lo scopo della zona è migliorare il rilevamento dei movimenti mascherando i movimenti provenienti da aree che non ti interessano.

Le zone di rilevamento dei movimenti hanno due tipi: (1) zone positive in cui il rilevamento dei movimenti funziona solo nell'area annotata; (2) zone negative in cui il rilevamento dei movimenti ignora qualsiasi movimento nell'area annotata.

Annotazione zona

Utilizza il flag zone_annotation nel comando vaictl per inserire le coordinate dei poligoni delle zone.
Stringa. Valore predefinito vuoto per l'annotazione delle zone.

L'annotazione delle zone sarà una stringa inserita dall'utente che indica le zone del frame che l'utente vuole nascondere o mettere a fuoco. Per annotare la zona, l'utente dovrà specificare le coordinate dell'immagine dell'asse x e dell'asse y per ogni nodo della zona. Una zona deve avere tre o più nodi per formare un poligono. Un frame può contenere più zone. Se le zone si sovrappongono, l'area coperta da entrambe le zone continuerà a essere coperta.

L'annotazione della zona deve seguire una sintassi di input specifica.

  • Per indicare un singolo nodo, utilizza : per collegare l'asse x e l'asse y di una coordinazione immagine. Ad esempio, un nodo di (0,0) nell'angolo in alto a sinistra sarà indicato come 0:0.
  • Per indicare tutti i nodi in una singola zona, utilizza ; per connettere i nodi. Ad esempio, una zona con i nodi (0,0), (100,0), (100,100) e (0, 100) sarà indicata come 0:0;100:0;100:100;0:100. Inserisci sempre i nodi come nodi di collegamento uno accanto all'altro. L'ordine può essere sia in senso orario che antiorario.

Zona di rilevamento dei movimenti - quadrata*Una zona quadrata con quattro nodi.

Zona di rilevamento dei movimenti - triangolo*Una zona triangolare con tre nodi.

  • Per indicare più zone in un singolo frame, utilizza - per collegare zone diverse. Ad esempio, se vogliamo inserire entrambi i valori (0,0), (100,0), (100,100), (0,100) e (120,120), (110,150), (200,160), l'annotazione della zona di input sarà 0:0;100:0;100:100;0:100-120:120;110:150;200:160.

Zona di rilevamento dei movimenti: un fotogramma con due zone*Due zone all'interno di un frame.

Per ottenere le coordinate da un'immagine, sono disponibili alcuni strumenti online. Ad esempio, consulta Wolfram - Ottieni coordinate dall'immagine

Escludi zona annotata

Utilizza il flag exclude_annotated_zone nel comando vaictl per configurare il rilevamento dei movimenti all'interno o all'esterno della zona.
Booleano. Il valore predefinito è false.

Escludi zone annotate è un input booleano da parte dell'utente, che indica se l'utente vuole escludere o meno la zona annotata nel rilevamento dei movimenti.

  • Se impostato su true, la zona annotata fungerà da zona negativa. I movimenti nelle zone annotate non verranno rilevati.

Zona di rilevamento dei movimenti - opzione di esclusione *Esegui il rilevamento dei movimenti solo all'esterno delle zone di input.

  • Se impostato su false, la zona fungerà da zona positiva, su cui si concentrerà il rilevamento dei movimenti.

Zona di rilevamento dei movimenti - opzione di inclusione *Esegui il rilevamento dei movimenti solo nelle zone di input.

6. Esempio di filtro movimento con zona di rilevamento dei movimenti

In questo esempio utilizzeremo un video in cui un albero si muove costantemente in primo piano. Con l'impostazione del filtro movimento normale, il video produrrà un solo evento di movimento con la durata del video originale perché il filtro movimento registra l'albero in movimento come "in movimento costante per tutto il video". Tuttavia, con l'aiuto della zona di rilevamento dei movimenti, possiamo mascherare correttamente il movimento dell'albero e concentrarci sul movimento di auto e pedoni.

Preparazione del video

Il video di esempio (gs://cloud-samples-data/vertex-ai-vision/dynamic-background-fall.mp4) contiene alberi, auto e pedoni di www.changedetection.net.

Credito video: N. Goyette, P.-M. Jodoin, F. Porikli, J. Konrad e P. Ishwar, changedetection.net: A new change detection benchmark dataset, in Proc. IEEE Workshop on Change Detection (CDW-2012) at CVPR-2012, Providence, RI, 16-21 Jun., 2012

Preparazione delle variabili di ambiente

Variabili di progetto Google Cloud.

export PROJECT_ID=<Your Google Cloud project ID>
export LOCATION_ID=us-central1
export LOCAL_FILE=street_vehicles_people.mp4

Configurazione di base del filtro dei movimenti.

export MOTION_SENSITIVITY=<low or medium or high>
export MIN_EVENT_LENGTH=<0-3600>
export LOOK_BACK_WINDOW=<0-3600>
export COOL_DOWN_PERIOD=<0-3600>

Configurazione della zona di rilevamento dei movimenti.

Scegli una delle opzioni riportate di seguito per visualizzare i diversi tipi di utilizzo della zona di rilevamento dei movimenti.

Escludi l'albero per il rilevamento dei movimenti.

export ZONE_ANNOTATION="0:0;680:0;660:70;380:320;100:150"
export EXCLUDE_ANNOTATED_ZONE=true

Zona di rilevamento dei movimenti: escludi il rilevamento dei movimenti dalla zona annotata nel video di esempio *Esegui il rilevamento dei movimenti solo all'esterno delle zone di input.

Concentra il rilevamento dei movimenti sulla strada.

export ZONE_ANNOTATION="0:300;780:300;780:480;0:480"
export EXCLUDE_ANNOTATED_ZONE=false

Zona di rilevamento dei movimenti: esegui il rilevamento dei movimenti dalla zona annotata nel video di esempio *Esegui il rilevamento dei movimenti solo al di fuori delle zone di input.

Inviare stream video con filtro movimento

Inviare gli eventi di movimento alla console cloud

Puoi utilizzare vaictl per trasmettere in streaming i dati video di output alla console cloud. Per iniziare, attiva l'API Vision AI nella console Cloud.

Registra un nuovo stream

  1. Fai clic sulla scheda Stream nel riquadro a sinistra di Vertex AI Vision.
  2. Fai clic su Registrati
  3. In Nome stream, inserisci motion-detection-stream
  4. Nella regione, inserisci us-central1
  5. Fai clic su Registrati

Invio dei risultati allo stream

Questo comando trasmette in streaming un file video a uno stream. Se utilizzi il flag –loop, il video rimane in loop nello stream fino a quando non interrompi il comando. Eseguiremo questo comando come job in background in modo che lo streaming continui.

Aggiungi nohup all'inizio e & alla fine per creare un job in background.

vaictl -p $PROJECT \
       -l $LOCATION_ID \
       -c application-cluster-0 \
       --service-endpoint visionai.googleapis.com \
  send video-file  --file-path $INPUT_VIDEO \
  applying motion-filter
         --motion-sensitivity=$MOTION_SENSITIVITY \
         --min-event-length=$MIN_EVENT_LENGTH \
         --lookback-length=$LOOK_BACK_WINDOW \
         --cooldown-length=$COOL_DOWN_PERIOD \
         --zone_annotation=ZONE_ANNOTATION \
         --exclude_annotated_zone=$EXCLUDE_ANNOTATED_ZONE \
  to streams motion-detection-stream --loop

Potrebbero essere necessari circa 100 secondi tra l'avvio dell'operazione di importazione vaictl e la visualizzazione del video nella dashboard.

Una volta che l'importazione dello stream è disponibile, puoi visualizzare il feed video nella scheda Stream della dashboard di Vertex AI Vision selezionando lo stream traffic-stream.

Vai alla scheda Stream

Invio dei risultati allo spazio di archiviazione locale

Questo comando consente di trasmettere un file video a uno stream. Se utilizzi il flag –loop, il video rimane nello stream finché non interrompi il comando. Eseguiremo questo comando come job in background in modo che lo streaming continui.

Aggiungi nohup all'inizio e & alla fine per renderlo un job in background.

OUTPUT_PATH=<path_to_store_motion_events>

vaictl -p $PROJECT \
       -l $LOCATION_ID \
       -c application-cluster-0 \
       --service-endpoint visionai.googleapis.com \
  send video-file  --file-path $INPUT_VIDEO \
  applying motion-filter
         --motion-sensitivity=$MOTION_SENSITIVITY \
         --min-event-length=$MIN_EVENT_LENGTH \
         --lookback-length=$LOOK_BACK_WINDOW \
         --cooldown-length=$COOL_DOWN_PERIOD \
         --zone_annotation=$ZONE_ANNOTATION \
         --exclude_annotated_zone=$EXCLUDE_ANNOTATED_ZONE \
  to mp4file --mp4-file-path=$OUTPUT_PATH --loop

7. Complimenti

Complimenti, hai completato il lab.

Pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, termina l'operazione dell'SDK vaictl tramite riga di comando con ctrl + z.

Risorse

https://cloud.google.com/vision-ai/docs/overview

https://cloud.google.com/vision-ai/docs/motion-filtering-model

https://cloud.google.com/vision-ai/docs/create-manage-streams

Feedback

Fai clic qui per fornire un feedback

Sondaggio

Come utilizzerai questo tutorial?

Solo lettura Leggi e completa gli esercizi

Quanto è stato utile questo codelab?

Molto utile Moderatamente utile