2012-05-10 4 views
6

Ich entwickelte eine Anwendung für Gesichtserkennung mit OpenCVs HAAR Cascade Gesichtserkennung. Der Algorithmus funktioniert gut, aber hin und wieder findet er Muster an der Wand oder andere Dinge, die keine Gesichter sind.
Ich möchte zusätzliche Prüfungen für Objekte, die als Gesichter vermutet werden, ausführen, aber ich möchte es nur für Objekte tun, die ich nicht vertraue, dass sie Gesichter sind. Gibt es eine Möglichkeit, ein "Vertrauensniveau" für ein Gesicht zu erreichen, das von der HAAR-Kaskaden-Gesichtserkennung erkannt wird?Gibt es eine Möglichkeit, das Konfidenzniveau zu messen, wenn Sie die Gesichtserkennung mit OpenCV verwenden?

Antwort

3

OpenCV findet tatsächlich mehr als ein Ergebnis für ein bestimmtes Objekt, wobei jeder erkannte Bereich sich weitgehend überlappt; Diese werden dann zusammen gruppiert und bilden eine Anzahl von Nachbarn. Diese Zählung ist das sogenannte Vertrauen.

Wenn Sie eine Objekterkennung durchführen, ist einer der Parameter die minimalen Nachbarn, bevor ein Treffer zurückgegeben wird. Durch Erhöhen wird die Anzahl der falsch erkannten Gesichter verringert und die Anzahl der erkannten Gesichter verringert.

1

Warum nicht mehrere Haarkaskaden (anders trainiert) gegen das gleiche Bild laufen lassen und sehen, ob sie ähnliche Ergebnisse erzeugen? Lassen Sie sie sozusagen abstimmen. Wenn also nur eine Kaskade ein gegebenes Gesicht findet und die anderen nicht, würde das dem gegebenen Gesicht weniger Vertrauen geben.

Ich konnte 3 Kaskaden gleichzeitig auf einem iPhone Video Feed in Echtzeit laufen lassen, so dass die Leistung in vielen normalen Szenarien kein Problem sein sollte. Mehr hier: http://rwoodley.org/?p=417

5

OpenCV bietet das Vertrauen über das Argument „Gewichte“ in Funktion „detectMultiScale“ aus Klasse CascadeClassifier, müssen Sie die Flagge „outputRejectLevels“ true

+1

ist dieser Parameter für openCV C++ API verfügbar? Ich sehe es nur in Python API?!? Gibt es zum Beispiel eine undokumentierte Möglichkeit, den Flags-Parameter für diesen Zweck zu verwenden? – Micka

+0

[Anscheinend] (http://code.opencv.org/issues/3064) gibt es auch eine undokumentierte Funktion in der C++ API. 'Leere CascadeClassifier :: detectMultiScale (const Mat & Bild, Vektor & Objekte, Vektor & rejectLevels, Vektor & levelWeights, Doppelscalefactor, int minNeighbors, int flags, Größe minObjectSize, Größe maxObjectSize, Bool outputRejectLevels)' – sietschie

0

keine direkte Antwort auf Ihre Frage stellen , aber dies kann helfen, die falsche Erkennung zu reduzieren.

Sie können weniger Fehlalarme erzielen, indem Sie die Werte für MinNeibhbours, CV_HAAR_FIND_BIGGEST_OBJECT und Größe optimieren.

int MinNeighbours = 7;

face_cascade.detectMultiScale (frame_gray, Gesichter, 1.1, MinNeighbours, CV_HAAR_FIND_BIGGEST_OBJECT, Size (60, 60));

Verwandte Themen