Gesichtserkennung und C++

2010-12-30 20:05


Im Laufe des Jahres ist immer mal wieder das Thema Gesichtserkennung mir über den Weg gelaufen. Das Thema war mir schon bekannt, bisher jedoch als zu kompliziert und vorallem auch ohne direkten Bezug aufgetreten. Aber im Juni auf dem Bada DevDay in Frankfurt kam dann der Hinweis, das Gesichtserkennung als API im Bada SDK enthalten sei. Das fand ich damals schon sehr aussergewöhnlich, das man sowas direkt in ein SDK für Smartphones mit einbaut. Und vor allem, das so etwas problemlos auf einem Smartphone performant genug läuft, um es auch in einem Videostream anzuwenden, und dann entsprechende Gesichtsframes zeichnen zu können, mit Erkennung. Später im Oktober auf den Qt DevDays konnte bekam ich durch Zufall mit, das Qt mobility wohl auch dieses Feature enthalten wird, wahrscheinlich in Version 1.2 oder 1.3. Leider hatte ich noch keine Zeit, konkret auf Bada damit rumzuspielen, und für Qt dauert es wohl bis nächstes Jahr. Im Dezember kündigte dann Facebook an, das sie nun die Fotos in ihrem Socialnetwork nach Gesichtern durchsuchen wollen. Apple hatte ja dies bei iPhoto schon länger implementiert, was ich an Weihnachten auf dem Mac meiner Mutter auch nochmals mir ansah.

Ich persönlich glaube das Gesichtserkennung sicher eine sehr interessante Technologie ist, welche in vielen Bereichen eingesetzt werden kann. Und sicher sich in Zukunft in viele Anwendungsbereiche erschließen wird, auch wenn Anwendungen wie z.b. in Überwachungskameras oder in Projekten wie INDECT sicher diskutabel sind. Aber gerade auch wegen dem möglichen Missbrauch, oder der "Gesichtssuchmaschine" von Morgen, sollte man die Technik dahinter kennen. Grundsätzlich teilt sich die Gesichtserkennung in 2 Phasen auf, eine erste, in der in einem Bild Gesichter gesucht werden, und eine zweite, in der die gefundenen Gesichter mit einer Datenbank an schon bekannten Gesichtern verglichen wird. In der Regel muss man also eine Gesichtserkennung vorher mit schon bekannten Gesichtern trainieren, um dann diese in anderen Bildern wiederfinden zu können. Einen wirklich guten technischen Überblick liefert die Seite face-rec.org.

Da es ja ein eigentlich recht interessantes Thema ist, interessierte mich schon länger, was man denn so selber da in C++ für benutzen könnte, abseits der mobilen SDKs. Gefunden habe ich einige Libraries, welche dies implementieren, den besten Ansatz liefert wohl OpenCV, da es auch eine sehr liberale Lizenz hat. Daneben gibt es noch diverse kommerzielle Lösungen, welche ich aber nicht betrachtet habe. OpenCV selber bietet schon ein C++ Cheat-Cheat an, im Wiki findet sich dann auch ein Beispiel für die Gesichtserkennung mit OpenCV. Eine wirklich ausführliche Beschreibung wie man dies nun genau umsetzt findet sich als Tutorial bei Shervin Emami, welches sich auf einen Artikel im Cogtonics Magazine bezieht. Die eigenliche Erkennung der Gesichter in einem Bild geht über die OpenCV Funktion cvHaarDetectObjects, welche ein entsprechende CvSeq mit allen enthaltenden Gesichtern zurück gibt.
Die nun erhaltenen Bildausschnitte enthalten die Gesichter, welche vor der Erkennung noch durch Bildfilter aufbereitet werden sollten, um die Erkennungsraten zu erhöhen. Die eigentliche Gesichtserkennung von OpenCV beruht dann auf Eigenfaces, welches auch als PCA bekannt ist. Hintergründe zu Eigenfaces finden sich hier. Wie schon erwähnt, muss für die Erkennung der Algoritmus jeweils mit entsprechenden Daten angelernt werden. Je mehr Bilder es von einer Person für das Anlernen gibt, desto genauer ist die Erkennung. Dies geschieht bei OpenCV mittels cvCalcEigenObjects und cvEigenDecomposite. Mit cvEigenDecomposite lässt sich dann auch ein unbekanntes Gesicht mit der Matrix der bekannten Gesichter vergleichen.

Eine Liste an alternativen Projekten auf sourceforge findet sich hier.


Zurück