1

Ich arbeite an einer opencv-Anwendung, die CPU stark verbraucht.wie Opencv Verarbeitung auf vielen Hosts verteilt

Ich möchte die Frame-Verarbeitung verteilt, so dass es unter vielen Hosts geteilt wird.

Die Idee ist die gleiche wie in http://cloudcv.org/ implementiert. Das Problem besteht jedoch darin, dass Sie Ihre Anfrage nur an den Server senden können, um die verteilte Bildverarbeitung zu testen.

Ich suche lange im Internet, und ich frage mich, ob ich opencv + Docker Swarm oder opencv + Apache Spark implementieren kann oder ob es eine andere Methode gibt, um es zu verteilen.

Mein Code verarbeitet Frames in opencv Menschen in ihnen zu erkennen, will ich es auf vielen Hosts Geschwindigkeit zu maximieren ausgeführt bekommen:

while(true) 
{ 
         webcam.read(image); 
         //human detection-------------------------------------- 
         cv::Mat resized_image; 
         cv::resize(image, resized_image, Size(image.cols/2, image.rows/2), 0, 0, INTER_LINEAR); 
         vector<Rect> found, found_filtered; 
         // this line uses hog descriptor to detect 
         // people body pattern in the frmaes 
         // found is a vector of Rect that contains the 
         // found peoples. 
         // Rect is a struct (x, y, height, width) 
         hog.detectMultiScale(image, found, 0, Size(8, 8), Size(32, 32), 1.05, 2); 
         size_t u, h; 
         // this loop just make sure that the found 
         // rectangles are not duplicated. 
         for (u = 0; u<found.size(); u++) 
         { 
          Rect r = found[u]; 
          for (h = 0; h<found.size(); h++) 
           if (h != u && (r & found[h]) == r) 
            break; 
          if (h == found.size()) 
           found_filtered.push_back(r); 
         } 
         // this loop is for drawing the rectangles on the frame 
         for (u = 0; u<found_filtered.size(); u++) 
         { 
          Rect r = found_filtered[u]; 
          r.x += cvRound(r.width*0.1); 
          r.width = cvRound(r.width*0.8); 
          r.y += cvRound(r.height*0.07); 
          r.height = cvRound(r.height*0.8); 
          rectangle(showed_image, r.tl()*2, r.br()*2, Scalar(0, 255, 0), 3); 
          cout << '\a'; 
         } 
    } 
+1

Wenn Ihr Algorithmus parallelisierbar ist, kann Apache Spark Ihnen wahrscheinlich eine Lösung anbieten. Die Frage, wie sie jetzt steht, ist für dieses Forum zu weit gefasst. Um Ihnen zu helfen, benötigen wir mehr Informationen über den Algorithmus als derzeit zur Verfügung gestellt. – maasg

+0

@ maasg: danke. Ich möchte nur eine Anleitung dazu haben. Ich habe viel gesucht, aber ich habe die Methode nicht gefunden. – ProEns08

+1

Wenn Sie die Schlüsselelemente Ihres process + code zu der Frage hinzufügen, könnte ich versuchen, es zu einem Funkenauftrag abzubilden, zumindest in einigen groben Zeilen. – maasg

Antwort

3

Spark ist eine gute Möglichkeit, die Verarbeitung auf verteilten Systemen zu tun. Aber es gibt keine starke Community, die an OpenCV arbeitet. Storm ist ein weiteres freies und Open-Source-verteiltes Echtzeit-Rechensystem von Apache. Storm ermöglicht die zuverlässige Verarbeitung unbegrenzter Datenströme und ermöglicht die Echtzeitverarbeitung von Daten, die Hadoop für die Stapelverarbeitung verwendet hat.

StormCV ist eine Erweiterung von Apache Storm, die speziell entwickelt wurde, um die Entwicklung verteilter Computer-Vision-Pipelines zu unterstützen. StormCV ermöglicht die Verwendung von Storm für die Videoverarbeitung durch Hinzufügen von Computer Vision (CV) spezifischen Operationen und Datenmodellen. Die Plattform verwendet OpenCV für die meisten CV-Vorgänge und es ist relativ einfach, diese Bibliothek für andere Funktionen zu verwenden.

Es gibt einige Beispiele für die Verwendung von Storm mit OpenCV. Es gibt ein ähnliches Beispiel für das, was Sie auf ihrer offiziellen Github-Seite versuchen. Vielleicht möchten Sie sich dieses Gesichtserkennungsbeispiel ansehen und es versuchen, eine menschliche Erkennung durchzuführen - https://github.com/sensorstorm/StormCV/blob/master/stormcv-examples/src/nl/tno/stormcv/example/E2_FacedetectionTopology.java.

+0

Danke, +1. Aber das Problem ist, dass StormCV die Java-API verwendet. Mein Code ist rein C++, weil es im Hinblick auf die Verarbeitung effizienter ist. – ProEns08

+1

Ich habe in meinen Recherchen auch daran gearbeitet, OpenCV durch Spark zu betreiben. Hoffentlich, wenn ich großartige Leistung kann ich Ihnen den Link zu meinem GitHub-Code senden. –

+0

Ja, es wird mir helfen, danke. – ProEns08