Opencv - Haar-Kaskade - Face Tracking ist sehr langsam

9

Ich habe ein Projekt entwickelt, um Gesicht durch Kamera mit der OpenCV-Bibliothek zu verfolgen. Ich habe Haarkaskade mit haarcascade_frontalface_alt.xml verwendet, um das Gesicht zu erkennen.

Mein Problem ist, wenn die Bilderfassung von der Webkamera keine Gesichter enthält, ist der Prozess zum Erkennen von Gesichtern sehr langsam, so dass Bilder von der Kamera, die dem Benutzer kontinuierlich angezeigt werden, verzögert sind.

Mein Quellcode:

%Vor%     
user3079975 11.11.2014, 16:36
quelle

4 Antworten

2

Der Haar-Klassifizierer ist von Natur aus relativ langsam. Darüber hinaus gibt es nicht viel Optimierung für den Algorithmus selbst, weil detectMultiScale in OpenCV parallelisiert wird.

Die einzige Anmerkung zu deinem Code: Bekommst du wirklich einige Gesichter, die jemals mit minSize erkannt wurden, was gleichbedeutend mit Size(200, 200) ist? Obwohl, je größer die minSize - desto besser ist die Leistung.

Versuchen Sie, das Bild zu skalieren, bevor Sie etwas erkennen:

%Vor%

(vergiss nicht, minSize auf einen vernünftigeren Wert zu ändern und erkannte Flächen in einen realen Maßstab zu konvertieren)

Die Bildgröße, die für 2, 3, 5 Mal reduziert wird, ist eine großartige Leistungserleichterung für jeden Bildverarbeitungsalgorithmus, besonders wenn es um einige kostspielige Dinge wie Erkennung geht.

Wie bereits erwähnt, sollten Sie versuchen, einige andere Engpässe mithilfe eines Profilers zu beheben, wenn die Größenänderung nicht ausreicht.

Und Sie können auch zum LBP-Klassifikator wechseln, der vergleichsweise schneller, aber weniger genau ist.

Ich hoffe, es wird helfen.

    
kazarey 12.11.2014 20:19
quelle
1

Vielleicht ist es für Sie nützlich:

Es gibt eine Simd-Bibliothek mit einem Implementierung von HAAR- und LBP-Kaskaden-Klassifikatoren. Es kann Standard HAAR und LBP casscades von OpenCV verwenden. Diese Implementierung hat SIMD-Optimierungen unter Verwendung von SSE4.1, AVX2 und NEON (ARM), so dass es 2-3-mal schneller arbeitet als die ursprüngliche OpenCV-Implementierung.

    
ErmIg 05.05.2016 11:51
quelle
0

Sie können LBP Cascade verwenden, um Gesichter zu erkennen. Es ist viel leichter. Sie können lbpcascade_frontalface.xml im OpenCV Quellverzeichnis finden.

    
fivetech 09.06.2016 22:14
quelle
0

Ich benutze regelmäßig Haar-Kaskadenklassifizierer und erhalte auf einem Intel PC / Mac (Windows / Ubuntu / OS X) mit 4GB Ram und 2GHz CPU 15 Bilder / Sekunde für die Gesichtserkennung auf 640x480 Bildern. Was ist Ihre Konfiguration?

Hier sind ein paar Dinge, die Sie ausprobieren können.

  1. Sie müssen das Fenster ( namedWindow(window_name, CV_WINDOW_AUTOSIZE); ) nicht innerhalb jedes Rahmens erstellen. Erstellen Sie es zuerst und aktualisieren Sie das Bild.

  2. Sie können versuchen, wie schnell es ohne Histogrammausgleich läuft. Nicht immer mit einer Webcam erforderlich.

  3. Wie von Micka oben vorgeschlagen, sollten Sie überprüfen, ob Ihr Programm im Debug-Modus oder im Release-Modus läuft.

  4. Verwenden Sie einen Profiler, um festzustellen, ob der Engpass vorhanden ist.

  5. Falls Sie es noch nicht gemacht haben, haben Sie die Bildrate gemessen, die Sie bekommen, wenn Sie die Gesichtserkennung auskommentieren und Rechtecke zeichnen?

Totoro 12.11.2014 05:34
quelle