iX 1/2018
S. 131
Praxis
Maschinelle Bildverarbeitung
Aufmacherbild

Gesichtserkennung mit OpenCV und Python, Teil 3: Personen per Webcam identifizieren

Zeig mir dein Gesicht

Ein paar Zeilen Python-Code reichen bereits aus, um mit OpenCV bekannte Gesichter in einem Videostream zu markieren. Mehr Arbeit macht die Bereitstellung von hochwertigem Trainingsmaterial.

Die ersten beiden Teile dieses Tutorials haben die Konzepte Gesichtsdetektion und -erkennung erklärt, die Installation einer aktuellen OpenCV-Version beschrieben, die Nutzung der Bildverarbeitungsbibliothek aus Python-Skripten heraus gezeigt und die relevanten OpenCV-Funktionen erläutert. Nun geht es an die Praxis: ein Python-Skript, das den Stream einer angeschlossenen Webcam abgreift, Gesichter im Bild detektiert und anschließend erkennt, wem dieses Gesicht gehört.

Kurz zur Erinnerung: Detektion heißt, zu prüfen, ob sich ein Gesicht in einem Bild befindet. Erkennen bedeutet, das Gesicht von anderen Gesichtern zu unterscheiden, um es einer Person zuzuordnen. Das Abgreifen des Webstreams und das Detektieren von Gesichtern darin war bereits im ersten Teil des Tutorials Thema: Ein Beispielskript zeichnete einen grünen Rahmen um detektierte Gesichter. Der interessantere Part ist die Erkennung. Hier muss ein wenig Vorarbeit geleistet werden, schließlich benötigt OpenCV Referenzen, mit denen detektierte Gesichter abgeglichen werden können.

Es gibt im Netz fertige Gesichtsdatenbestände, die auch in der offiziellen OpenCV-Dokumentation genutzt werden – für Tests und Demos ist das der richtige Ansatz. Eine eigene Anwendung muss aber mit eigenen Bildern arbeiten. Allerdings kann man nicht einfach beliebige Fotos verwenden, um OpenCV beizubringen, wie die Gesichter von Alice und Bob aussehen – es müssen genormte Bilder sein. Der erste Schritt besteht also darin, vorhandene Fotos zu normieren. Im zweiten Schritt muss die Gesichtserkennung mit den Bildern trainiert werden.

Das eigentliche Erkennungsskript liest schließlich den Webcam-Stream ein, erkennt darin Gesichter, vergleicht sie mit den gelernten Personen und zeigt schließlich Treffer im Livebild an. Das Skript ist in Python 3 geschrieben; die hier gezeigte Vorgehensweise sollte sich unter Debian und Ubuntu genau so nachvollziehen lassen.

Bilder vorbereiten und normieren

Für die Vorbereitungsarbeiten liefert die OpenCV-Dokumentation fertige Skripte. Das Normierungsskript align_images.py haben wir leicht modifiziert, um die zu verarbeitenden Bilder einfacher angeben zu können. Dieses und die anderen Skripte lassen sich unter ix.de/1801131 herunterladen; das Beispiel geht davon aus, dass sie im Ordner ~/facerec gespeichert sind.

Zunächst werden also Fotos vom Gesicht der zu erkennenden Personen benötigt. Zum Durchspielen genügt bereits eine Handvoll Bilder jeder Person. Für ordentliche Ergebnisse bei der Erkennung braucht OpenCV mindestens acht Bilder pro Person, mehr Bilder sorgen für eine bessere Erkennungsleistung.

Das Skript align_images_modified.py skaliert, dreht, zentriert und schneidet die Bilder so zu, dass jedes Bild denselben Ausschnitt des Gesichts enthält. Das passiert automatisch, allerdings benötigt das Skript dafür die Koordinaten der Augen. Hier kommt jetzt der mühsame Teil: Für jedes Bild heißt es öffnen, Augenkoordinaten notieren und anschließend in das Skript eintragen. Diese Einträge kommen ganz unten in den Code, immer nach dem Muster:

process_image('0.png', (268, 229), (338, 228))

Die normierten Bilder landen dann im Unterordner modified.

Minimales Rohmaterial: Originalbilder, normierte Ausschnitte und CSV-Datei (Abb. 1)

Wer seine Gesichtserkennung mit Bildern von 1000 Mitarbeitern trainieren möchte, dürfte hier verzweifeln – etliche Tausend Bilder will niemand per Hand nach Augenkoordinaten absuchen. Das Beispielskript der OpenCV-Dokumentation, das am Ende des ersten Teils des Tutorials die Funktion von OpenCV demonstriert hat, markiert allerdings neben dem ganzen Gesicht auch die Augen. OpenCV liefert entsprechend auch einen Cascade Classifier für Augen mit. Man könnte daher die Augendetektion nutzen, um große Bildermengen automatisch nach Augenkoordinaten zu durchforsten. Damit ließe sich die Normierung der Bilder automatisieren.