iteraface: Gesichtserkennung Tutorial! Teil 1: Hintergrundwissen und Aufbau der Entwicklungsumgebung


15.05.2018 von

https://www.iteratec.de/fileadmin/Bilder/News/iteratec_logo.png https://www.iteratec.de/fileadmin/Bilder/News/iteratec_logo.png iteratec GmbH

iteratec bietet seinen MitarbeiterInnen die Möglichkeit einer "Innovation Time Off" (ITO). Hier kann jeder Mitarbeiter zunächst fünf Tage "Innovation-Frei-Day"-Zeit erhalten, über die er oder sie frei verfügen kann. Benötigt man dann weiteres Budget, bekommt man dies ohne Probleme genehmigt. Es gibt nur die Anforderung, dass man über die Ergebnisse intern oder extern berichtet, um einen Wissensaustausch zu ermöglichen. Im Rahmen der ITO veranstalten wir regelmäßig Hackathons, bei denen das Projekt iteraface gestartet wurde.

Motivation

Wir - das sind Anton und Manfred - wollten das Thema künstliche Intelligenz anfassbar machen. Dafür wollten wir einen schon vorhandenen Ansatz zur Gesichtserkennung ausprobieren und diesen im Unternehmen für weitere Anwendungsgebiete zur Verfügung stellen. In diesem dreiteiligen Tutorial wollen wir unsere Schritte skizzieren und es euch ermöglichen, selbst eine Gesichtserkennung zu implementieren und zu betreiben.

Der erste Teil vermittelt Hintergrundwissen und hilft euch beim Aufsetzen eurer Python-Umgebung. Der zweite Teil zeigt, wie man fertig implementierte Skripte zum Ausschneiden von Gesichtern und zum Erkennen von Personen mit eigenen Bildern kombiniert. Der dritte Teil erweitert die Anwendung um eine kleine UI, einen REST-Endpunkt und beschreibt, wie man das System mittels Docker hosten kann.

Welche Anwendungsfälle sehen wir bei iteratec?

Bei iteratec haben wir sehr viele Fotos, auf denen auch KollegInnen abgebildet sind. Die Fotos stammen hauptsächlich von internen und externen Veranstaltungen. Mit unserer Bilddatenbank ist derzeit eine manuelle Verschlagwortung der Bilder möglich. Darauf aufbauend wollen wir mit iteraface die Fotos mit den Namen unserer Kolleginnen und Kollegen annotieren und ihre Gesichter markieren.

Im Studentenlabor (SLab) wird derzeit fleißig an einem Concierge-Roboter (Loomo) entwickelt. Der Roboter soll zukünftig auch Mitarbeiter und andere bekannte Gesichter mit Namen begrüßen können. Für die Live-Identifikation einer Person soll auch iteraface verwendet werden.

Neuronales Netz zur Erkennung von Gesichtern

Die Deep-Learning-Spezialisierung auf coursera.org hat unser Interesse an neuronalen Netzen geweckt. iteraface ist für uns ein Projekt, an dem wir selbst die erlernten Konzepte ausprobieren und integrieren können.

Auf der Suche nach möglichen Lösungen haben wir uns schnell dafür entschieden, das vortrainierte neuronale Netz von David Sandberg zu verwenden. Das Netz ist ein "Deep Convolutional Neuronal Network" mit einer Triplet-Loss-Kostenfunktion.

Dieses neuronale Netz erzeugt aus einem Bild ein sogenanntes Embedding. Ein Embedding ist ein Vektor, der letztendlich eine Abstraktion des Bildes darstellt und dabei die wichtigsten Merkmale eines Gesichts widerspiegelt. In der Bildverarbeitung werden neuronale Netze hauptsächlich zur Klassifikation verwendet. Das heißt, ich gebe dem Netz ein Bild und das Netz sagt mir, in welche Kategorie es fällt. Dieser Schritt entfällt bei dem Netz, das wir verwenden.

Stattdessen ist das Netz darauf trainiert, den Unterschied zwischen zwei und mehr Embeddings zu quantifizieren. In der Trainingsphase wurden dafür immer drei Bilder verglichen. Zwei unterschiedliche Bilder der selben Person und ein zusätzlich von einer anderen Person. Das Ziel war, dass der Unterschied zwischen den ersten beiden Embeddings möglichst viel kleiner als der Unterschied zwischen den letzten beiden Bildern ist. Der Unterschied quantifiziert also die Ähnlichkeit zweier Gesichter und ist, mathematisch formuliert, der euklidische Abstand zweier Embeddings.

Der Trainingsalgorithmus prozessiert nun sehr viele Gesichter und optimiert die Parameter derart, dass die oben beschriebene Definition möglichst gut erfüllt ist.

Folgende Grafik beschreibt das Optimierungsziel nochmal anschaulich:

Da David Sandberg ein vortrainiertes Netz bereitgestellt hat, konnten wir direkt ohne eigenes Training loslegen.

Zielszenario

Unser Zielszenario sah für den Hackathon folgendermaßen aus:

Beim Applikationsstart

  • Laden der Fotos unserer MitarbeiterInnen (ca. 1 - 3 Fotos pro Person)
  • Ausschneiden der Gesichter aus den Fotos
  • Erzeugen der normalisierten Embeddings, indem wir die ausgeschnittenen Gesichter durch das geladene neuronale Netz schieben

Zur Laufzeit

  • Ein Foto wird über eine REST-Schnittstelle an unsere Applikation geschickt
  • Wir schneiden alle Gesichter auf dem Foto aus und merken uns die gefundenen Bounding-Boxes
  • Wir geben alle ausgeschnittenen Gesichter in das neuronale Netz und erhalten für jedes Gesicht ein Embedding
  • Wir ermitteln nun zu jedem Mitarbeiter-Embedding den euklidischen Abstand zu den ausgeschnittenen Gesichtern
  • Wir liefern die Mitarbeiternamen zurück, die den kleinsten Abstand zu einem ausgeschnittenen Gesicht haben. Falls wir mehrere Mitarbeiterfotos beim Start eingelesen haben, nehmen wir einfach den durchschnittlichen Abstand
  • Zum Schluss packen wir noch die gefundenen Bounding-Boxes zu dem Mitarbeiternamen und liefern diese über die REST-Schnittstelle als Antwort zurück.
  • Die minimale UI zeigt die Bounding Boxes auf dem Foto an

Entwicklungsumgebung

Wir beide hatten nicht sehr viel Erfahrung in Python und denken, dass eine kleine Anleitung zum Aufsetzen der Entwicklungsumgebung Anfängern helfen könnte. Python gibt es in den Versionen 2.x und 3.x und jede Applikation hat gewisse Abhängigkeiten zu spezifischen Versionen von Bibliotheken. Um eine spezielle und isolierte Umgebung für unser Projekt erstellen zu können, nutzen wir Anaconda, welches für jedes Betriebssystem eine Installationsanleitung bereitstellt.

Einmal installiert kann man Umgebungen erstellen und verwalten. In unserem Fall nutzen wird Python in der Version 3.5, Tensorflow 1.2 und einige weitere Bibliotheken, welche ihr in der requirements.txt im teil_1 Ordner auf github findet. Um die erstellte Umgebung aufzusetzen, checked bitte das Projekt aus und navigiert in den Ordner 'teil_1' über die Kommandozeile:

git clone git@github.com:iteratec/iteraface-tutorial.git
cd iteraface-tutorial/teil_1

Danach erstellt ihr mit Anaconda über die Kommandozeile eine iteraface-Umgebung:

conda create --name iteraface python=3.5

Ist diese erstellt, könnt ihr sie aktivieren:

source activate iteraface

Nun wird in der Kommandozeile immer die aktivierte Umgebung in Klammern angezeigt, z. B.:

(iteraface) AntonBrass:teil_1 user$ 

Damit ihr im nächsten Schritt alle notwendigen Bibliotheken habt, installiert ihr diese mithilfe von pip3:

pip3 install -r requirements.txt

Wurde das erfolgreich ausgeführt, könnt ihr mit dem Skript teil_1/iterafaceCheck.py prüfen, ob die Versionen passen:

python iterafaceCheck.py

Falls ja, kriegt ihr eine positive Rückmeldung in der Konsole. Das FutureWarning könnt ihr ignorieren:

/Users/xxx/anaconda3/envs/iteraface3/lib/python3.5/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
Your environment is correctly set up!

Ansonsten kriegt ihr eine Fehlermeldung mit dem Hinweis, welche Bibliothek in der falschen Version vorliegt. Im folgenden Fall ist es die Bibliothek matplotlib:

/Users/xxx/anaconda3/envs/iteraface/lib/python3.5/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
ERROR:matplotlib is not in version: 2.2.0 but in version: 2.1.2
Your environment is NOT correctly set up!

Danach könnt ihr die Umgebung wieder deaktivieren:

source deactivate

Pycharm

Den weiteren Code könnt ihr mithilfe von Pycharm implementieren. Für diesen Fall reicht die Community Edition. Ist dieses installiert, könnt ihr den ersten Teil des iteraface Tutorial (teil_1) öffnen:

Nach dem Öffnen ist die Anaconda-Umgebung noch nicht referenziert. Dafür könnt ihr über die "Preferences" zu dem "Project Interpreter" des Projekts navigieren:

Dort müssen wir eine lokale Umgebung hinzufügen:

Diese befindet sich in der Regel im Homeverzeichnis eures Nutzers: ~/anaconda3/envs/iteraface/bin/python

Danach könnt ihr per Rechtsklick auf die Datei iterafaceCheck.py "Run" ausführen, um auch in Pycharm zu prüfen, ob die richtigen Bibliotheken referenziert wurden:

Zusammenfassung

Wir haben im ersten Teil unseres Tutorials unsere Motivation erläutert und euch die Idee hinter dem neuronalen Netz beschrieben. Wenn iterafaceCheck.py erfolgreich durchgelaufen ist, seid ihr bereit für den nächsten Teil unseres Tutorials: Dem Ausschneiden und Erkennen von Gesichtern.

Sie möchten wissen, wie Sie in Ihrem Unternehmen AI sinnvoll einsetzen können?

Genau hierfür bieten wir Ihnen mit unserem Workshop "AI for one day" ein Format, in dem wir gemeinsam mit Ihnen AI entmystifizieren, anfassbar machen und nach Anwendungsmöglichkeiten speziell in Ihrem Unternehmenzu suchen.

Diesen Artikel bewerten
 
 
 
 
 
 
 
3 Bewertungen (100 %)
Bewerten
 
 
 
 
 
 
1
5
5