eLocal Group Centro Soluzioni
Distanziamento






La soluzione permette di rilevare in un video le persone e determinare a quale distanza di trovino. E' stata ideata per fornire un sistema semplice ed automatico per rilevare gli assembramenti durante la pandemia di Covid-19.

Lo stesso algoritmo può anche essere sfruttato per tutte le applicazioni che richiedono un sistema che identifichi in un video natura e posizione di oggetti.

Per cominciare dobbiamo ricavare i parametri di posizionamento della videocamera tramite GIULIACalibraScena oppure caricando dei parametri già salvati se questa procedura è già stata effettuata.
Qui forniamo un esempio di quest'ultima possibilità caricando i parametri nell'inizializzazione e impostandoli con GIULIAImpostaCalibrazione(calibrazione, nome) dove "nome" è il nome che assegnamo alla scena.
Infine utilizzeremo GIULIADistanze per calcolare a che distanza si trovano tra loro i soggetti.

Configurazione di GIULIA:
Richiede di abilitare il classificatore di oggetti, qui per esempio usiamo Tensorflow, un monitor e una casella di report che utilizzeremo per mostrare i risultati ottenuti.

All'interno di @GIULIAInit:
Carichiamo i parametri di calibrazione nella variabile “calibrazione” dalla cartella in cui sono stati salvati. Per essere utilizzati da GIULIA tali parametri devono essere memorizzati con un nome tramite la funzione GIULIAImpostaCalibrazione.
Nel caso in cui avessimo un numero maggiore di telecamere dobbiamo calibrare ognuna singolarmente ed assegnarle un proprio nome con la stessa procedura.

Successivamente andiamo a indicare quale video dovrà essere analizzato e quale distanza vogliamo come soglia per il distanziamento. Il parametro “scala” è necessario nel momento in cui si vuole modificare la dimensione dell’immagine, ad esempio scala=1 indica che le dimensioni non vengono modificate, un valore di 0.5 indica che l’immagine viene rimpicciolita dimezzandone le dimensioni.

Nel corpo principale del codice:

Leggiamo il video con GIULIALeggiVideo nella variabile “frame”.
Se volessimo modificare la dimensione dell’immagine dobbiamo sfruttare l’attributo “.shape” della variabile “frame”, questo consiste nella tupla contenente nell’ordine: le dimensioni x in pixel, le dimensioni y in pixel e il numero di canali dei colori; tramite GIULARidimensionaImmagine(frame, nuova_dy, nuova_dx) ridimensioniamo il frame passando come parametri la vecchia dimensione scalata del fattore "scala". Questa operazione è importante nel momento in cui i frame sono di grandi dimensioni e quindi la ricerca degli oggetti nell’immagine viene rallentata.

Ora andiamo a riconoscere gli oggetti presenti nella scena con un classificatore, GIULIAClassificaTF richiede come parametro d’ingresso l’immagine da analizzare e come parametri opzionali le dimensioni dell’immagine. Specificare le dimensioni assicura che durante la classificazione l’immagine, e quindi gli oggetti da riconoscere, non vengano distorti e le proporzioni conservate, infatti se l'immagine fosse distorta modificando le proporzioni gli oggetti sono più difficilmente riconosciuti.
La funzione restituisce il frame con evidenziati tramite dei rettangoli gli oggetti riconosciuti e la lista di questi ultimi.

Ogni oggetto è a sua volta un lista con elementi: [etichetta, x_vertice, y_vertice, larghezza, altezza, probabilità], “etichetta” è una stringa che assegna l’oggetto ad una classe, ad esempio “persona”, “gatto” o “monitor”, il vertice di riferimento è quello in alto a sinistra nell’immagine, (ricordiamo che in un’immagine il punto di origine delle coordinate è in alto a sinistra), “larghezza” e “altezza” sono le dimensioni in pixel del rettangolo che racchiude l’oggetto e “probabilità” è il valore di probabilità che l’oggetto appartenga alla classe “etichetta” calcolato dal classificatore.

Nel nostro problema siamo interessati ad analizzare solo gli oggetti che sono persone, per cui filtriamo con GIULAFiltraOggetti quelli etichettati come “persona” tra tutti quelli presenti.

Decidiamo infine che vogliamo visualizzare nell'immagine tutti gli oggetti riconosciuti ma evidenziare solo quelli che sono troppo vicini tra loro.
Per evidenziare questa condizione tracciamo una linea rossa tra le basi degli oggetti vicini.
Contiamo anche quante di queste violazioni avvengono in una variabile di conteggio e mostriamola nel report con la funzione GIULIAReport1(report)




Torna alle soluzioni