FaceSwap

FaceSwap è un approccio basato su computer grafica per trasferire l’area del viso da un video sorgente ad uno di destinazione. L’estrazione dell’area si basa su punti di riferimento sparsi sul viso, una volta rilevati viene estratta la regione. Utilizzando questi punti di riferimento, la regione del viso individuata si adatta ad un modello di templates 3D usando blendshapes[1].

 

[1] Fonte Wikipedia: blendshapes è un metodo di animazione al computer 3D utilizzato insieme a tecniche come l’animazione scheletrica. In un’animazione target morph, una versione “deformata” di una mesh viene memorizzata come una serie di posizioni di vertice. In ogni fotogramma chiave di un’animazione, i vertici vengono quindi interpolati tra queste posizioni memorizzate.

Deep Fake composition image

Questo modello viene retroproiettato all’immagine di destinazione minimizzando la differenza tra la forma proiettata e i punti di riferimento localizzati usando le textures dell’immagine di input. Infine, il modello di rendering viene unito all’immagine e viene applicata la correzione del colore.

Questi passaggi vengono eseguiti per tutte le coppie di sorgenti e frame di destinazione fino alla fine del video. L’implementazione è dal punto di vista computazionale leggera e può essere eseguita in modo efficiente dalla CPU.

Abbiamo riscontrato che l’approccio Faceswap si presta a delle varianti utilizzando linguaggi di programmazione. In particolare, tramite OpenCV[2], con l’utilizzo di C++ e Python.

Vediamo però come agire per una semplice sostituzione di volto partendo dalla prossima immagine mostrata qui sotto.

 

[2] Fonte wikipedia: OpenCV (acronimo in lingua inglese di Open Source Computer Vision Library) è una libreria software multipiattaforma nell’ambito della visione artificiale in tempo reale. È una libreria software libera originariamente sviluppato da Intel, centro di ricerca in Russia di Nižnij Novgorod. Successivamente fu poi mantenuto da Willow Garage e ora da Itseez. Il linguaggio di programmazione principalmente utilizzato per sviluppare con questa libreria è il C++, ma è possibile interfacciarsi anche attraverso il C, Python e Java.

Allineamento facciale. A sinistra: vengono rilevati i punti di riferimento del viso e scafo convesso. Al centro: triangolazione Delaunay di punti sullo scafo convesso. A destra: allineamento del viso con triangoli di deformazione affini.

Allineamento faccia

Per sostituire una faccia con un’altra, dobbiamo prima posizionare una faccia approssimativamente sopra l’altra in modo che copra la faccia target.

Considerazioni

Un problema rilevato su tutti gli approcci relativi al metodo Face2Face riguarda l’illuminazione dell’ambiente circonstante, che se non resa il più possibile simile al video target, può essere limitante e portare ad artefatti soprattutto in presenza di ombre o riflessi. Risulta essere ancora più problematica la situazione di soggetto target con capelli lunghi e barba.

Rilevamento del perimetro facciale

Essendo la geometria delle due facce molto diversa è necessario deformare/ingrandire un po’ la faccia di origine in modo che copra la faccia destinazione. L’operazione deve essere tale da consentire un corretto riconoscimento, senza deformare il volto, mantenendo dunque le proporzioni. I punti di riferimento su entrambe le immagini sono stati individuati usando dlib[3]. A differenza del Face Morphing, non vengono utilizzati tutti i punti per l’allineamento del viso, sono necessari solo i punti sul bordo esterno del viso come mostrato con il tratto blu della figura (Convex Hull[4]).

[3] http://dlib.net/ – Dlib è una raccolta di algoritmi vari in Machine Learning, Computer Vision, Image Processing e Linear Algebra. La maggior parte della libreria sono solo file di intestazione che è possibile includere nell’applicazione C++ o anche Python.

[4] Convex Hull: in gergo di Computer Vision e Math, il confine di una raccolta di punti o forme è chiamato “hull”. Un confine che non ha alcuna concavità è chiamato “Convex Hull” cioè “scafo convesso”. Nell’immagine riportata sopra, vediamo i punti di riferimento del viso rilevati usando Dlib in rosso e lo scafo convesso dei punti è mostrato in blu. Lo scafo convesso di una serie di punti può essere calcolato usando la funzione convesso dello scafo di OpenCV.

Triangolazione Delaunay

Il prossimo passo nell’allineamento è fare una triangolazione Delaunay[5] dei punti sul “convex hull”, la triangolazione è mostrata nell’immagine centrale della figura, questo ci consente di dividere la faccia in parti più piccole e più facilmente sovrapponibili e deformabili per un allineamento del viso sorgente con quello di destinazione. I punti di giunzione tra le due facce possono essere “addolciti” lavorando sull’illuminazione e sulla tonalità della pelle, come mostrato in questa immagine:

[5] In geometria computazionale, la triangolazione di Delaunay per un gruppo di punti P su un piano è una triangolazione DT tale che nessun punto appartenente a P sia all’interno del circumcerchio di ogni triangolo in DT.

Considerazioni su FaceSwap

Essendo un metodo che usa computer grafica, risente degli effetti di non omogeneizzazione del volto. In particolare, gli allineamenti, le espressioni e l’albedo non raggiungono la qualità offerta dai metodi che sfruttano le reti neurali.