Bildbasierte Detektion des Garagentores (Teil 4)

Einleitung

Im letzten Teil der Serie zur Detektion eines Garagentores kümmern wir uns um ein Frontend damit wir das Ergebnis der Klassifikation anzeigen zu können. Da die Vorhersage über eine Web API abgerufen wird sind verschiedene Ansätze denkbar. Wir haben uns für einen Chat-Bot entschieden, den wir mit Hilfe des Microsoft Bot Frameworks [MsBotFramework] umgesetzt haben.

Ablauf

Vorhersage, generic.de AG

Figure 1: Skizzierter Ablauf zur Anzeige des Torzustandes

Der Ablauf ist in Figure 1 skizziert. Wie auch im ersten Teil nutzen wir einen Raspberry PI 3 um ein Bild an unseren Server zu übermitteln. Anstatt nun aber das Bild zu persistieren, übermitteln wir es an unsere Prediction API und speichern das Ergebnis. Fragt nun ein Nutzer über unserer Bot an, ob das Tor gechlossen ist, kann der Bot am Server anfragen und das Ergebnis an den Nutzer in natürlicher Sprache übermitteln.

Implementierung

Erweiterung des Web Servers
Im ersten Teil dieser Artikelserie nutzten wir eine in Flask erstellte Web API um vom Raspberry PI aufgenommene Bilder für ein späteres Training in Azure abzulegen. Diese API erweitern wir nun um einen Request, um für ein übermitteltes Bild eine Vorhersage zu erstellen, sowie um die aktuell gespeicherte Vorhersage abzurufen:

CustomVisionHost ist die Url zur aktuellen Iteration unserer CustomVision Api (die Api haben wir im dritten Teil der Artikelserie erstellt).

Zusätzlich müssen wir zwei Header übertragen:

Die Response der CustomVision Api speichern wir in der globalen Variable prediction, die wir im GET-Request als Json zurück liefern.

Bot

Erstellung
Für die Erstellung des Bots nutzten wir das Microsoft Bot Framework [MsBotFramework]. Man kann nun entweder lokal oder direkt in Azure einen Bot erstellen. Man kann den lokal erstellten Bot aber später in Azure deployen und den in Azure erstellten Bot mittels Continuous Integration lokal entwickeln, sodass das Vorgehen an dieser Stelle den eigenen Vorlieben überlassen bleibt.

Wir erstellten unseren Bot direkt in Azure und nutzten das Luis-Template. Während man durch die Erstellung des Templates gelotst wird, muss man automatisch eine Luis App erstellen. Auf diese kann später unter https://www.luis.ai zugegriffen werden.
Standardmäßig startet eine Luis App mit einem Intent, dem None-Intent. Wir erstellten zusätzlich einen weiteren Intent, bei dem wir die folgenden Utterances hinzufügten:

  • Habe ich vergessen das Garagentor zu schließen?
  • Ist das Garagentor geschlossen?
  • Ist das Garagentor zu?
  • Habe ich das Garagentor zu gemacht?
  • Ist das Garagentor offen?

Mit diesen Utterances starteten wir unsere ersten Versuche. Dabei stellten wir allerdings fest, dass Luis nahezu alle Anfragen als Anfrage nach dem Zustand des Garagentores interpretierte. Wir hatten schlicht vergessen, Luis auch mit Negativ-Beispielen zu trainieren, um eine sinnvolle Unterscheidung zwischen einer Frage nach dem Garagentor und etwas völlig anderem zu unterscheiden. Nachdem wir diese ergänzt und auf den None-Intent gematched hatten war die Unterscheidung der Anfragen deutlich besser.
Später konnten wir weitere Utterances hinzufügen, da Luis diese logt und unter dem Tab Suggested Utterances als Vorschlag anbietet.

Programmierung
Da wir das Template „Language Understanding“ für die Erstellung des Bots nutzten, wurde uns bereits das Basi-Setup abgenommen. Wir mussten lediglich die Klasse BasicLuisDialog erweitern.

Wurde von Luis erkannt, dass der Zustand des Garagentores abgefragt werden sollte, landeten wir in obiger Methode. Darin rufen wir zunächst über die Methode GetPredictionCollection den aktuellen Zustand ab und generieren eine passende Antwort.
Den Bot haben wir für Skype freigeschaltet und ihn dort unseren Kontakten hinzugefügt. Eine exemplarische Anfrage kann in Figure 2 betrachtet werden.

Figure 2: Skype-Chat mit dem Bot

Figure 2: Skype-Chat mit dem Bot

Wie man auch in obigem Listing sehen kann, ist der von uns implementierte Bot-Code relativ einfach. Die schwere Arbeit (das Textverstehen und die Erkennung der Intention des Users) wird von der Luis API übernommen. Wie auch die Custom Vision API speichert Luis die Chat-Nachrichten und kann dadurch immer weiter trainiert und verbessert werden.

Zusammenfassung

In diesem Artikel haben wir die einzelnen Ideen und Versuche aus den vorherigen Artikeln zusammengefasst. Wir nutzten den Raspberry PI sowie die in Flask implementierte API, die wir im ersten Teil eingerichtet hatten und nutzten zur Klassifikation die im dritten Teil trainierte Custom Vision API. Lediglich die Erkenntise aus dem zweiten Teil haben wir nicht verwendet, da mit der auf der Build-Konferenz vorgestellten Custom Vision API ein weit besserer Klassifikator möglich war.
Mit diesem Beitrag endet nun die Artikelserie zur Detektion des Garagentores. Eine zukünftige Erweiterung des Szenarios könnte beispielsweise darin bestehen, den Bot proaktiv Nachrichten an registrierte Nutzer zu schicken, wenn vergessen wurde das Tor zu schließen. Oder man könnte den Bot ermöglichen das Tor per Befehl selbstständig zu öffnen oder zu schließen.