Sappiamo bene che altre testate hanno trattato questa notizia prima di noi, ma abbiamo preferito prenderci un po’ più di tempo per poter descrivere il funzionamento di questo interessante algoritmo in maniera più approfondita, comunque senza entrare troppo nel tecnico.
Per i nuovi al concetto di Hyperlapse possiamo definirlo come una tecnica con lo scopo di creare video basata sul posizionamento della telecamera su di un percorso solitamente lungo. Insomma, un time-lapse su “binari“. Per ottenere un buon filmato Hyperlapse è necessario avere pieno controllo del posizionamento della telecamera, facendola quindi muovere su dei binari o comunque strutture fisse, rendendo tale tecnologia accessibile solamente in determinati contesti. È possibile anche ottenere ottimi risultati utilizzando serie di foto come quelle di Google StreeView, in quanto la posizione delle foto è nota.
Microsoft ha recentemente rilasciato un video dove si vede il suo approccio a questo problema nel caso in cui la telecamera sia “in prima persona“, ovvero tutti quei casi in cui si indossa (ad esempio) una GoPro.
Precisiamo subito che questa tecnologia difficilmente vedrà luce su dei cellulari, è infatti necessaria una notevole potenza computazionale per ottenere il risultato finale, potenza di cui i cellulari attualmente non dispongono e che porterebbe ad un eventuale risultato in tempi troppo lunghi per essere accettabili. Microsoft è però attualmente al lavoro su un’applicazione Windows, e provvederemo ad aggiornare quest’articolo non appena sarà disponibile.
Per farvi comprendere meglio di cosa stiamo parlando, non c’è nulla di meglio del video pubblicato da Microsoft stessa.
Il risultato è qualcosa di unico nel suo genere, a nostro avviso veramente sorprendente. Ma come si può ottenere un simile risultato partendo da normali video? Viene istintivo pensare che sia necessaria una fotocamera in grado di memorizzare la sua inclinazione durante la registrazione del video, ma in realtà basta una qualsiasi camera che riesca a riprendere video con una sufficiente qualità. Tecnicamente potremo anche utilizzare uno smartphone, anche se l’ideale consiste in una camera facilmente indossabile, la famosa GoPro prima fra tutte.
Andiamo quindi ad analizzare il funzionamento vero e proprio dell’algoritmo, che può essere diviso in tre fasi:
- FASE 1 – Ricostruzione della scena
- FASE 2 – Decisione del percorso
- FASE 3 – Rendering finale basato sulle immagini
Ognuna di queste tre fasi ha bisogno di un approfondimento, partendo dalla prima.
Ricostruzione della scena
Preprocessing
Nel caso delle GoPro, le immagini hanno il caratteristico effetto Fish-eye (che spesso viene erroneamente confuso con il grandangolo), è quindi necessario riuscire ad annullare quell’effetto. È stato utilizzato OCamCalib Toolbox per questo scopo, ottenendo quindi immagini con la giusta prospettiva.
Creazione struttura dal video
Vengono quindi create delle mappe di profondità, ovvero delle mappe che ci permettano di sapere per ogni fotogramma a quale profondità si trovano gli oggetti ripresi. Si tratta di un problema già affrontato dalla comunità scientifica ed il team di Microsoft Research ha scelto di partite dall’algoritmo descritto da Snavely e Wu. Oltre a stimare posizione ed orientamento della camera l’algoritmo cerca di costruire un Cloud Point 3D, ovvero cerca di localizzare quanti più punti possibile per ogni fotogramma, sapendo per ogni punto le proprie coordinate sui tre assi ed in quali fotogrammi compare.
Successivamente vengono eliminati i fotogrammi non utili, come quelli con un eccessivo effetto movimento e quelli ridondanti: questi ultimi sono tipici dei momenti in cui si è fermi, ad esempio al semaforo, e si inquadrano a lungo le stesse scene senza dare informazioni aggiuntive sull’ambiente.
La costruzione del CloudPoint 3D è molto complessa e, nei primi tentativi effettuati dal team, tale operazione ha richiesto un intera settimana di computazione usando un video molto lungo. Visto che la complessità dell’algoritmo sale con il crescere dei fotogrammi in analisi, si è deciso di eseguirlo su blocchi di 1400 fotogrammi, incrociando i risultati degli ultimi 400 fotogrammi con quelli del blocco successivo ed ottenendo un drastico miglioramento dei tempi computazionali.
Ricostruzione della geometria
Visto che nel risultato finale la telecamera dovrà passare per posizioni diverse da quella originale, è necessario avere un modello tridimensionale il più preciso possibile. La fase precedente ha solo fatto ricostruire una nuvola di punti sparsi, è quindi necessario prima di tutto aumentare il numero di punti trovati, tramite una tecnica chiamata Guided Matching. Visto che si ha anche una buona stima della posizione della telecamera, questo metodo funziona piuttosto bene, anche grazie ai vari accorgimenti usati per migliorarne le prestazioni. È quindi ora possibile creare dei modelli tridimensionali partendo da questi dati, anche se sono necessarie ulteriori rielaborazioni per calcolare con più precisione la posizione dei vertici di questi modelli.
Decisione del percorso
Ora che la geometria è completa, si sceglie un percorso dove far passare la telecamera, questo percorso deve raggiungere quattro obiettivi:
- Non deve essere troppo lungo
- Deve rimanere sempre fluido
- Deve essere vicino al percorso originale
- Non deve compromettere il render finale
Evitiamo di entrare troppo nel dettaglio di questa fase, visto che si tratta di un operazione molto complessa anche a livello concettuale, ma fondamentalmente si tratta di ottenere una serie di combinazioni matriciali che descrivano posizione e rotazione della telecamera ad ogni fotogramma. Tale operazione è divisa in fasi, con una serie di ottimizzazioni necessarie per arrivare al risultato finale. Il percorso cerca comunque di mantenere sempre almeno l’80% del campo visivo della telecamera reale, in modo da non dover ricostruire manualmente troppe porzioni di video.
Rendering finale basato sulle immagini
Scelta dei fotogrammi sorgente
La scelta dei fotogrammi è ovviamente una fase cruciale: per ogni fotogramma si vanno a cercare quali pezzi di fotogrammi usare per essere “avvolti” intorno ai modelli creati durante la prima fase. Sarebbe stato possibile anche prendere direttamente i singoli pixel dai fotogrammi più convenienti, ma il risultato sarebbe risultato poco omogeneo. Per ogni area da coprire si cerca di scegliere il fotogramma che la riprende più da vicino, così da avere una migliore definizione. Purtroppo però bisogna tener conto che il fotogramma più vicino può essere sfocato o può coprire solo una parte dell’area interessata, quindi vengono analizzati i 500 fotogrammi successivi e precedenti a quello effettivamente più vicino per trovare la scelta migliore. Infine vengono esclusi i pixel che sono coperti da altri pezzi e che potrebbero causare artefatti e glitch grafici. Non si può usare il semplice asse Z (la profondità) in quanto è da tener conto che la ricostruzione del modello può avere errori ed imprecisioni; viene quindi usato un modello chiamato Gaussian Mixture Model per risolvere il problema.
Fusione
L’ultima fase è quella di fusione dei pezzi di fotogramma precedentemente scelti. Vengono quindi opportunamente deformati per ottenere il corretto effetto prospettiva ed uniti fra loro. Ancora una volta ci troviamo di fronte ad un’operazione divisa in più fasi, dove vengono analizzati i due fotogrammi temporalmente successivi e precedenti a quello che si vuole usare. Questo perché i fotogrammi temporalmente vicini a quello in analisi solitamente non mentono su cosa ci sia effettivamente nel pixel interessato. Nel video di output infatti potremo notare che alcuni elementi (come le persone che camminano) sembrano quasi muoversi a scattoni, in quanto per l’algoritmo ogni “scattone” è un singolo pixel temporalmente valido.
Tempi computazionali
Giusto per rendere un’idea dei tempi, usando come video sorgente un video da 13 minuti a 29,97 fotogrammi al secondo e risoluzione 1280 x 960 sono servite circa 40 ore di computazione. Precisiamo però che circa 36 ore sono state necessarie per la prima fase del render, durante la scelta dei fotogrammi sorgente. In questa fase viene applicato il Gaussian Mixture Model (abbreviato GMM), utilizzato per capire quali pixel vanno nascosti in quanto posizionati dietro ad altri elementi; circa il 95% delle 36 ore necessarie è stato utile per applicare questo modello.
Viste le tempistiche necessarie per ottenere questo risultato, sembra piuttosto facile immaginare il perché ancora non sia stata rilasciata un’applicazione in grado di effettuare questo lavoro; probabilmente attualmente si sta lavorando sull’ottimizzazione dei tempi computazionali soprattutto delle fasi più critiche.
Quindi non ci resta altro da fare se non aspettare nuovi dettagli sull’evoluzione di questa ricerca, e sperare di avere al più presto un’applicazione per fare i nostri test casalinghi.
Continuate a seguirci per tutte le novità sull’argomento!
Articolo di Windows Blog Italia
Fonte | Microsoft Research