[PYTHON] Material des Ansatzes zur Einbettung in ARM

Ich fand das Material [1] des Ansatzes zum Einbetten in ARM, also Notieren Sie sich als Referenz.

Das Dokument "Open CV for Embedded: Lessons Learned" Ist in einem 15-seitigen Dokument übersichtlich organisiert. Auf Seite 6 werden diese Schritte kurz beschrieben.

・ Prototyping (x86) ・ Portierung regression tests ・ Profilerstellung performance tests ・ Engpassoptimierung · Feintuning ・ Produktion

Auf der anderen Seite werde ich beschreiben, wie es in meinem Fall aussieht, als Referenz im Fall von Python.

・ Prototyping (x86) Verwenden Sie OpenCV + Python + Numpy + Matplotlib + Scikit-Learn usw. Bei der Bilderkennung verfolgen wir einen Ansatz, der nur durch Kenntnis des Algorithmus erreicht werden kann, z. B. durch Ändern der Auflösung, Ersetzen durch Resampling, anstatt die Fläche zu verkleinern oder zu verkleinern. Im Fall von Python ist es einfach, Versuch und Irrtum zu machen, daher bin ich froh, dass die Datenstruktur selbst mit dem zum ersten Mal verwendeten Algorithmus leicht zu verstehen ist. (Alle Objekte können gedruckt werden, alle Datenelemente können referenziert werden und numerische Daten können mit matplotlib unter Verwendung zahlreicher Grafikzeichnungsfunktionen ähnlich wie bei MATLAB überprüft werden.)

Überprüfen Sie in dieser Prototyping-Phase auch das Software-Design und teilen Sie es in eine Struktur auf, die einfach zu warten ist. Schreiben Sie einen Dokumentationskommentar, damit Dritte sehen können, was jede Funktion, Klasse oder Methode tut.

Ab dieser Phase erfolgt die Versionsverwaltung natürlich. Verwenden Sie SVN, um ein Repository auf einer lokalen Festplatte zu erstellen und die Version selbst zu verwalten. Der Zeichencode sollte Unicode sein, vorausgesetzt, er wird auf ein anderes Betriebssystem portiert.

・ Portierung Auch wenn Sie zu Linux (ARM) wechseln Verwenden Sie OpenCV + Python + Numpy + Matplotlib + Scikit-Learn usw. Diese Bibliotheken heißen apt-get install library Kann als transplantiert werden.  RegressionTest Der Test verwendet unitTest. Um den Übereinstimmungsgrad numerischer Daten zu vergleichen, ist es besser, numpy.testing.assert_almost_equal (tatsächlich, gewünscht [, ...]) in numpy zu verwenden. Da unitTest auf demselben Konzept wie CppUnit basiert, wird es in Zukunft einfach sein, die Portierung auf CppUnit in C ++ zu unterstützen.

・ Profilerstellung  PerformanceTest In der Standardbibliothek gibt es eine Profiling-Funktion. Diese Unit-Tests und -Leistungen können unabhängig vom Betriebssystem oder der CPU mit einer gemeinsamen Quelle durchgeführt werden.

・ Engpassoptimierung Dies hängt davon ab, ob die Ziel-CPU aus einem Kern oder mehreren Kernen besteht. Da die eingebaute CPU auch mehrere Kerne hat, scheint es möglich zu sein, mit Raspberry Pi 2 usw. zu beschleunigen, indem auf das Material in [2] verwiesen wird. Selbst in der Konfiguration von ARM Dual Core + FPGA wie Zynq ist es möglich, das Schreiben mit der Tatsache neu zu schreiben, dass mehrere Kerne vorhanden sind. Der Ansatz hängt davon ab, was die Rate bestimmt.

· Feintuning Im Fall von Python ist die Leistung des Moduls der in C ++ geschriebenen pyd-Datei effektiv. Ob die Erstellungsbedingungen beim Erstellen einer Pyd-Datei für die Ziel-CPU optimal sind Ich verstehe, dass die Leistung erheblich unterschiedlich ist. Auf meiner Ebene war es zum Zeitpunkt des Prototyping eine Verbesserung, indem die Menge der verarbeiteten Daten reduziert wurde, und es wurde nicht die Optimierung des in C ++ geschriebenen Codeteils erreicht. Im Fall von integriertem ARM scheint es der Punkt zu sein, ob Sie den NEON-Befehl gut verwenden können. Um den NEON-Befehl zu verwenden, ist es besser, den Quellcode des OpenCV-Moduls zu lesen.

#if CV_NEON #endif Der Code des Teils, der von umgeben ist c:\opencv\sources\modules\imgproc\src*.cpp Lassen Sie uns aus solchen Dingen herausfinden und es nachahmen.

Bei der Bestimmung der CPU-Rate in Python kann die Geschwindigkeit mithilfe von Cython verbessert werden. Wie effizient kann numpy bei der Bildverarbeitung / -erkennung eingesetzt werden? Die Ausführungsgeschwindigkeit wird erheblich unterschiedlich sein. Verwenden Sie beim Erstellen von Numpy eine Bibliothek, die die lineare Algebra beschleunigt, z. B. MKL Wenn Sie es neu erstellen, wird es schneller, auch wenn die Beschreibung in Python identisch ist.

・ Produktion


Anhang
Bei der OpenCV-Python-Bindung ist es schade, dass gpu noch nicht verwendet werden kann. Natürlich weiß ich, dass es eine GPU-Python-Bibliothek gibt, die nichts mit OpenCV zu tun hat. Ich würde gerne wissen, ob jemand weiß, wie nützlich Python sein kann, da es nicht die integrierte ARM-Karte (Jetson TK1) verwendet, die die Leistung der GPU nutzen kann.

ARM-Ressourcen unterscheiden sich erheblich von PCs. Stellen Sie daher sorgfältig fest, ob mit dieser ARM-Karte alles erreicht werden kann, was Sie implementieren müssen. Wenn alles, was Sie implementieren müssen, nicht klar genug ist, wählen Sie ein ARM-Board mit viel Platz. Reichen 2 Kerne aus (Raspberry Pi3, wenn 64-Bit-Kerne 4 Kerne sind) oder ist eine GPU (Jetson) erforderlich? TX1), benötigen Sie FPGA? Die Auswahlmöglichkeiten nehmen zu.

URL [1]:OpenCV for Embedded: Lessons Learned http://www.slideshare.net/YuryGorbachev1/opencv-for-embedded-lessons-learned

[2]: Versuchen Sie, die 4-Kern-CPU des Raspberry Pi 2 mit Parallel Python zu verbrauchen http://qiita.com/akidn8/items/ea3dcae810ff36fd5401

Recommended Posts

Material des Ansatzes zur Einbettung in ARM
Anmerkung von nfc.ContactlessFrontend () von nfcpy von Python
Hinweise zum Einbetten der Skriptsprache in Bash-Skripte
Hinweis 2 zum Einbetten der Skriptsprache in ein Bash-Skript
Erstellen Sie Python3 für Windows 10 unter ARM mit Visual Studio 2019 (x86) unter Windows 10 unter ARM