[PYTHON] Matériel de l'approche pour l'intégration dans ARM

J'ai trouvé le matériel [1] de l'approche d'intégration dans ARM, donc Faites une note pour référence.

Le document «Open CV for Embedded: Lessons Learned» Est organisé de manière concise dans un document de 15 pages. À la page 6, ces étapes sont brièvement décrites.

・ Prototypage (x86) ・ Portage regression tests ・ Profilage performance tests ・ Optimisation des goulots d'étranglement · Réglage fin · Production

Par contre, je décrirai à quoi cela ressemble dans mon cas pour référence dans le cas de Python.

・ Prototypage (x86) Utilisez OpenCV + Python + Numpy + matplotlib + scikit-learn etc. Dans le cas de la reconnaissance d'image, nous adoptons une approche qui ne peut être réalisée qu'en connaissant l'algorithme, comme changer la résolution, la remplacer par un rééchantillonnage au lieu de réduire la zone ou réduire la zone. Dans le cas de Python, il est facile de faire des essais et des erreurs, donc je suis heureux que la structure des données soit facile à comprendre même avec l'algorithme utilisé pour la première fois. (Tous les objets peuvent être imprimés, tous les membres de données peuvent être référencés et les données numériques peuvent être vérifiées avec matplotlib en utilisant d'abondantes fonctions de dessin de graphique similaires à MATLAB.)

De plus, à cette étape du prototypage, examinez la conception du logiciel et séparez-la en une structure facile à maintenir. Rédigez un commentaire sur la documentation afin que les tiers puissent voir ce que fait chaque fonction, classe ou méthode.

Bien entendu, la gestion des versions se fait à partir de cette étape. Utilisez SVN pour mettre un référentiel sur un disque dur local et gérer la version par vous-même. Le code de caractère doit être unicode, en supposant qu'il sera porté sur un autre système d'exploitation.

・ Portage Même si vous passez à Linux (ARM) Utilisez OpenCV + Python + Numpy + matplotlib + scikit-learn etc. Ces bibliothèques sont le nom de la bibliothèque d'installation apt-get Peut être transplanté comme.  RegressionTest Le test utilise unitTest. Pour comparer le degré de correspondance des données numériques, il est préférable d'utiliser numpy.testing.assert_almost_equal (réel, souhaité [, ...]) fourni dans numpy. Étant donné que unitTest est basé sur le même concept que CppUnit, il sera facile de prendre en charge le portage vers CppUnit en C ++ à l'avenir.

・ Profilage  PerformanceTest Il existe une fonction de profilage dans la bibliothèque standard. Ces tests unitaires et performances peuvent être réalisés avec une source commune quel que soit le type d'OS ou de CPU.

・ Optimisation des goulots d'étranglement Cela dépend du fait que le processeur cible est un ou plusieurs cœurs. Puisque le processeur intégré a également plusieurs cœurs, il semble possible d'accélérer avec Raspberry Pi 2 etc. en se référant au matériel dans [2]. Même dans la configuration ARM dual core + FPGA comme Zynq, il sera possible de réécrire en utilisant le fait qu'il y a plusieurs cœurs. L'approche dépend de ce qui détermine le taux.

· Réglage fin Dans le cas de Python, les performances du module du fichier pyd écrit en C ++ sont efficaces. Si les conditions de construction lors de la création d'un fichier pyd sont optimales pour le processeur cible Je comprends que les performances sont très différentes. A mon niveau, au moment du prototypage, c'était une amélioration en réduisant la quantité de données traitées, et cela n'atteignait pas l'optimisation de la partie code écrite en C ++. Dans le cas de l'ARM intégré, il semble que la question soit de savoir si vous pouvez bien utiliser l'instruction NEON. Pour utiliser l'instruction NEON, il semble préférable de lire le code source du module OpenCV.

#if CV_NEON #endif Le code de la pièce entourée de c:\opencv\sources\modules\imgproc\src*.cpp Découvrons de telles choses et imitons-les.

Dans le cas de la détermination de la vitesse du processeur en Python, la vitesse peut être améliorée en utilisant Cython. Dans le cas du traitement / reconnaissance d'image, l'efficacité avec laquelle numpy peut être utilisée La vitesse d'exécution sera sensiblement différente. Lors de la construction de numpy, utilisez une bibliothèque qui accélère l'algèbre linéaire telle que MKL Si vous le reconstruisez, ce sera plus rapide même si la description en python est la même.

· Production


Annexe
Dans le cas de la liaison OpenCV Python, il est dommage que gpu ne puisse pas encore être utilisé. Bien sûr, je sais qu'il existe une bibliothèque GPU python qui n'a rien à voir avec OpenCV, Je voudrais savoir si quelqu'un sait à quel point Python peut être utile car il n'utilise pas la carte intégrée ARM (Jetson TK1) qui peut tirer parti des performances du GPU.

Les ressources ARM sont très différentes de celles des PC, veillez donc à déterminer si tout ce que vous devez implémenter peut être réalisé avec cette carte ARM. Si tout ce que vous devez mettre en œuvre n'est pas assez clair, assurez-vous de choisir une carte ARM avec beaucoup d'espace. Est-ce que 2 cœurs suffisent (Raspberry Pi3 si les cœurs 64 bits sont 4 cœurs) ou faut-il un GPU (Jetson)? TX1), avez-vous besoin de FPGA? Les choix se multiplient.

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

[2]: Essayez d'utiliser le processeur à 4 cœurs du Raspberry Pi 2 avec Parallel Python http://qiita.com/akidn8/items/ea3dcae810ff36fd5401

Recommended Posts

Matériel de l'approche pour l'intégration dans ARM
Note de nfc.ContactlessFrontend () de nfcpy de python
Remarques sur l'intégration du langage de script dans les scripts bash
Remarque 2 pour intégrer le langage de script dans un script bash
Créer Python3 pour Windows 10 sur ARM avec Visual Studio 2019 (x86) sur Windows 10 sur ARM