Python, pour le prototypage de vos solutions de vision
Accélérer les processus de prototypage est bénéfique pour toute personne impliquée dans le projet. La version CVB2019 propose trois nouvelles API orientées objet compatibles avec C++, .NET et Python. Elles permettent de développer des solutions de vision d’une autre manière avec Common Vision Blox. Ces nouvelles interfaces de programmation sont compatibles avec l’API déjà disponible dans CVB. De cette manière, les utilisateurs peuvent s’appuyer sur les applications existantes sans avoir à réécrire leur code source.
Quels sont les avantages de Python ?
Avec CVBpy, la puissance et la rapidité de Common Vision Blox est à la portée de main d’un nouveau groupe d’utilisateurs, habitués à la programmation simple et aux résultats rapides de Python. Convivial et gratuit, Python est un langage de programmation universel, open source et interprété, avec une structure de données de haut niveau. C'est l'un des langages de programmation les plus utilisés et, selon une enquête, également l’un des plus appéciés des développeurs.
Python est portable, disponible pour les plateformes embarquées, Linux et Windows. Il s’adapte donc à tout type de compileur et matériel. Sa syntaxe claire et concise le rend facile à apprendre. De cette façon, il permet d'économiser du temps et des ressources, pour une meilleure productivité : c’est ce qui le rend particulièrement intéressant pour le prototypage. Python dispose de frameworks déjà utilisés dans de nombreux domaines d'application, comme l’Internet des objets, l'apprentissage automatique, le deep learning et l'intelligence artificielle. Cela signifie que des interfaces sont disponibles pour un très grand nombre de bibliothèques.
Combiner CVB et Python
Afin d’utiliser pleinement les performances de Common Vision Blox, une connexion optimisée entre Python et CVB est essentielle. La procédure habituelle pour créer une interface Python consiste à la générer à partir d'une interface C à l'aide d'outils standards. Cependant, comme Python peut aller bien au-delà de C, cette approche n’est pas forcément la meilleure, car elle laisse de côté une grande partie de son potentiel. En général, il est préférable de générer l'interface Python à partir d'une architecture plus moderne, orientée objet et puissante comme C++. Bien qu'il s'agisse là d'un progrès, cette méthode laisse cependant de côté d'importantes fonctionnalités de Python, car elle se contente de choisir un langage et de le « comprimer » dans un autre, en ignorant leurs caractéristiques essentielles.
Le résultat est en général un ensemble des fonctions communes aux deux langages, assez loin de ce qu’attendent les développeurs. Finalement, la solution consiste à créer le wrapper manuellement. Cela semble à première vue assez complexe, mais l’équipe de développement de STEMMER IMAGING, qui connaît très bien CVB et Python, y est parvenue.
Le CVBpy-Binder créé permet d’accéder à de nombreuses fonctions spécifiques de Python, pouvant être utilisées pour la programmation et le prototypage avec CVB. Parmi celles-ci, on peut citer :
-
Gestion explicite des ressources. Python prend en charge la gestion des ressources, comme la mémoire ou les fichiers, et CVBpy l’aide dans cette tâche. Cela évite d'avoir à libérer manuellement de la mémoire, à fermer des fichiers ou à externaliser la gestion des ressources. La gestion explicite des ressources est particulièrement importante pour les applications de vision impliquant l'acquisition ou le traitement d’images de grande taille et l'utilisation de fréquences d'images élevées et/ou d'un grand nombre de dispositifs différents qui génèrent un grand nombre de données et nécessitent d'énormes quantités de mémoire.
-
Documentation intégrée. Python dispose d'une documentation, mise directement à disposition dans CVBpy. L’interface de programmation et sa documentation sont étroitement liées, si bien que l’IDE (integrated development environment) peut être directement affichée dans la documentation pour chaque fonction. Il n'est donc pas nécessaire d'installer une documentation séparée.
-
Amélioration du multithreading et prise en charge de l’asynchrone pour les tâches manuelles. Cela permet de démarrer des fils natifs et d'utiliser la fonction asynchrone de Python qui travaille généralement via une routine de gestion d'événements.
-
API stable. Python offre une API ou ABI (Application Binary Interface) stable pendant toute la durée de vie de Python 3, grâce à PEP 384. Cela signifie que CVBPy fonctionne avec toutes les versions de Python, de V3.5 à la V3.8 actuelle, et au-delà, sans qu’aucun ajustement ne soit nécessaire pour les futures versions de Python 3.
-
CVBpy fournit une interface à NumPy. NumPy fonctionne avec des matrices multidimensionnels de grande taille, ainsi qu'avec un très grand nombre de fonctions mathématiques avancées. L'interface CVBpy permet de transférer directement les images prises par un appareil réel vers NumPy, là où tous les algorithmes développés peuvent être utilisés.
-
PySide2 permet de créer une interface utilisateur de façon simple. Les applications de vision ont besoin d’une fonction d’affichage adaptée pour visualiser les images originales et les résultats des algorithmes. Comme Python n’est livré avec aucune interface utilisateur, CVBpy utilise PySide2, un wrapper pour Qt5, l'une des bibliothèques d'interface graphique multiplateforme parmi les plus connues et les plus utilisées.
figure 1 : La structure des nouvelles API orientées objet de CVB qui utilisent C++, .NET et Python.
Orientation des objets
En ce qui concerne l’orientation des objets, CVBpy peut interagir avec un grand nombre de classes simples. Le point d’entrée principal pour accéder aux périphériques, comme la caméra par exemple, est le device factory, qui donne également accès à différents types d’appareils (voir image 1). Il existe une interface générale pour les appareils vidéo qui ont un hardware réel derrière eux ou pour les appareils qui ne font pas de streaming et qui ont juste un chemin de contrôle. Il existe également des appareils émulés avec des données définies, soit en tant que fichier multimédia classique, soit sous la forme d’un fichier d'émulation. Les appareils peuvent avoir un ou plusieurs flux.
L'utilisation de plusieurs flux est en cours de développement, mais il y a généralement au moins un flux disponible qui dispose d’une mémoire circulaire dans laquelle se trouve les images acquises. Ce flux fournit l'image la plus récente pour le traitement. L'image elle-même est constituée de plusieurs plans. L'appareil possède des node maps, comme une node map GenAPI par exemple pour le chemin de contrôle. Les cartes, les nœuds et les fonctions peuvent être récupérés à différents niveaux, à partir de n'importe quel appareil défini via le code XML. En outre, les appareils sont dotés d'interfaces pratiques qui facilitent l'accès aux fonctions communes.
Exemples d’application de CVBpy
L'un des exemples les plus simples est le programme « hello world » de Python. Cet exemple « hello world » de CVBpy montre le code nécessaire pour acquérir une série d'images (figure 2). Il s'agit d'un code assez simple. La première action consiste à ouvrir un appareil mock up du device factory et d’en tirer un flux. Le flux est alors lancé pour l’acquisition de 10 images. L'état de chaque image est vérifié pour s'assurer qu'elle est correcte, puis le numéro de l'image est imprimé. À la fin, on stoppe l’acquisition et les ressources sont libérées pour faire de la place.
Pour des exemples plus complexes, un affichage direct est nécessaire, qui sache s’adapter. L'application de l’interface utilisateur doit être un environnement avec plusieurs fils d’exécution pour permettre à la caméra de fonctionner de manière asynchrone. En outre, une utilisation uniforme du matériel d'acquisition est nécessaire et, idéalement, l'interface graphique et le code proprement dit devraient être séparés.
Cette vidéo présente le fonctionnement de la connexion à l'interface graphique et montre à quel point il est facile de configurer un affichage d'images en flux unique à partir d'un appareil avec seulement 26 lignes de code et de le relier à l'interface graphique.
En résumé
La prise en charge de Python par Common Vision Blox ouvre de nouvelles possibilités d’applications de scripting. Celles-ci peuvent être modifiées pendant que le système fonctionne, ce qui accélère considérablement les processus de prototypage. Travailler avec CVBpy ou avec des modules Python conventionnels est similaire. Avec CVBpy, les programmeurs et développeurs ont en outre les avantages de CVB.