geschrieben am: 25.11.2018

Die Aufgabe

Ziel des Komplexpraktikums Mensch-Computer-Interaktion war es zu zeigen, dass eine Emotionserkennung von Menschen über das Live-Bild der Kamera von Loomo möglich ist. Zudem sollte die zu entwickelnde Software-Lösung modular und somit leicht erweiterbar aufgebaut sein, damit sie auch in zukünftigen Apps gut integrierbar ist. Wir sollten uns mit den dafür notwendigen Technologien, das sind Machine-Learning, Gesichtserkennung und die Robotik von Loomo (Loomo SDK für Android), auseinander setzen und diese auf deren Praktikabilität und Funktionalität testen. Die Aufgabe wurde in einem Zweierteam bearbeitet.

Die Zielerreichung setzt eine umfassende Planung voraus. Das Szenario soll in einer einzelnen App bereitgestellt werden. Die Funktionalitäten selbst sollten jedoch klar getrennt werden, um diese bei Bedarf in einer anderen App weiterverwenden zu können.

Teilaufgaben

  • Konzeption einer Vorgehensweise zur Erkennung von Emotionen. Machen Sie sich mit bestehenden Ansätzen aus dem Bereich des Machine Learning vertraut.
  • Entwurf einer Nutzerschnittstelle zur Erkennung von Emotionen
  • Entwickeln Sie eine Strategie zur Differenzierung der sechs Basis-Emotionen Angst/Furcht, Glück/Freude, Wut, Traurigkeit, Neugier/Überraschung und Ekel
  • Implementierung der Anwendung: Erkennen von Emotionen und Ausgabe der erkannten Emotion auf dem Display
  • Dokumentieren Sie Ihre Arbeit präzise.

Das ist Loomo

Loomo ist ein von Segway Robotics und Intel entwickelter Roboter, der zum einen zum Transport als ganz normales Segway genutzt werden kann und zum anderen Assistenzaufgaben übernehmen soll. Zum Zeitpunkt des Komplexpraktikums war Loomo noch in der Entwicklung und nicht frei zugänglich. Deshalb könnten sich die technischen Daten mittlerweile geändert haben. Wir haben mit folgenden Spezifikationen gearbeitet:

Loomo

Relevante technische Daten:

  • Android 5.1 (API Level 22, ohne GooglePlay Services)
  • HD Kamera mit 104° FOV, 1080p, 30Hz Streaming
  • LCD Touch Screen mit 800 x 480 Pixel, 4.3 Zoll

Verwendete Technologien:

  • Loomo Vision
  • Loomo Head
  • Android Gesichtserkennung
  • TensorFlow

Kontext der Aufgabe

Um reale Anwendungsszenarien abbilden zu können, müssen zunächst Basisfunktionalitäten geschaffen werden. So sollte Loomo zu einer Art Buttler entwickelt werden. Hierzu muss Loomo seine Umgebung kennenlernen und erkunden können, sowie geeignete Kommunikationsstrategien, entsprechend der Anforderungen seiner Nutzer, unterstützen. Loomo dient dabei als eine Plattform für die Entwicklung von Anwendungen die die bisherige Kommunikation von Menschen und Computern durch multimodale Eingabeformen verbessern.

Getestete Technologien

Gesichtserkennung

Da die GooglePlay Services auf dem Roboter nicht zur Verfügung stehen, konnte nicht auf die durch diese Dienste angebotenen Implementierungen zurückgegriffen werden. Zunächst wirkte OpenCV als sehr vielversprechend, da es von einer großen Community entwickelt wird und auch viele Beispielanwendungen vorhanden sind. Allerdings wird unter Android eine minimierte Version von OpenCV verwendet. Dies hat an einigen Stellen andere Lösungen als unter Java benötigt. Auch stellte sich die Dokumentation für OpenCV4Android als lückenhaft heraus. Als größtes Problem stellte sich jedoch heraus, dass es nicht möglich war, den Kopf von Loomo einem erkannten Gesicht folgen zu lassen, ohne weitere Ressourcen aufzuwenden. Im Einzelnen hätte es bedeutet, einen neue Verbindung zur Kamera aufzubauen und darüber das DTS laufen zu lassen. Dies hätte die Architektur verkompliziert und gegen unsere Software Anforderungen verstoßen. Aus diesem Grund wurde sich für die jetzige Umsetzung entschieden und OpenCV verworfen.

Machine Learning

Die Suche nach geeigneten Machine Learning Algorithmen gestaltete sich insofern schwierig, dass die meisten mittels Python implementiert wurden und Python auf Loomo nicht läuft. Allerdings war TensorFlow von Anfang an sehr vielversprechend. Wesentlicher Vorteil dieser Machine Learning Umsetzung war die explizite Unterstützung mobiler Endgeräte. Außerdem wird TensorFlow durch Google angeboten, was zum einen auf eine langfristige Weiterentwicklung als auch eine gute Qualität schließen lässt.

Das Benutzer-Interface

Erster Entwurf

Dies ist der erste Entwurf des Interfaces. Es werden alle Gesichter erkannt und deren Emotionen berechnet. Die EMotionsausgabe erfolgt über Emoji-Repräsentationen.

Das finale Interface hat keine großen Änderungen gegenüber dem ersten Entwurf. Zu Zwecken der Weiterentwicklung und zum Testen wird zusätzlich noch die ID des erkannten Gesichts, die berechnete Emotion und deren Wahrscheinlichkeit ausgegeben.
Finale Ansicht des Displays

Die Emoji-Repräsentationen kommen von EmojiOne und sind in der Version 2. Die folgenden Emojis haben wir für die geforderten Emotionen ausgewählt:

Nachdenklicher Emoji
Neutraler Emoji
Fröhlicher Emoji
Überraschter Emoji
Nachdenklich. Wird bei einer Wahrscheinlichkeit unter 50% und wenn noch keine Emotion berechnet wurde angezeigt.
Neutral. Dieser Ausdruck wurde zusätzlich zu den Basis-Emotionen als notwendig für die Anwendung empfunden.
Fröhlich.
Überrascht.
Trauriger Emoji
Ängstlicher Emoji
Fröhlicher Emoji
Wütender Emoji
Traurig.
Ängstlich.
Ekel.
Wütend.

Funktionsweise der App

Loomo liefert über seine Kamera einen Bildstream. Das von Loomo bereitgestellte Tracking System DTS prüft ob sich Personen im Bild befinden. Wenn ja, richtet sich der Kopf so aus, dass die erkannte Person mittig im Bild ist. Zum Zeitpunkt der App ENtwicklung hat sich der Kopf nur zum Körper der Person ausgerichtet, eine Gesichtserkennung stand allerdings noch auf der "Coming Soon" Liste von Loomo.

Sobald ein oder mehrere Gesichter erkannt wurden, werden die Gesichtsdaten (Position, Höhe, Breite, ID, ...) und der aktuelle Frame an das FaceRepository übergeben. Das FaceRepository verwaltet die Gesichter des jeweils aktuellen Frames, legt Objekte der Klasse EmojiFace an und bestimmt wann die Emotionserkennung vonstatten geht. Da die Bearbeitung der Bilder (Zuschneiden des Frames auf das Gesicht, Drehen, Skalieren) und die Berechnung der Emotion sehr zulasten der Performance geht, haben wir uns dafür entschieden diese Aufgaben nur jeden 60ten Frame durchzuführen. Dies ist noch nicht die ideale Lösung, war für unsere Aufgabe allerdings die bestmögliche.

Die Ausgabe der Emotion erfolgt auf einem seperaten Thread, um Ausgabe und Verarbeitung parallel laufen lassen zu können. Dennoch sind bei der aktuellen Implementierung Performenceprobleme bei steigender Zahl von Gesichtern im Kamerabild zu beobachten. Der Grund dafür ist bekannt, die Behebung überstieg allerdings den Umfang der Aufgabe.

Aufgetretene Probleme

Als schwierig für die Arbeit hat sich immer wieder erwiesen, dass die Dokumentation des Loomo SDK sehr spärlich ist. Auch die durch Segway zur Verfügung gestellten Beispielanwendungen sind nur kaum bis gar nicht kommentiert und lassen dadurch nur wenige Rückschlüsse auf die Funktionsweise zu. Erstaunlicherweise ist auch TensorFlow Mobile nur wenig bis gar nicht dokumentiert. Dies ist insofern problematisch, als das sich die mobile Umsetzung stark von der normalen unterscheidet. Gerade im Zusammenhang mit den Parametern für die Modellerstellung stellt dies ein Hindernis dar.

Weiterhin auftretende Probleme

Größtes Problem der entwickelten App ist die unzuverlässige Emotionserkennung. Die Ursache hierfür liegt in dem erstellten Graphen, beziehungsweise in der Datengrundlage. Bereits das normale Modell weißt eine Genauigkeit von ca. 30 % auf. Diese wird automatisch von TensorFlow ermittelt. Entsprechend setzt sich dieses Problem auf dem Loomo fort.

Die Korrektheit der ermittelten Emotion wird zusätzlich durch den Datensatz limitiert. Die Qualität der darin enthaltenen Bilder ist sehr durchwachsen. Die Größe von 32x32 Pixeln bereitet auch insofern Probleme, dass durch TensorFlow Mobile nur die Bildgrößen 128,160,192 und 224px optimal unterstützt werden.

Bei der Anwendung des Modells auf dem Roboter entsteht zusätzlich das Problem der Verzerrung. Ursache hierfür ist die Größe des Loomo, dieser schaut immer von unten. Der Testdatensatz wiederum hat aber zum Großteil Frontalaufnahmen, weshalb die Ergebnisse dann am besten sind, wenn man direkt in die Kamera schaut. Durch diese Perspektive tritt dann auch noch das Problem der Gesichtserkennung bei Gegenlicht zu Tage. Da aufgrund der Perspektive auch Deckenlicht für Gegenlicht sorgt und nicht nur einstrahlendes Tageslicht, tritt dieser Umstand häufiger auf.

Durch die Verwendung von DTS verfolgt der Kopf des Roboters den Oberkörper einer erkannten Person, aber somit nicht zwangsläufig den Kopf. Auch ist nicht immer klar zu sagen, welcher Person er folgt, wenn mehr als eine Person erkannt werden.

Erkenntnisse und Ausblick

Um die Emotionserkennung zu verbessern sollte die Datengrundlage verändert werden. Der Kaggle Datensatz weißt eine gewisse Menge von fehlerhaften Bildern auf (beispielsweise Smileys). Außerdem ist die Auflösung der Bilder mit 32x32 Pixeln sehr gering. Um dieses Problem zu bewältigen ist die Lösung mit den höchsten Erfolgsaussichten sicher eine Verwendung eines anderen Modelldatensatzes beziehungsweise die Erstellung eines eigenen Datensatzes.

Weitere Probleme bestehen darin, dass die Verzerrung in den Bildern ausgeglichen werden sollte. Diese entsteht durch die niedrige Position der Kamera im Loomo. Somit lässt sich das Problem nicht auf Seiten der Hardware lösen, sondern muss durch Software geregelt werden.

Ein weiteres Problem besteht durch das Gegenlicht. Somit werden Gesichter zum Teil nicht erkannt. Hier wäre es vorstellbar, die erfassten Bilder so zu bearbeiten, dass diese Einflüsse verringert werden. Möglicherweise ist auch die Optimierung des TensorFlow Modells mit mehr Fehlern behaftet, als erwartet. Vorstellbar wäre an dieser Stelle auch die Umstellung auf TensorFlow Lite. Dabei handelt es sich um eine Weiterentwicklung der mobilen TensorFlow Anwendung. Aufgrund des Aufbaus der Schnittstellen in der App sollte dies Umstellung gut umsetzbar sein.

Auch sollte betrachtet werden, ob die Auswahl der Emotionen optimal ist, oder ob nicht eine Verringerung der möglichen Emotionen zu besseren Ergebnissen führt. Beispielsweise ist der größte Unterschied zwischen den Emojis für Überraschung und Furcht, dass bei letzterem zwei Hände abgebildet werden. Da Emojis eine vereinfachte Darstellung von Gesichtern realer Menschen darstellen, deutet auch dies bereits auf eine schwierige Unterscheidung in der vorliegenden App hin.

Des Weiteren ist eine zusätzliche Validierung der erkannten Emotion durch Analyse der Sprache der erkannten Person, beziehungsweise möglicher Indizien der Körperhaltung vorstellbar. Hierfür ist aber sicherlich ebenfalls eine Analyse nötig, inwiefern dies relevante und messbare Indikatoren sind.