Doorman

Inspiration

In unserem Unternehmen gibt es eine Menge Leute, die remote und im Büro arbeiten (mehrere Standorte). Manchmal ist schwer herauszufinden, ob jemand aktiv/verfügbar ist oder nicht, und wo sich die Person befindet. Manchmal vergessen Mitarbeiter auch, ihren Status auf „aktiv“ zu setzen. Wir haben es außerdem mit mehreren Regionen und Zeitzonen zu tun.

Wir verwenden auch die persönliche Statusmitteilung in Slack dazu, um anzugeben, wo man ist (Home-Office, im Büro, und falls ja, an welchem Standort).

Hier kommt DeepLens ins Spiel. Wäre es nicht großartig, wenn man immer gleich erkannt und in Slack als „aktiv“ mit dem korrekten Standort markiert wird, wenn man ins Büro kommt?

Was die Lösung kann

  • Sie erkennt, wenn eine Person eine der Niederlassungen betritt
  • Sie versucht, die Person zu erkennen
  • Sie identifiziert die Person und begrüßt sie auf Slack „Willkommen @svdgraaf!“
  • Kann die Person nicht identifiziert werden, fragt sie auf Slack: „Wer ist das?“ Man kann dann auswählen, um welchen Benutzer es sich handelt.
  • Soll die Person nicht erkannt werden (z. B. Kunden oder Personen, die Slack nicht nutzen), kann man „ignorieren“ wählen und das Bild von S3 entfernen.
  • Diese Information wird anschließend in der Rekognition-API gespeichert.
    Beim nächsten mal wird die Person identifiziert und auf dem Slack-Kanal gemeldet.

Was die Lösung noch nicht kann:

  • Eine Person auf Slack als „aktiv“ kennzeichnen
  • Den Status der Person auf Slack einstellen
  • Mit Polly sprechen – das habe ich auf dem Gerät noch nicht zum Laufen gebracht

Verfasst von: Sander van de Graaf

Entwicklung

Ich habe das mit Serverless entwickelt, was die Bereitstellung der Lambda Functions sehr einfach macht. Ich habe versucht, mein eigenes Modell zu entwickelt, was aber nicht funktioniert hat (und ich hatte Sorge wegen der Kosten für das Training der ec2 -Instances). Schlussendlich habe ich das „deeplens-object-detection“-Modell verwendet und kein benutzerdefiniertes sowie eine Prüfung von „person“-Objekten.

Funktionsweise: DeepLens erkennt Objekte, die vorbei laufen. Wenn eine Person erkannt wird, wird ein Schnappschuss dieses Teils erstellt und zu S3 hochgeladen. Das löst eine „guess“-Funktion aus, die versucht, die Person zu erkennen. Wenn die Person bekannt ist, wird die Slack-API aufgerufen. Ist sie nicht bekannt, wird Slack ebenfalls aufgerufen. Im Kanal können Benutzer die unbekannte Person anlernen und mit einem spezifischen Benutzer verknüpfen. Dann wird das API Gateway aufgerufen und das Bild wird angelernt.

Das Architekturdiagramm findet sich im Bilderkarussell oben.

Herausforderungen

Greengrass: Ein paar Mal hat Greengrass nicht funktioniert, als die Lambda-Function nicht bereitgestellt oder ausgeführt.

DeepLens: Meine DeepLens hat funktioniert, dann man nächsten Tag auf einmal nicht. Die Funktion für automatische Updates bei Ubuntu ist nett solange sie funktioniert. :) Außerdem: Ich habe eine Weile gebraucht, bis ich herausgefunden habe, wie man mehrere Lambda-Funktionen gleichzeitig auf DeepLens ausführt. Verblüffend!
 
Protokollierung: Das Debugging der Lambda-Functions ist wirklich schwer auf einem Gerät, das nicht funktioniert. Ich habe schließlich eine Möglichkeit gefunden, die Protokolle auf Cloudwatch zu verschieben. Praktisch, aber nicht sehr gut dokumentiert.

Datenschutzprobleme: (konfigurierte Zeit und Steuerung) – ein Mitarbeiter bat, vom Test ausgenommen zu werden. Die Auswirkungen waren mir klar. Zum Glück war das nur ein POC und zum Spaß. Es hat aber eine hilfreiche Diskussion über Datenschutzbedenken bei derartigen Technologien ausgelöst. Wir haben schließlich ein Zeitfenster zwischen 8:00 und 22:00 Uhr eingerichtet, in dem die Erkennung aktiv ist.

Slack-API
(Timeout ist sehr kurz): Ich musste auf die harte Weise lernen, dass man in der Slack-API innerhalb von ein paar Millisekunden antworten muss und sie sonst nicht funktioniert. Ich habe schließlich einen anderen Aufruf asynchron durchgeführt, um alles korrekt zum Laufen zu bringen.

Polly: Ich habe das Generieren von MP3s startklar und kann sie einwandfrei lokal abspielen. Ich habe nur noch nicht herausgefunden, wie man sie auf DeepLens an sich abspielen kann.

Erfolge, die mich stolz machen

Es funktioniert! Es ist wirklich cool zu sehen, wie all die Lamda-Function einander auslösen und ihren Job erledigen, ganz ohne Server. Wirklich eine tolle Sache! 

Was ich gelernt habe

  • Greengrass
  • Slack-API
  • OpenCV
  • Polly

Die nächsten Themen

Asynchroner Upload von S3: Derzeit ist der S3-Upload blockiert, was für sich selbst genommen okay ist, denn dann werden nicht endlos viele Bilder derselben Person hochgeladen. Allerdings sperrt das momentan den Stream. Ich stelle mir vor, dass ich die Dateien einfach irgendwo in einen lokalen Ordner (tmp) schreibe und eine andere Lambda-Function sie dann hochlädt oder – was noch besser wäre – Gesichter direkt auf dem Gerät erkennt.

Kein mehrfaches Auslösen: Immer wenn eine Person langsam an der Kamera vorbei oder innerhalb einer Minute wieder zurück geht, bekommt man mehrere Postings auf Slack. Ich möchte eine Funktion integrieren, die einen Zeitstempel mit dem Moment speichert, indem die Person in Dynamo erkannt wurde. Wann immer diese Person dann innerhalb eines Zeitraums von X erneut gesehen wird, erfolgt kein Posting auf Slack.,

Gesichtserkennung auf dem Gerät: Es wäre wirklich hübsch, wenn ich das direkt auf dem Gerät zum Laufen kriegen würde.

Slack-App öffentlich machen: Im Moment muss man eine eigene „Dev“-Slack-App einrichten, damit die Integration läuft. Es wäre schön, wenn ich meine App veröffentlichen kann und nur auf die richtige App verweisen muss.

Amazon Polly integrieren: Ich habe an der Polly-API gearbeitet, das Generieren der MP3s funktioniert, doch habe ich noch keine Möglichkeit gefunden, das MP3 auf DeepLens abzuspielen. Ich habe Lautsprecher parat. ;)

Die Person als „aktiv“ kennzeichnen: Derzeit ist es nicht erlaubt, eine Person über die Slack-API ohne deren Zustimmung als „aktiv“ zu kennzeichnen. Da ich meine Kollegen nicht nerven möchte, wurde das bisher nicht integriert.

Den Personenstatus kennzeichnen: Wie oben, der Endbenutzer muss das manuell genehmigen. Es wäre gut, wenn man den aktuellen Bürostandort im Status der Person kennzeichnen könnte.

Entwickelt mit

Python
DeepLens
Rekognition
Serverless
Polly

Jetzt testen