de
                    array(2) {
  ["de"]=>
  array(13) {
    ["code"]=>
    string(2) "de"
    ["id"]=>
    string(1) "3"
    ["native_name"]=>
    string(7) "Deutsch"
    ["major"]=>
    string(1) "1"
    ["active"]=>
    string(1) "1"
    ["default_locale"]=>
    string(5) "de_DE"
    ["encode_url"]=>
    string(1) "0"
    ["tag"]=>
    string(2) "de"
    ["missing"]=>
    int(0)
    ["translated_name"]=>
    string(7) "Deutsch"
    ["url"]=>
    string(105) "https://www.statworx.com/content-hub/blog/real-time-computer-vision-gesichter-erkennen-mit-einem-roboter/"
    ["country_flag_url"]=>
    string(87) "https://www.statworx.com/wp-content/plugins/sitepress-multilingual-cms/res/flags/de.png"
    ["language_code"]=>
    string(2) "de"
  }
  ["en"]=>
  array(13) {
    ["code"]=>
    string(2) "en"
    ["id"]=>
    string(1) "1"
    ["native_name"]=>
    string(7) "English"
    ["major"]=>
    string(1) "1"
    ["active"]=>
    int(0)
    ["default_locale"]=>
    string(5) "en_US"
    ["encode_url"]=>
    string(1) "0"
    ["tag"]=>
    string(2) "en"
    ["missing"]=>
    int(0)
    ["translated_name"]=>
    string(8) "Englisch"
    ["url"]=>
    string(101) "https://www.statworx.com/en/content-hub/blog/real-time-computer-vision-face-recognition-with-a-robot/"
    ["country_flag_url"]=>
    string(87) "https://www.statworx.com/wp-content/plugins/sitepress-multilingual-cms/res/flags/en.png"
    ["language_code"]=>
    string(2) "en"
  }
}
                    
Kontakt
Content Hub
Blog Post

Real-time Computer Vision: Gesichter erkennen mit einem Roboter

  • Expert:innen Sarah Sester
  • Datum 30. November 2022
  • Thema Artificial IntelligenceDeep LearningMachine Learning
  • Format Blog
  • Kategorie Technology
Real-time Computer Vision: Gesichter erkennen mit  einem Roboter

In der Computer Vision Arbeitsgruppe bei statworx hatten wir uns zum Ziel gesetzt, mit Hilfe von Projekten Computer Vision Kompetenzen aufzubauen. Für die diesjährige statworx Alumni Night, die Anfang September stattfand, entstand die Idee eines Begrüßungsroboters, der die ankommenden Mitarbeitenden und Alumni von statworx mit einer persönlichen Nachricht begrüßen sollte. Für die Realisierung des Projekts planten wir ein Gesichtserkennungsmodell auf einem Waveshare JetBot zu entwickeln. Der Jetbot wird von einem NVIDIA Jetson Nano angetrieben, ein kleiner, leistungsfähiger Computer mit einer 128-Core GPU für die schnelle Ausführung moderner KI-Algorithmen. Viele gängige KI-Frameworks wie Tensorflow, PyTorch, Caffe und Keras werden unterstützt. Das Projekt schien sowohl für erfahrene als auch für unerfahrene Mitglieder:innen der Arbeitsgruppe eine gute Möglichkeit zu sein, Wissen im Bereich Computer Vision aufzubauen und Erfahrungen im Bereich Robotik zu sammeln.

Gesichtserkennung (Face Recognition) mithilfe eines JetBots erfordert die Lösung einer Reihe miteinander verbundenen Problemen:

  1. Face Detection: Wo befindet sich das Gesicht auf dem Bild?
    Zunächst muss das Gesicht auf einem gezeigten Bild lokalisiert werden. Nur dieser Teil des Bildes ist relevant für alle folgenden Schritte.
  2. Face Embedding: Welche einzigartigen Merkmale hat das Gesicht?
    Anschließend müssen einzigartige Merkmale des Gesichts erkannt und in einem Embedding kodiert werden, anhand derer es von anderen Personen unterschieden werden kann. Eine damit einhergehende Herausforderung ist, dass das Modell lernen muss mit der Neigung des Gesichts oder schlechter Beleuchtung umzugehen. Daher muss vor der Erstellung des Embeddings die Pose des Gesichts ermittelt und so korrigiert werden, dass das Gesicht zentriert ist.
  3. Namensermittlung: Welches Embedding ähnelt dem erkannten Gesicht am meisten?
    Das Embedding des Gesichts muss schließlich mit den Embeddings aller Personen, die das Modell bereits kennt, verglichen werden, um den Namen der Person zu bestimmen.
  4. UI mit Willkommensnachricht
    Für die Ausgabe der Willkommensnachricht wird eine UI benötigt. Dafür muss zuvor ein Mapping erstellt werden, welches den Namen der zu grüßenden Person der jeweiligen Willkommensnachricht zuordnet.
  5. Konfiguration des JetBots
    Im letzten Schritt muss der JetBot konfiguriert und das Modell auf den JetBot übertragen werden.

Das Trainieren eines solchen Gesichterkennungsmodells ist sehr rechenintensiv, da Millionen von Bildern von Tausenden verschiedenen Personen verwendet werden müssen, um ein leistungsfähiges Neuronales Netz zu erhalten. Sobald das Modell jedoch trainiert ist, kann es Embeddings für jedes beliebige (bekannte oder unbekannte) Gesicht erzeugen. Daher konnten wir glücklicherweise auf bestehende Gesichterkennungsmodelle zurückgreifen und mussten lediglich die Embeddings von den Gesichtern unserer Kolleg:innen und Alumni erstellen. Nichtsdestotrotz sollen die Schritte des Trainings kurz erläutert werden, um ein Verständnis dafür zu vermitteln, wie solche Gesichtserkennungsmodelle funktionieren.

Für die Implementierung verwendeten wir das Pythonpaket face_recognition, welche die Gesichtserkennungsfunktionalität von dlib umschließt und so die Arbeit mit ihr erleichtert. Das neuronale Netz selbst wurde auf einem Datensatz von etwa 3 Millionen Bildern trainiert und erreichte auf dem Datensatz „Labeled Faces in the Wild“ (LFW) eine Genauigkeit von 99,38 % und ist damit anderen Modellen überlegen.

Vom Bild zum codierten Gesicht (Face Detection)

Die Lokalisierung eines Gesichts auf einem Bild erfolgt durch den Histogram of Oriented Gradients (HOG) Algorithmus. Dabei wird jeder einzelne Pixel des Bildes mit den Pixeln in der unmittelbaren Umgebung verglichen und durch einen Pfeil ersetzt, der in die Richtung zeigt, in die das Bild dunkler wird. Diese Pfeile stellen die Gradienten dar und zeigen den Verlauf von hell nach dunkel über das gesamte Bild. Um eine übersichtlichere Struktur zu schaffen, werden die Pfeile auf einer höheren Ebene aggregiert. Das Bild (a) wird in kleine Quadrate von je 16×16 Pixeln unterteilt und mit der Pfeilrichtung ersetzt, die am häufigsten vorkommt (b). Anhand der HOG-kodierten Version des Bildes kann nun der Teil des Bildes gefunden werden, der einer HOG-Kodierung eines Gesichts (c) am ähnlichsten ist. Nur dieser Teil des Bildes ist relevant für alle folgenden Schritte.

Abbildung 1: Quelle HOG face pattern: https://commons.wikimedia.org/wiki/File:Dlib_Learned-HOG-Detector.jpg

Mit Embeddings Gesichter lernbar machen

Damit das Gesichtserkennungsmodell unterschiedliche Bilder einer Person trotz Neigung des Gesichts oder schlechter Beleuchtung der gleichen Person zuordnen kann, muss die Pose des Gesichts ermittelt und so projeziert werden, dass sich die Augen und Lippen immer an der gleichen Stelle im Bild befinden. Dabei kommt der Algorithmus Face Landmark Estimation zum Einsatz, welcher mithilfe eines Machine Learning Modells spezifische Orientierungspunkte im Gesicht finden kann. Dadurch können wir Augen und Mund lokalisieren und durch grundlegende Bildtransformationen wie Drehen und Skalieren so anpassen, dass beides möglichst zentriert ist.

Abbildung 2: Face landmarks (links) und Projektion des Gesichts (rechts)

Im nächsten Schritt wird mithilfe eines neuronalen Netzes ein Embedding des zentrierten Gesichtsbilds erstellt. Das neuronale Netz erlernt sinnvolle Embeddings, indem es innerhalb eines Trainingsschrittes drei Gesichtsbilder gleichzeitig betrachtet: Zwei Bilder einer bekannten Person und ein Bild einer anderen Person. Das neuronale Netz erstellt die Embeddings der drei Bilder und optimiert seine Gewichte, sodass die Embeddings der Bilder der gleichen Person angenähert werden, und sich stärker mit dem Embedding der anderen Person unterscheidet. Nachdem dieser Schritt millionenfach für unterschiedliche Bilder von verschiedenen Personen wiederholt wurde, lernt das neuronale Netz repräsentative Embeddings zu erzeugen. Die Netzwerkarchitektur des Gesichtserkennungsmodells von dlib basiert auf dem ResNet-34 aus dem Paper Deep Residual Learning for Image Recognition von He et al., mit weniger Layern und einer um die Hälfte reduzierten Anzahl von Filtern. Die erzeugten Embeddings sind 128-dimensional.

Abgleich mit gelernten Embeddings in Echtzeit

Für unseren Begrüßungsroboter konnten wir glücklicherweise auf das bestehende Modell von dlib zurückgreifen. Damit das Modell die Gesichter der aktuellen und ehemaligen statcrew erkennen kann, mussten nur noch die Embeddings erstellt werden. Dafür haben wir die offiziellen statworx Bilder verwendet und das resultierende Embedding zusammen mit dem Namen der Person abgespeichert. Wird danach ein unbekanntes Bild in das Modell gegeben, erkennt dieses Gesicht, zentriert es und erstellt dafür ein Embedding. Das erstellte Embedding wird anschließend mit den abgespeicherten Embeddings der bekannten Personen verglichen und bei großer Ähnlichkeit wird der Name dieser Person ausgegeben. Ist kein ähnliches Embedding vorhanden, gibt es keine Übereinstimmung mit den gespeicherten Personen. Mehr Bilder einer Person und damit mehrere Embeddings pro Person verbessern die Performanz des Modells. Unsere Tests zeigten jedoch, dass unsere Gesichter auch mit nur einem Bild pro Person recht zuverlässig erkannt wurden. Nach diesem Schritt hatten wir nun ein gutes Modell, welches in Echtzeit Gesichter in der Kamera erkannte und den zugehörigen Namen anzeigte.

Eine herzliche Begrüßung über ein UI

Unser Plan war es den Roboter mit einem kleinen Bildschirm oder einem Lautsprecher auszustatten, auf dem die Begrüßungsnachricht dann zu sehen bzw. zu hören sein sollte. Für den Anfang hatten wir uns dann aber dazu entschieden, den Roboter an einen Monitor anzuschließen und eine UI für den Monitor zu bauen. Deshalb entwickelten wir zunächst lokal eine simple UI. Dafür ließen wir die Begrüßungsnachricht auf einem Hintergrund mit den statworx Firmenwerten anzeigen und projizierten das Kamerabild in die untere rechte Ecke. Damit jede Person eine personalisierte Nachricht erhält, mussten wir eine json-Datei anlegen, welche das Mapping von den Namen zur Willkommensnachricht definiert. Für unbekannte Gesichter hatten wir die Willkommensnachricht „Welcome Stranger!“ angelegt. Aufgrund der vielen Namensvettern bei statworx hatten alle mit dem Namen Alex zusätzlich einen einzigartigen Identifikator erhalten:

Letzte Hürden vor der Inbetriebnahme des Roboters

Da das Modell und die UI bisher nur lokal liefen, blieb nun noch die Aufgabe das Modell auf den Roboter mit integrierter Kamera zu übertragen. Wie wir dann leider feststellen mussten, war dies komplizierter als gedacht. Wir hatten immer wieder mit Arbeitsspeicherproblemen zu kämpfen und mussten den Roboter insgesamt dreimal neu konfigurieren, bis wir erfolgreich das Modell auf dem Roboter zum Laufen bringen konnten. Die Anleitung für die Konfigurieren des Roboters, welche bei uns zum Erfolg geführt hat, befindet sich hier: https://jetbot.org/master/software_setup/sd_card.html. Die Arbeitsspeicherprobleme konnten sich meist mit einem Reboot beheben.

Der Einsatz des Begrüßungsroboters bei der Alumni Night

Unser Begrüßungsroboter war ein voller Erfolg bei der Alumni Night! Die Gäste waren sehr überrascht und freuten sich über die personalisierte Nachricht.

Abbildung 3: Der JetBot im Einsatz bei der statworx-Alumni-Night

Auch für uns als Computer Vision Cluster war das Projekt ein voller Erfolg. Während des Projekts lernten wir viel über Gesichtserkennungsmodelle und allen damit verbundenen Herausforderungen. Die Arbeit mit dem JetBot war besonders spannend und wir planen bereits fürs nächste Jahr weitere Projekte mit dem Roboter. Sarah Sester

Mehr erfahren!

Als eines der führenden Beratungs- und Entwicklungs­unternehmen für Data Science und KI begleiten wir Unternehmen in die datengetriebene Zukunft. Erfahre mehr über statworx und darüber, was uns antreibt.
Über uns