ANEXIA Blog

It’s playtime: Was können Machine Learning, Amazon Alexa und Smart Home?

Showcase-App-Teaser

In unseren mobilen Trends für 2019 haben wir es schon angesprochen: Machine Learning, Smart Home Applikationen und erweiterte mobile Endgeräte wie Smartwatches oder auch Sprachassistenten werden die Welt der mobilen Entwicklung in den kommenden Jahren stark prägen. Aber wie funktionieren diese Dinge im Einzelnen? Wie interagieren sie miteinander? Vor welchen Herausforderungen in der Entwicklung steht man bei der Implementierung einer App? Worin steckt Potential und was sind die Risiken?

Um den Antworten zu diesen Fragen auf die Spur zu kommen, hat Anexia die ANX.labs gegründet: ein interaktiver Forschungs- und Spielraum, der die Anexianer einlädt, mit neuen Technologien zu experimentieren. Hier ist ein erster Erfahrungsbericht von unserem Entwicklerteam.

Ausgangspunkt

Die Anforderung war es, eine iPhone App zu entwickeln, die Gesichter erkennt und auswertet: wie alt ist eine Person, welches Geschlecht hat sie und welche Stimmung? Im Anschluss sollte eine Social Media-Anbindung implementiert werden, sowie mögliche Interaktionen zwischen den Smarthome Lampen Philips Hue und einer Amazon Alexa.

Herausforderungen und Lösungen

Gesichtserkennung: Machine Learning & API Services

Die erste Aufgabe war es, eine Möglichkeit zur Gesichtserkennung zu finden. Da es unser Anspruch war, eine plattformübergreifende App zu erstellen, konnten wir keine plattformspezifischen iOS oder Android Lösungen verwenden. Das ist schade, denn Apple bietet für die iOS Plattform Core ML an, das voll hardwarebeschleunigt auf iPhones läuft. Im ersten Schritt haben wir daher versucht, Machine Learning (ML) Modelle zur Gesichts- und Emotionserkennung zu integrieren. Da wir für dieses Projekt natürlich nicht die notwendigen Training-, Validation- und Test-Datasets hatten, um eigene ML Modelle zu erstellen, mussten wir zuerst auf frei verfügbare zurückgreifen. Wir konnten Tensorflow Modelle verwenden und sie mit entsprechenden Tools zum Apple Core ML Format umwandeln: Core ML war also auf diesem Umweg doch möglich. Android unterstützt Tensorflow Modelle natürlich nativ, da das Format direkt von Google stammt.

Erste Tests ergaben ein sehr erstaunliches Ergebnis: auf iOS funktioniert die Bilderkennung durch Hardwarebeschleunigung unglaublich schnell. Die Zeit, welche z.B. ein iPhone X benötigt um ein 5 Megapixel Bild zu analysieren, lag unter 10 Millisekunden! Also kamen wir auf die Idee, nicht nur statische Bilder zu analysieren, sondern sogar Videostreams. Das war für das iPhone überhaupt kein Problem. Im Gegenteil, die Erkennung war so schnell, dass die Werte aus dem ML Modell sich auch im UI so schnell änderten, dass nur noch flackernde Zahlen zu sehen waren. Also mussten wir die Auswertung künstlich drosseln. Nachdem wir nun die Qualität des Ergebnisses testen konnten, mussten wir leider bald feststellen: ML Modelle eignen sich nur bedingt für Geschlechts- und Emotionserkennung. Die Erkennungsrate lag bei ca. 50% oder sogar noch darunter. Außerdem waren die Modelle riesig, die iOS App war alles in allem ca. 500 MB groß. Wir mussten eine andere Lösung finden. Der erste Gedanke war, nach API Services zu suchen, die diese Funktionalität anbieten.

Wir begannen also mit der Evaluierung. Wie sich herausstellte, gibt es da bereits eine Menge. Sowohl die großen Anbieter wie Amazon, Google oder Microsoft, als auch eine Menge kleinerer Anbieter bieten solche APIs an. Von diesen stach bei Testberichten vor allem einer immer wieder heraus: Kairos. Der große Vorteil im Vergleich zu Amazon und Google ist, dass man deren SDK lizensieren und so auf eigenen Servern hosten kann. Ein wichtiger Punkt, den unsere Kunden zu schätzen wissen, vor allem in Bezug auf das Thema Datenschutz. Gerade Gesichtserkennung ist da ein sehr sensibles Thema. Jedoch mussten wir, trotz all der guten Testberichte, bald feststellen, dass die Qualität von Kairos uns nicht überzeugen konnte. Weder wurden Alter und Geschlecht gut erkannt, noch schafften wir es, konsistent Werte für Emotionen zu bekommen. Manchmal funktionierte die API, manchmal nicht. Wir waren enttäuscht und gaben auf, uns auf Google Testberichte zu verlassen.

Der zweite API-Versuch sollte die Lösung sein: Microsoft Face API. Wir waren verblüfft! Nicht nur, dass der Microsoft-Dienst beinahe jedes Gesicht erkannte, die zurückgelieferten Werte waren unglaublich präzise. Das Alter wurde meistens in einem Bereich von 5 Jahren korrekt erkannt, das Geschlecht beinahe jedes Mal. Auch bei der Emotionserkennung lag die API um Längen vor der Konkurrenz. Microsoft bietet die Face API im Rahmen ihrer Azure Cloud Services an und da es freie Entwickler Accounts gibt, haben wir sie sofort in die App integriert. Auch die Integration des Dienstes war um einiges einfacher als bei der Konkurrenz. Im Grunde reicht ein API Call, dem man eine Bild URL mitgibt. Volltreffer! Da Anexia als Hosting Provider jede Form von Storage unterstützt, haben wir das Bild, das der User von sich selbst in der App macht, auf unseren eigenem S3 Storage hochgeladen. Aufgrund der vollen Kompatibilität zu Amazon S3 war auch das ein Kinderspiel.

Das heißt, die erste Aufgabe war zu unserer vollsten Zufriedenheit erledigt. Unsere App unterstützte Gesichtserkennung und gab Alter, Geschlecht und Emotion in den allermeisten Fällen korrekt aus.

Smart Home: Philips Hue

Die nächste Aufgabe war es, Philips Hue Support in die App zu integrieren. Es sollte, falls die App mit einer Philips Hue Installation verbunden war, jede erkannte Emotion zu einem anderen Licht führen. Wenn die App Freude erkennt, sollen angeschlossene Philips Hue Lampen auf ein leuchtendes Orange schalten, Ärger sollte zu einem grellen Rot werden, und so weiter. Im Grunde eine leichte Aufgabe – mag man denken. Aber auch hier steckt der Teufel im Detail. Wie sich herausstellte, ist das von Philips zur Verfügung gestellte iOS SDK nicht auf der Höhe der Zeit, und hat uns bei der Einbindung in unsere App so einige Steine in den Weg gelegt. So mussten wir mehrere Workarounds anwenden, waren aber schlussendlich erfolgreich. Wir konnten nun endlich die angeschlossenen Hue Lampen so leuchten lassen, wie wir wollten. Ziel erreicht!

Amazon Alexa: Skill, AWS Lambda und App-Verbindung

Nächste Herausforderung: Alexa Integration. Keiner wusste so recht, auf welche Weise wir Alexa sinnvoll in die App integrieren sollten, damit arbeiten wollten wir trotzdem. Es geht ja darum, zu experimentieren und so viele Technologien wie möglich kennenzulernen. Die Frage ist also: Was ist der Anwendungsfall? Fürs Erste haben wir uns für den einfachen Weg entschlossen. Alexa soll als eine Art „Selbstauslöser” das Fotoschießen in der App erledigen: „Alexa, starte die Gesichtserkennung und schieß ein Foto”. Gesagt, getan…

Die erste Aufgabe war die Erstellung eines Alexa Skills. Da Alexa ein Dienst des „normalen“ Amazon Marketplace ist, wird kein Amazon Web Services Account benötigt. Das Erstellen des Skills selbst ist einfach. Amazon hat alles wunderbar dokumentiert und leitet mit Videotutorials und sehr viel verständlicher Dokumentation durch die Erstellung. Man bringt Alexa bei, auf welche Worte sie reagieren soll und was geschehen soll, wenn die Worte korrekt von Alexa erkannt wurden. Im Grunde gibt es nur zwei Möglichkeiten:

Amazon empfiehlt AWS Lambda zu verwenden. Wenn man einen Blick auf die Dokumentation zur Erstellung des Webservices wirft, wird schnell klar warum: es hätte Wochen gedauert, so einen Service zu erstellen. Amazons Sicherheitsanforderungen sind sehr hoch (was auch gut ist). Der AWS Lambda Weg ist auch genauso kinderleicht. Es dauerte keine 30 Minuten und Alexa ruft die AWS Lambda Funktion korrekt auf. AWS Lambda ist ein sogenannter Function-as-a-Service-Dienst (FaaS) von Amazon. Man erstellt keinen kompletten, eigenen Webservice, sondern implementiert nur eine einzelne Funktion und AWS kümmert sich darum, alle Ressourcen bereitzustellen, sobald diese Funktion aufgerufen wird. Der Clou dabei ist das Pay-per-Call Zahlmodell. Das kann, wie in unserer Experimentier-App oft weit günstiger sein, als eigene Server am Laufen zu halten und der Aufwand zur Implementierung reduziert sich gewaltig.

Die nächste Herausforderung war die Verbindung der Lambda Funktion zur App, um das Fotoschieß-Kommando auszuführen. Unsere erste Idee waren Push Notifications. Wenn man jedoch tiefer in die Apple Dokumentation schaut, erkennt man bald, dass Push Notifications dafür nicht unbedingt der optimale Weg sind. Sie werden  im Standardfall zuerst dem User angezeigt, der dann darauf tippen muss, um die zugehörige App zu öffnen. Dieses Verhalten wollten wir aber umgehen, damit der User hier nicht zu einer unnötigen Interaktion gedrängt wird. Wir wollten, dass Alexa das Foto auslöst, wenn die App bereits geöffnet ist. Zwar gibt es „Silent Push Notifications”, welche der App direkt zugestellt werden, ohne dass der User das mitbekommt, allerdings empfiehlt Apple, Silent Push Notifications nur selten zu verwenden, nicht öfter als 3 Mal pro Stunde. Hält man sich nicht daran, kann es passieren, dass Apples Push Dienste eine Notification einfach verwerfen. Uns war die Frequenz zu niedrig, denn Ziel war es, dass die App jedes Mal reagiert, wenn Alexa „befiehlt”. Also brauchen wir einen anderen Weg und zwar einfach, verlässlich und schnell.

Die Lösung dafür ist PubNub, ein Dienst, der real-time Notifications zwischen beliebigen Geräten anbietet. Man kann Daten von Server zu Server schicken, vom Client zum Server oder umgekehrt. Die Kommunikation geschieht in alle Richtungen und in Echtzeit. Die Integration war unglaublich einfach. Es gibt Libraries für so ziemlich alle Plattformen, natürlich auch für iOS und Android. Auf der AWS Lambda Funktion haben wir uns für eine Python Implementierung entschieden, denn auch für Python gibt es natürlich ein SDK. Innerhalb kürzester Zeit war die Verbindung hergestellt und wir konnten Alexa tatsächlich befehlen, ein Foto in unserer App zu schießen.

Unsere App ist damit bereits ziemlich umfangreich. Eine Frage stellt sich aktuell aber noch: Wenn wir die App auf mehreren iPhones gleichzeitig öffnen, wie können wir Alexa sagen, auf welchem Gerät sie das Foto schießen soll? Uns fiel nichts ein. Könnte man eigene Worte im Alexa Skill festlegen, welche dann nur für ein bestimmtes Gerät gelten? Was aber, wenn die App auf 20, 50 oder 100 Geräten gleichzeitig startet?

Dieses Konzept-Problem werden wir in der nächsten Zeit in Angriff nehmen. Die Ideen gehen uns nicht aus! ?

Ausblick

Das aktuelle Zwischenergebnis ist unsere sogenannte „Anexia Showcase App“. Sie kann

Und das bisherige Fazit? Großes Potential liegt darin, die verschiedenen Funktionen und Dienste miteinander zu verknüpfen. Auch waren wir überrascht, wie eine schon sehr simple Smart Home Anwendung unsere Kollegen amüsieren kann. Da ist noch viel Luft nach oben. An was man aber trotzdem immer denken sollte, ist das Ziel: Was will ich mit einer Smart Home App eigentlich erreichen? Worin soll der Mehrwert der App liegen?

Unsere App war natürlich eine Spielwiese, das Ziel war hier einfach mal ausprobieren. Dabei stößt man auf verschiedenste Probleme und lernt abseits der Entwicklung auch vieles über diverse SDKs, Anbieter und deren Supportverhalten. Der Weg, den wir gegangen sind, hat uns allen unglaublich Spaß gemacht, wir haben viel gelernt und sind auch sehr stolz darauf!

Den Quellcode zu der App gibt es übrigens auf GitHub:

https://github.com/anexia-it/anexia-showcase-app-ios


Das erlernte bieten wir gerne auch unseren Kunden an. Wer auf der Suche ist nach einem kompetenten Entwicklungspartner für iOS Entwicklung, mobile Entwicklung im Allgemeinen, Alexa Skill Entwicklung oder Smart Home Applikationen ist bei uns an der richtigen Adresse. Unser Projektmanagementteam berät dich gerne unverbindlich.

Die mobile Version verlassen