Gesichtserkennung selbst gebaut

In diesem Beitrag möchte ich Euch zeigen wie Ihr mit einfachen und frei verfügbaren Mitteln eine Gesichtserkennung unter Linux(hier Ubuntu) realisieren und darauf basierend verschiedene Aktionen auslösen könnt.

Was gibt es nicht mittlerweile alles für Möglichkeiten um heute Zugang zu einem Gebäude zu bekommen. Da wären: Zugangskarten, Fingerprint Sensoren, RFID-Tokens, Zahlencodes, Handy Apps und zu guter Letzt natürlich der gute alte Schlüssel. Ich denke State-of-the-Art ist die Identifikation auf Basis von Stimme oder sogar Gesichtserkennung. Wenn man sowieso einen IP-Kamera an der Eingangstür hat ist es naheliegend einfach Mal auszuprobieren was da so geht. Wir haben eine Mobotix T24 Doorstation die ein echtes Multitalent im Bereich der IP Technologie ist. Ich möchte aber auch betonen das für diesen Anwendungsfall jede einfache IP-Kamera ausreicht – sogar ein Raspberry Pi mit Kameramodul.

Warnung Das hier beschriebene Setup stellt keine 100% sichere Zugangskontrolle dar. Da die Bildanalyse nur mit einer Frontalkamera durchgeführt wird ist es unter Umständen möglich das System mit einem einfachen Foto der berechtigten Person auszutricksen. Deshalb sollte es immer nur als zusätzliche Methode mit anderen Autorisierungsverfahren kombiniert werden !

dlib

Die Kernkomponente unseres Setups ist die dlib Library. Hierbei handelt es sich um eine frei verfügbare C++ Bibliothek die zahlreiche Machine Learning Algorithmen enthält. Unter anderem gibt es dort eine Funktion die “High quality face recognition”
bereitstellt. Diese Feature werden wir nutzen. Um dlib auf ein Ubuntu System zu installieren müssen folgende Schritte durchgeführt werden(Quelle: Github Seite von Adam Geitgey):

Sicherstellen dass Python3 installiert ist.

Notwendige Pakete installieren

Aufräumen

Github Repository clonen

Bauen der dlib Bibliothek

Ich musste den Build Parameter -DUSE_AVX_INSTRUCTIONS auf 0 setzen da ich auf einer virtuellen Maschine ohne GPU-Beschleunigung arbeite. Wer eine Hardware Grafikkarte nutzen kann sollte den Wert vermutlich auf 1 lassen.

Bauen der dlib Python-Extensions

Hier gilt das gleiche: Wer eine GPU zu Verfügung hat setzt den Parameter USE_AVX_INSTRUCTIONS auf ‘yes’ statt ‘no’.

Python Coding

Jetzt muss der notwendige Python Code geschrieben werden. Vom Ablauf her sieht das grundsätzlich so aus:

  • Jemand löst einen Trigger aus(z.B. Türklingel)
  • Das Prozessablauf wird dadurch gestartet
  • Der Python Code holt sich nun ein aktuelles Bild von der Kamera
  • Das Bild wird mit vorab hinterlegten Gesichtern verglichen(jetzt kommt dlib in’s Spiel)
  • Wenn wir einen Match erhalten wird eine Aktion ausgelöst z.B. Sprachansage und Tür öffnen.

    Eine gute Dokumentation wie dlib in Python verwendet wird findet Ihr auf Github

    Code Beispiel

    An dieser Stelle möchte ich Euch mein Beispielprogramm vorstellen.

    Hinweis Das hier ist ein funktionierender Prototyp. Ich weiss dass schöner Code anders aussieht. Wenn ich Mal viel Zeit habe werde ich das ganze einem Refactoring unterziehen !

    Es handelt sich um einen Python Daemon der auf einen http Trigger via OpenHAB lauscht. OpenHAB erhält eine Info über ein Klingel-Event und leitet dies das umgehend via http an den Daemon weiter. Jetzt wird sofort via http ein aktuelles Kamera Bild abgeholt und nach /tmp/current.jpg abgelegt. Dieses Bild wird nun mit den beiden vorhandenen Bildern abgeglichen. Wenn es eine Übereinstimmung gibt, wird via http auf der Kamera ein personenspezifisches MP3 File abgespielt(“Identifikation von Person xy erfolgreich. Zugang gewährt…”). Danach wird der aktuelle Verschluss-Status der Haustür geprüft(Request gegen OpenHAB). Ist diese geschlossen wird ein Entriegelungsimpuls via http an die Türstation gesendet und …voila…. Sesam öffnet sich 🙂

    Please follow and like us:
  • Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

    Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.