iX 11/2017
S. 112
Praxis
Maschinelle Bildverarbeitung
Aufmacherbild

Gesichtserkennung mit OpenCV und Python, Teil 1: OpenCV-Grundlagen

Wer bin ich?

Das Erkennen von Gesichtern in Fotos und Videoaufnahmen ist ein zukunftsträchtiges Feld – und mit der quelloffenen Bibliothek OpenCV erstaunlich einfach in eigenen Projekten nutzbar.

Gesichtserkennung in der Praxis: Ein Mitarbeiter setzt sich an einen Arbeitsplatz, wird per Webcam identifiziert und bekommt daraufhin Zugang zu allen benötigten Ressourcen – ohne Eingabe eines Passworts, Auflegen des Fingers oder Einstecken einer Smartcard. Windows 10 bringt mit Hello eine solche Funktion bereits mit. Im Zuge dieses dreiteiligen Tutorials entsteht eine eigene, erweiterbare Lösung zur Identifikation von Personen per Gesichtserkennung auf Basis von OpenCV und Python.

Der erste Teil der Serie gibt eine Einführung in OpenCV und die Grundlagen der Gesichtserkennung. Er endet mit der Installation von OpenCV unter Linux inklusive Aufruf eines Beispielskripts zur Gesichtserkennung. Ein erster Codeschnipsel zeigt, wie einfach es ist, über die Python-API auf eine Kamera zuzugreifen.

Im zweiten Teil geht es weiter mit der OpenCV-API und der Frage, wie und mit welchen Methoden man via OpenCV Gesichtserkennung betreiben kann. Im dritten Teil folgt das bereits angesprochene Projekt, eine Python-Anwendung, die Mitarbeiter per Webcam identifiziert und daraufhin eine Aktion auslöst.

Bilder verarbeiten mit OpenCV

OpenCV steht für Open Source Computer Vision und ist eine Bibliothek mit Programmierfunktionen rund um die Analyse und Verarbeitung von Bildmaterial mit einem Fokus auf Echtzeitverarbeitung. Das Projekt wurde 1999 von Intel in Russland gestartet, ab 2008 von Willow Garage verwaltet und später von dem Computer-Vision-Experten Itseez übernommen. 2016 schloss sich dann der Kreis, als Intel Itseez übernahm.

Das modular aufgebaute OpenCV verfügt über mehr als 2500 Algorithmen für unterschiedlichste Aufgaben, beispielsweise zur Identifizierung von Objekten und Aktionen in Videos, zum Tracking von Objekten, zur 3D-Visualisierung von Stereokamera-Streams, für Stitching, zum Vergleich von Bildern oder eben für die Gesichtserkennung. So gibt es beispielsweise im Modul Computational Photography einen Bereich für HDR-Fotografie mit unterschiedlichen Klassen zum Ausrichten, Kalibrieren und Verschmelzen von Bildern sowie den üblichen Verdächtigen für das Tone Mapping wie Mantiuk oder Durand.

Ein wichtiger Bestandteil von OpenCV ist das Modul Machine Learning. Es enthält diverse Algorithmen, die für viele der genannten Aufgaben nötig sind – auch für die Gesichtserkennung: Schließlich muss die Software lernen, was ein Gesicht ist und zu wem es gehört.

Vielfältige Funktionen

Auch das Modul High-level GUI (highgui) soll an dieser Stelle erwähnt werden. In fertigen Anwendungen kann OpenCV in komplexen grafischen Bedienoberflächen oder auch gänzlich ohne GUI laufen. Das highgui-Modul erzeugt mit minimalem Aufwand Fenster zum Anzeigen von Bildern und Videos und verarbeitet einfache Maus- und Tastatur-Events. Damit ist zum Beispiel freihändiges Zeichnen auf dem angezeigten Bild per Maus möglich. So lassen sich Ideen sehr einfach testen, wie das IPython-Beispiel am Ende zeigen wird.

Augmented Reality in der Praxis: OpenCV analysiert das Video eines Billardtischs und projiziert die berechneten Laufwege der Kugeln auf den Filz (Abb. 1).

Ein schönes Beispiel für die Vielfältigkeit von OpenCV ist das Hackaday.io-Projekt Cassapa (siehe „Alle Links“). Eine Kamera nimmt einen Billardtisch von oben auf, OpenCV analysiert Queue, Kugeln und Winkel und ein Projektor projiziert die berechneten Laufwege der Kugeln auf den Filz – eine Augmented-Reality-Version der üblichen Zielhilfen in Billard-Videospielen.

OpenCV ist in der aktuellen Version in C++ (früher C) geschrieben und gilt mit seinem Fokus auf Echtzeitverarbeitung als besonders schnell. Die Bibliothek lässt sich in nahezu jeder Umgebung verwenden: Sie ist unter anderem für Windows, Linux, macOS, diverse BSDs, Android, iOS und BlackBerry 10 verfügbar. OpenCV bietet APIs für C, C++, Python, Java und MATLAB. Über Wrapper lassen sich OpenCV-Programme auch in C#, Perl, Haskell oder Ruby schreiben. Da die Bibliothek unter BSD-Lizenz steht, ist es problemlos möglich, OpenCV auch in proprietären Projekten zu verwenden.

Gesichter detektieren und erkennen

Über Cascade Classifier lassen sich beliebige Objekte erkennen – ob Augen oder Bananen ist nur eine Frage der Definition (Abb. 2).

Gesichtserkennung ist leider ein zweideutiger Begriff, denn damit können zwei unterschiedliche Aufgaben gemeint sein: Die Gesichtsdetektion (Face Detection) erkennt, ob in einem Bild ein Gesicht vorhanden ist. Ein Beispiel sind Smartphone-Kameras, die Gesichter mit einem Rechteck markieren und automatisch auf diesen Bereich scharf stellen. Die Gesichtserkennung (Face Recognition) kümmert sich dann darum, ob sie das Gesicht kennt und zu welcher Person es gehört. Im Deutschen kann „Erkennen“ beide Aufgaben bezeichnen. Der Klarheit halber muss man also zwischen Detektion und Erkennung analog zu den englischen Begrifflichkeiten Detection und Recognition unterscheiden.

Der grundsätzliche Workflow in einer Anwendung zur Gesichtserkennung ist ziemlich simpel: Zunächst werden Gesichter detektiert, indem geprüft wird, ob eine Reihe von Eigenschaften im Bild zu finden ist. Anschließend wird ein so erkanntes Gesicht extrahiert, analysiert und in eine Repräsentationsform gebracht, die schließlich einen Abgleich mit einer Gesichtsdatenbank ermöglicht.

Ist da ein Gesicht im Bild?

Gesichter im Bild zu entdecken, ist der einfachere Part. OpenCV liefert in seinen Beispielskripten eine simple Python-Demo mit, die Gesichter und Augen im Webcam-Stream markiert. Die Frage, was ein Gesicht ist, beantworten hier Haar Cascade Classifieres beziehungsweise die Klasse CascadeClassifier. Über die sogenannten Haar-like Features ließen sich ganze Abhandlungen schreiben, für den praktischen OpenCV-Einstieg genügt ein kurzer Abriss: Bei dem Verfahren werden die Pixel benachbarter rechteckiger Bereiche miteinander verglichen. Diese Rechtecke „wandern“ über das gesamte Bild.