InYourFaces

Sitemap

Motivation

Dieses Projekt ist fokussiert auf die Rekonstruierung eines 3D Models eines beliebigen Kopfes basierend auf einer Front- und Seiten- Aufnahme dieses Gesichts. Die Rekonstruktion eines solchen Models ist in vielerlei Hinsicht vorteilhaft, beispielsweise in der Echtzeitvisualisierung der Veränderung dieses spezifischen Kopfes basierend auf anderen räumlichen Einflüssen.

Des Weiteren wurde viele andere Anwendungsgebiete einer solchen Rekonstruktion in dem, dieser Arbeit zugrundeliegenden Paper, erwähnt, unter anderem die Mustererkennung dieses Gesichts auf anderen Aufnahmen aufgrund der gewonnenen Informationen im 3D Raum.

Die Eingabe zweier Bilder dieser Art hält eine breite Palette and Möglichkeiten für eine Rekonstruktion bereit, basierend auf dem Shading des Gesichts und der Rückrechnung von Krümungen oder dem Versuch Point Clouds zu erzeugen und diese an Stellen mit zu spärlicher Dichte zu füllen.

Eine andere und die von uns gewählte Implementierung ist ein Mustererkennungs- Schritt der gewisse charakteristische und biometrisch gewählte Punkte des Profils, Munds, der Augen und der Nase erkennt. Aus diesen Punkten kann man 3D Koordinaten rückrechnen und aufgrund dieser mit Hilfe einer Radial Base Function ein vorbereitetes, generisches Modell deformieren um die passende Form des Kopfes zu erhalten. Der letzte Schritt bevor das fertige Modell angezeigt werden kann ist die Zuordnung der Textur Elemente zu Ihren endgültigen Position auf dem Modell.

System View

Unsere Visualisierungs Pipeline kann im Groben wie bereits angedeutet in drei Etappen geglieder werden:

  1. Extraktion der Features- Points aus den beiden Fotos und deren Abgleichung um 3D Zielpunkte zu erhalten.
  2. Deformierung eines generischen Models und der Extraktion relevanter Daten für die endgültige Visualisierung
  3. Letztendlich die Darstellung des extrahierten Models und der Echtzeitvisualisierung inklusive der Texturierung.

Facefeatures/Segmentation

Die Punkte des Eingabebilds werden mit Hilfe des Zhu, Ramanan Gesichtserkennungsalgorithmus erkannt, siehe X. Zhu, D. Ramanan. "Face detection, pose estimation and landmark localization in the wild" Computer Vision and Pattern Recognition (CVPR) Providence, Rhode Island, June 2012.

Dieser hat die Eigenschaft, dass sowohl Aufnahmen von vorne, als auch von der Seite erkannt werden. Es wird dabei ein Wert zurückgegeben, der den Winkel der Aufnahme angibt. Damit lassen sich u.a. die eingelesenen Bilder auf ihre Gültigkeit überprüfen.

Ergebnisse des Zhu, Ramanan Gesichtserkennungs Algorithmus

0°                                        -90°

Da unsere Implementierung sehr sensibel auf die genaue Positionierung der Punkte ist, haben wir die Punkte zusätzlich mit Hilfe von Active Appearence Models verfeinert. Dazu wird eine Implementierung von G. Tzimiropoulos, and M. Pantic, "Optimization problems for fast AAM fitting in-the-wild," ICCV 2013 eingebunden. Da sowohl diese Implementierung, als auch der Gesichtserkennungs Algorithmus mit gelabelten Bildern trainiert werden müssen, wurde auf AAM bei Profil Bildern verzichtet. Das hat den Grund, da im Netz kein großer Datensatz von gelabelten Profilaufnahmen zu finden ist. Einen Datensatz selber zusammenzustellen und zu labeln hätte den Zeitaufwand für dieses Projekt gesprengt.

Ergebnis des AAM Algorithmus

Sowohl die Profilpunkte des Gesichtserkennungs Algorithmus als auch die Frontalpunkte des AAM Algorithmus werden auf eine einheitliche Norm gebracht. Bei den Profilpunkten bildet das vertikale Mittel die Nasenspitze und das horizontale Mittel das Kinn. Normiert werden beide Dimensionen auf die Kopfhöhe.

Der vertikale Nullpunkt der Frontalpunkte wird ebenfalls auf die Nasenspitze verschoben, wobei der horizontale Nullpunkt vom Mittel des Nasenrückens abhängt. Normiert werden diese Punkte auf die Distanz der Augen, da diese bei Menschen sehr oft ähnlich sind.

Sind beide Punktmengen normiert kann man sie mit den bereits normierten Referenzmasken vergleichen und daraus die relative Abweichung bestimmen.

Vergleich der normierten Punktmengen mit den Referenzpunkten

Die absolute Verschiebung der Punkte in Model Koordinaten kann dann mithilfe folgender Formel berechnet werden:

w bezeichnet hierbei die Breite der Punkte sowohl bei Frontal- als auch bei Profilpunkten.

Diese Verschiebung muss nur noch zu den Punkten in Modelkoordination hinzuaddiert werden und man erhält die absolute Position wohin die Punkte im Facemodel verschoben werden müssen.

Verbunden werden beide Punktmengen durch ein manuelles Mapping. Dabei werden alle Tiefenwerte (x Richtung der Profilpunkte) auf die korrespondierenden Frontalpunkte übertragen. Die y Richtung der Tiefenwerte wird verworfen, da diese Werte nicht mittels AAM verfeinert wurden und ungenauer sind. Problematisch ist das Matching in der Hinsicht auf die korrespondierenden Punkte: Ein Beispiel sind die Augenbrauen, bei denen 5 Punkte auf der Frontalaufnahme und 4 Punkte auf der Seitenaufnahme gefunden werden. Die Tiefenwerte werden dann mit Tricks auf die die Frontalpunkte gerechnet. Bei der Augenbraue wird beispielsweise der mittlere Punkt durch den 2. und 3. Punkt der Seitenaufnahme interpoliert.

Um Artefakte beim Mapping des Gesichts auf das Model zu vermeiden werden beide Gesichtsbilder, nachdem die Punkte gefunden wurden, noch einmal bearbeitet (Post Processing).  Der erste Schritt dabei ist die Nasenlöcher der Vorderansicht aufzuhellen, da dies bei nicht perfektem Mapping sehr störend ist. Dazu werden zwei verschiedene Masken verknüpft: als Erstes wird anhand der gefunden Punkte eine Maske um die Nase erzeugt. Die zweite Maske bildet ein Schwellwert, der zu dunkle Punkte im Bild auf 1 setzt. Verknüpft man beide Masken erhält man zu dunkle Punkte bei der Nase, was in der Regel die Nasenlöcher sind. Diese Maske wird mittels Morphologie etwas vergrößert und mit einem Gauss Filter geglättet.

 

Die maskierten Stellen im Originalbild werden schlussendlich mit denen eines median geglätteten Bildes interpoliert:

Maske der Nasenlöcher und interpoliertes Bild

Den wichtigste Schritt des Post Processing bildet das Erweitern des Gesichts auf den Rand. Damit wird vermieden, dass der störende Hintergrund nicht fehlerhafterweise auf das Gesichtsmodel mit gemapped wird. Um dieses Verhalten zu implementieren muss zuerst das Gesicht bei der Frontal- und Profilansicht maskiert werden.

Bei der Frontaufnahme werden die gefundenen Konturpunkte um die x Achse gespiegelt, um den Kopf einzuschließen. Bei der Profilaufnahme werden die Augenbrauenpunkte auf die Gesichtsmitte kopiert und skaliert, sodass sie den oberen Kopfrand erfassen. Zusätzlich werden die rechten Konturpunkte in Richtung Hinterkopf verschoben:

Erweiterte Punkte

Aus diesen Punkten wird eine konvexe Hülle erzeugt, um in etwa die Kopfform zu maskieren. Verfeinert werden diese Masken mit Hilfe des Active Contour Algorithmus: Pascal Getreuer, Chan-Vese Segmentation, Image Processing On Line, 2 (2012), pp. 214–224. http://dx.doi.org/10.5201/ipol.2012.g-cv.

Ein Morphologisches erode sorgt dafür, dass letzte Hintergrundartefakte zuverlässig verschwinden.

Frontalmaske des Gesichts

Diese Maske wird sukzessiv vergrößert, wobei die dazugekommenen Punkte zur alten Maske in das Texturbild eingefügt werden. Dies wird solange gemacht, bis entweder alle Punkte gesetzt wurden, oder die Vergrößerung der Maske zu keiner Veränderung mehr führt. Die hinzugefügte Erweiterung wird im letzten Schritt noch Gauss gefiltert, um Kantenartefakte zu beseitigen.

  

Facemodel/Deformation

Das vielmals erwähnte generische Modell wird aus einer Collada (*.dae) Datei serverseitig gelesen und rekursiv traversiert. Wird ein Modell mit dem Namen “Head” gefunden, dann werden alle Vertices des Models iteriert und die Position in Abhängigkeit von einer RBF (in Abhängigkeit von der Distanz zwischen Feature Point und aktuellem Vertex, sowie einem Ausbreitungsfaktor Sigma) gemittelt zwischen allen Zielpunkten vershchoben.

Hierbei wird unmittelbar die Neuberechnugn der Oberflächen- Normalen nötig um ein kontinuierliches und korrektes Shading zu erzielen. Nebenbei wird auch noch die Ausprägung der aus der Deformation resultierenden Bounding- Box ermittelt um im nächsten Schritt korrekt texturieren zu können. Wurden alle nötigen Daten aus dem Collada Modell und den anderen Eingabeparametern errechnet, bzw. gefiltert, werden diese an ein WebGL Frontend weitergeleitet um dort in eine gewöhnliche OpenGL rendering Pipeline mit Daten zu versorgen.

WebGL Viewer

Diese Etappe der Pipeline bietet die eigentliche Visualisierung, neben den diversen unverzichtbaren Debug- Ausgaben, des fertigen Gesichts und grundlegende Interaktionsmöglichkeiten wie die Drehung des Modells under Zoom.

Interessant ist ebenfalls die Art und Weise wie letztendlich die Textur ihren Weg auf das fertige Modell findet. Im wesentlichen wird ein Dotproduct aus der negativen Z- Achse und der aktuellen Oberflächen normale. Hierdurch projizieren wir die z- Achse auf die Normale und erhalten einen Wert zwischen 0 und 1 der zum Ausdruckt bring welches der beiden Fotos (Front- oder Profil- Foto) mehr Einfluss auf das aktuelle Fragment haben sollen. Mit einer linearen Interpolation der beiden Fotos (unten links zu sehen) wurden relativ schlechte Ergebnisse erzielt mit vielen Ghosting Artefakten. Eine Sigmoid Funktion (unten rechts zu sehen) brachte den Erfolg und ist die Funktion die aktuell verwendet wird um Echtzeit- Renderings wie im letzten Bild zu sehen ist erzielen zu können.