Matériel incorporé à faible coût pour la vision par ordinateur

Grâce aux progrès considérables réalisés dans le domaine de la vision par ordinateur et à la disponibilité, depuis quelques années, d'une puissance de calcul bon marché, il pourrait être facile de satisfaire l'énorme demande de solutions intelligentes disponibles sur de petits ordinateurs monocartes. Les algorithmes de vision par ordinateur sont de plus en plus souvent déployés pour la vision dans une variété de situations d'utilisation périphérique : drones, caméras de sécurité, applications mobiles, analyse de la vente au détail, etc.

Récemment, lors de la réalisation d'une démonstration de faisabilité pour une entreprise, notre objectif a consisté à détecter certains objets en temps réel.

Démonstration de faisabilité

Dans l'installation de démonstration, une caméra capture en permanence des images et les transmet à un mini-ordinateur, en l'occurrence un Raspberry Pi 4. Ce mini-ordinateur traite les images en utilisant la bibliothèque Python OpenCV. Dans un premier temps, nous avons commencé à détecter les blocs Lego d'une couleur particulière, par exemple les rouges. 

Nous avons utilisé le Raspberry Pi 4 comme unité de traitement principale. Il s'agit d'une plate-forme matérielle open source, légère et peu coûteuse, de la taille d'une carte de crédit, capable de fonctionner comme un ordinateur à part entière doté d'un puissant processeur et de nombreuses autres fonctionnalités utiles. Il est donc idéal pour les applications mobiles ou autres où la taille, le poids et le coût sont essentiels. Dans cette configuration, la caméra utilisée pour la capture d'images est la Raspberry Pi Camera v2, un capteur d'image Sony 8 mégapixels de qualité supérieure et à faible coût. Cette caméra peut produire des images statiques de 3.280 x 2.464 pixels et des vidéos 1080p. 

Cette configuration a permis de capturer des images en continu et de les traiter à 100 ips (images par seconde). Nous avons pu capturer très facilement la vidéo à 100 ips à l'aide de la caméra Pi. Le traitement des images a lui aussi pu être réalisé aisément à la bonne vitesse. En évaluant la vitesse des deux processus séparément, on pourrait conclure que le matériel devrait être capable d'exécuter les deux processus combinés à la vitesse requise. Toutefois, lorsqu'il a également fallu distinguer les blocs Lego dans chaque image capturée, notre configuration n'a pas réussi à atteindre la vitesse de traitement de 100 images par seconde. Elle est alors tombée à 30 fps. 

Profilage et multithreading

Les performances sont essentielles dans la plupart des systèmes en temps réel. Comme tout programmeur le sait, la recherche des causes de mauvaises performances peut s'avérer complexe et chronophage. Bien souvent, le problème se résout facilement, pour autant que la cause première soit découverte. Le profilage consiste à surveiller une application à différents niveaux d'exécution afin de comprendre où les ressources sont utilisées. Cela se fait notamment en déterminant le moment où une méthode est exécutée et quelle durée il faut à la méthode pour effectuer une tâche précise. Après avoir profilé notre application pour déterminer le temps que prend chaque fonction, nous avons opté pour le multithreading. Cette méthode améliore les performances d'exécution d'un processus en utilisant la concurrence. En d'autres termes, elle permet à plusieurs tâches (threads) de fonctionner indépendamment les uns des autres au sein du programme. La tâche principale capturait les images à 100 ips, tandis qu'une seconde tâche traitait les images capturées à 180 ips. Enfin, après la synchronisation des deux tâcehs, notre installation a réussi à réaliser à la fois la capture et le traitement à 100 ips.

Sortie segmentée de l'algorithme de détection des blocs Lego tournant sur Raspberry Pi :

On peut en conclure ce qui suit :
  1. Il ne faut jamais sous-estimer les capacités de tels systèmes économiques pour des applications intelligentes en temps réel. 
  2. Il est possible d'obtenir des performances élevées en adoptant des techniques de programmation classiques, plutôt que d'investir à l'aveuglette dans du matériel coûteux.
Vous êtes aux prises avec des problèmes similaires ? Contactez-nous !

(Source image au dessus: https://www.dreamstime.com)