Nutzen Sie die Mehrfachverarbeitung mit OpenCV auf Himbeer-Pi 2

7

Ich habe OpenCV auf Raspberry für verschiedene Projekte verwendet (Gesichtserkennung, Synchronisierungskamera, Stitcher usw.). Ich habe einen Himbeer-Pi 2 gekauft, um die Vorteile der neuen Hardwarekonfiguration zu nutzen.

Ich konnte die 4 Kerne jedoch nicht für die Verarbeitung verwenden, zum Beispiel zum Zusammenfügen von Bildern. Wenn ich 3 Bilder zusammennehme, ergibt der Lastmesser in X 25% der Last (1 Kern). Wenn ich zwei Stitching-Skripte mit 2 Paaren von 2 Bildern starte, ist die CPU immer noch zu 25% belastet.

Ist es möglich, OpenCV zu verwenden und die Anweisungen auf jedem Kern auszuführen, oder müssen die OpenCV-Kernfunktionen geändert werden? Könnte es möglich sein, zum Beispiel mit Python die Bibliotheken zu verwenden, die Multiprocessing auf mehreren Himbeeren, aber auf den verschiedenen Kernen von Raspberry Pi 2 ermöglichen?

AtoM_84
quelle
Wenn Sie sich auf völlig separate Prozesse beziehen, wie es sich anhört, sollten Sie möglicherweise in der Lage sein, genug davon auszuführen, um alle vier Kerne zu maximieren, es sei denn, es gibt einen signifikanten E / A-Engpass, den alle gemeinsam haben. Ich weiß nicht genug über openCV, um zu sagen, was das sein könnte - nutzt es die GPU dafür? Sie können mit einem anderen Tool (z. B. htop) überprüfen , ob das System wirklich nicht das Beste aus den Dingen herausholt.
Goldlöckchen

Antworten:

3

Sie sollten die Multiprozessor- Bibliothek überprüfen . Wenn Sie Teile Ihres Programms haben, die Sie parallel ausführen können, z. B. das Verarbeiten mehrerer Bilder und das Erkennen von Gesichtern, können Sie einfach einen Prozess definieren Pool. Standardmäßig startet ein Pool so viele Prozesse gleichzeitig, wie Sie über Prozessoren verfügen. Sie können auch die Poolgröße definieren und auf 4 festlegen.

z.B:

from multiprocessing import Pool
from glob import glob

def detect_face(file_name):
    ...

if __name__ == '__main__':
    with Pool() as p:
       p.map(detect_face, glob('*.jpg'))

Sie sollten auch Kasse sherlock , eine Sammlung von Beispiel dafür, wie Multiprocessing und opencv zu kombinieren.

Einschränkungen:

Die Algorithmen in OpenCV selbst lassen sich nicht einfach in mehreren Prozessen ausführen. Da OpenCV in C ++ geschrieben ist, hängt ihre Ausführung stark von ihrer Implementierung ab.

Codingjoe
quelle
3

Wenn Sie die OpenCV-Bibliothek mit der OpenMPin der cmake-Datei aktiven Option kompilieren (diese ist standardmäßig deaktiviert), verwenden viele Algorithmen automatisch mehrere Kerne, ohne dass Sie Änderungen an Ihrem Quellcode vornehmen müssen. In meinem Fall konnte ich eine bis zu 4,5-fache Leistungssteigerung erzielen. Ja, der Raspberry Pi 2 hat nur 4 Kerne, aber wenn Sie stark mit Zahlen arbeiten, kann eine gute Aufteilung der Aufgaben die Wartezeiten erheblich verkürzen. Erwarten Sie für kürzere Algorithmen nicht viel mehr als eine dreifache Beschleunigung.

Seien Sie vorsichtig, beim Kompilieren der OpenMP-Bibliotheken gibt es einen Fehler im libpng-Paket. Wenn das makemit einem Fehler angehalten wird, weil libpnges nicht gefunden werden kann zlib, kann eine schnelle und schmutzige Lösung darin bestehen, dass Sie einfach die Quelle von zlib in den libpng-Quellordner kopieren (oder deaktivieren libpng, wenn Sie sie nicht benötigen).

vsz
quelle