image image


Gesichtserkennung mit OpenCV und Processing.py

Vor ein paar Tagen hatte ich ja erste Experimente mit OpenCV in Form dieser Bibliothek für Processing durchgeführt. Eine der meist zitierten Anwendungen von OpenCV ist ja die Gesichtserkennung und da wollte ich mal testen, wie gut dies mit Processing.py, dem Python-Mode von Processing funktioniert:

image

OpenCV besitzt mehrere Bibliotheken zur Gesichtserkennung, eine davon ist der Haar Cascade Classifier, der auf ein Paper von Viola und Jones aus dem Jahr 2000 zurückgeht. OpenCV bringt bereits einige vortrainierte Haar Cascade Classifier mit – unter anderem um Gesichter von Menschen oder Katzen zu erkennen. Der Algorothmus ist ziemlich schnell, allerdings – wie wir sehen werden – nicht ganz fehlerfrei.

In der setup()-Funktion habe ich diesen Classifier initialisiert,

add_library('opencv_processing')

faces = []

def setup():
    global opencv, faces
    size(640, 480)
    opencv = OpenCV(this, "puppen.jpg")
    
    opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE)
    faces = opencv.detect()
	# print(len(faces))

und zwar den, der Gesichter von vorne erkennen soll. Als Testbild habe ich dieses Photo mit Schaufensterpuppen genommen, denn Schaufensterpuppen sind vermutlich die einzige Möglichkeit, Gesichtserkennungsalgorithmen zu testen, ohne Probleme mit dem Datenschutz zu bekommen. (Das Photo hat Gabi geschossen, ein paar andere Photos mit Schaufensterpuppen habe ich ebenfalls für Tests genutzt – siehe unten)

Der Rest ist straightforward, zuerst wird die OpenCV-Bibliothek geladen und das Array mit den Gesichtern (faces[]) initialisiert. In der setup()-Funktion werden dann alle Gesichter, die der Haar Cascade Classifier erkennt, abgespeichert.

Wenn man kontrollieren will, ob überhaupt Gesichter erkannt wurden, kann man sich die Anzahl der erkannten Gesichter mit der auskommentierten print()-Anweisung anzeigen lassen.

Die draw()-Funktion zeigt das Photo und platziert um jedes erkannte Gesicht ein lindgrünes Viereck:

def draw():
    global opencv, faces
    image(opencv.getInput(), 0, 0)
    noFill()
    stroke(0, 255, 0)
    strokeWeight(2)
    for i in range(len(faces)):
        rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height)

Das ist schon alles. Wie man dem Screenshot entnehmen kann, werden zwar die beiden Gesichter der Schaufensterpuppen erkannt, aber mit dem Batik-Muster der Puppe rechts hat der Classifier so seine Probleme. Und das ist kein Einzelfall: Wie Olver Moser in seiner schönen »Einführung in Computer Vision mit OpenCV und Python« berichtet, erkennt der Classifier auch regelmäßig die Rückenlehne seines Stuhls als Gesicht. Hier muß man also entweder einen anderen, rechenintensiveren Classifier, wie zum Beispiel den »HOG Detector« verwenden, oder versuchen, den Haar Cascade Classifier weiter trainiern. Beides ist sehr rechenaufwendig, daher habe ich mich mit dem Ergebnis erst einmal abgefunden.

Hier sind noch ein paar Bilder aus Neuköllner Schaufenstern, mit denen sich der Classifier mal mehr und mal weniger gut geschlagen hat:

image

Dieses halbverschleierte Gescicht wurde gut erkannt.

image

Auch beim Gesicht von dieser Puppe zeigte der Classifier keine Probleme.

image

Hier will ich nicht meckern, die Gesichter der zwei links stehenden Schaufensterpuppen sind durch Spiegelungen auch kaum zu erkennen.

image

Nicht nur die Nofretete hat ein Gesicht, sondern auch die Rückenlehen des Sessels im Hintergrund (mit den drei Knöpfen ist sie aber auch ziemlich gesichtsähnlich).

image

Hier hat der Algorithmus kläglch versagt. Gerade mal das Gesicht eines der Gartenzwerge und die Putte wurden erkannt.

image

Nun ja, Elvis muß natürlich jeder Classifier erkennen, sonst gibt es Ärger mit den Fans.

Der Quellcode

Hier noch einmal für Neugierige der komplette Quellcode zum Nachprogrammieren:

add_library('opencv_processing')

faces = []

def setup():
    global opencv, faces
    size(640, 480)
    opencv = OpenCV(this, "elvis.jpg")
    
    opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE)
    faces = opencv.detect()
    # print(len(faces))
    
def draw():
    global opencv, faces
    image(opencv.getInput(), 0, 0)
    noFill()
    stroke(0, 255, 0)
    strokeWeight(2)
    for i in range(len(faces)):
        rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height)

(Alle Photos (cc): Gabriele Kantel)


1 (Email-) Kommentar


Wirklich interessant. Nach deinem ersten Artikel hatte ich auch mit OpenCV und Python experimentiert (auch mit dem gleichen Algorithmus). Da ich aber nur Fotos verwendet habe, bei der die Personen von Vorne ohne Licht, Hut und Haare zu sehen waren, hatte ich da keine Probleme. Ich spiele ja immer noch mit der Idee das mit Sortier-Scripten zu verknüpfen, was das um einiges spannender machen könnte.

– Robert T. (Kommentieren) (#)


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung


Werbung


image  image  image
image  image  image


image