L’IA en périphérie de réseau : prise en main de la carte Maxim Integrated MAX78000FTHR
La carte miniature MAX78000FTHR de Maxim Integrated est basée sur un microcontrôleur MAX78000, conçu pour les applications d'intelligence artificielle (IA) en périphérie de réseau. Plutôt que l'éloignement par rapport à un centre de données, la notion de « périphérie de réseau » exprime simplement le rapprochement du dispositif du lieu où le besoin se manifeste, voire même la proximité d'un capteur. Cette « périphérie » correspond, par exemple, à votre maison ou à votre voiture, ou même au vêtement que vous portez. Une application d'IA fonctionnant en périphérie fait son travail de manière autonome, sans sous-traiter les calculs complexes à un service dans le nuage. Pour ce faire, elle doit disposer d'une grande puissance de traitement ; d'où la présence dans le MAX78000 d'un processeur ARM Cortex-M4 associé à une unité à virgule flottante (FPU), un accélérateur de réseau neuronal convolutif (CNN) et un cœur RISC-V, le tout réuni dans un seul dispositif.
Par ailleurs, les appareils situés en périphérie de réseau sont censés consommer peu d'énergie. Le SoC MAX78000 a donc été conçu pour absorber une très faible puissance. À la fois puissant et sobre, il peut, aux dires de son fabricant, calculer des inférences d'IA (c'est-à-dire répondre à des questions comme « Qui apparaît dans cette image ? » ou « Quel était ce son ? ») en mobilisant moins d'un centième de l'énergie d'autres solutions embarquées.
Réseau de neurones convolutifs
Un réseau de neurones convolutifs ou CNN est un type particulier de réseau de neurones basé sur les convolutions. Une convolution est une opération mathématique fréquente dans le traitement d'images et de signaux, qui peut s'apparenter à un filtrage (adapté). Un CNN est donc constitué d'un ensemble de filtres chargés d'examiner le signal d'entrée pour y détecter certaines caractéristiques. Ce type de réseau est particulièrement utile dans les applications de traitement du son et de l'image, et il n'est donc pas surprenant que le MAX78000 intègre également une interface de caméra et une interface I2S pour le streaming audio. Son CNN est optimisé pour le traitement 1D (son) et 2D (image et vidéo).
Outre les modules et périphériques déjà mentionnés, le SoC MAX78000 contient la plupart des périphériques courants d'un microcontrôleur, plus quelques fonctions spéciales liées à la sécurité de l'Internet des Objets (IoT) comme un générateur de nombres aléatoires (RNG) et un moteur de chiffrement AES (figure 1).
Que contient la carte ?
La carte MAX78000FTHR (figure 2) est un module miniature — 66 × 23 mm — comprenant le microcontrôleur MAX78000, une minuscule caméra VGA, un microphone numérique, une entrée/sortie audio stéréo, un emplacement pour carte microSD, 1 Mo de RAM QSPI, un port de débogueur/programmateur SWD sur USB et un chargeur de batterie LiPo. La carte possède également deux LED RVB et deux boutons-poussoirs et connecteurs d'extension pour l'utilisateur, compatibles avec le format Feather d'Adafruit. Un connecteur JTAG distinct est disponible pour la programmation et le débogage du cœur RISC-V.
Lorsqu'elle est connectée à un ordinateur, la carte est reconnue comme un appareil USB composite comprenant une liaison DAP, plus l'adaptateur CMSIS DAP WebUSB, un dispositif de stockage de masse et un port série. La carte est livrée préchargée avec une démo audio de repérage par mot-clé (KWS). Vous pourrez accéder à la procédure d'utilisation de la démo en connectant un terminal au port série de la carte.
Que pouvez-vous faire avec la carte ?
En standard, la démo reconnaît les mots anglais « Zero » à « Nine », « Go », « Stop », « Left », « Right », « Up », « Down », « On » et « Off». Lorsqu'elle détecte le mot « Go », la démo passe en mode reconnaissance de nombres pour faire clignoter une LED autant de fois que demandé par le locuteur. Si la carte entend « Six », la LED clignotera six fois. La commande « Stop » permet de revenir en mode normal. Le moniteur série affiche des informations sur le degré de confiance que la démo accorde à ses performances.
Pour aller au-delà de l'application de démonstration préchargée (par exemple pour réaliser une commande système comme le basculement d'une broche GPIO ou la transmission de données sur une autre interface), un environnement de développement est nécessaire. À ce sujet, Maxim propose le SDK Maxim Micros que vous pouvez télécharger gratuitement sur son site web.
Le SDK est une chaîne d'outils basée sur le projet Eclipse, qui peut également être utilisée avec d'autres microcontrôleurs de Maxim fondés sur des processeurs ARM. Il contient l'IDE Eclipse, MinGW, les chaînes d'outils GCC pour processeurs ARM et RISC-V, OpenOCD, et quelques autres utilitaires. En outre, le SDK contient des bibliothèques, des exemples et de la documentation, c'est-à-dire tout ce dont vous aurez besoin pour vous lancer sous Windows.
À vous de jouer
Lancez Eclipse MaximSDK et choisissez ou définissez un espace de travail. Veillez à ce qu'il n'y ait aucun espace vide dans le chemin d'accès. Dans le cas contraire, il est possible qu'Eclipse ne puisse pas compiler les projets ou que votre espace de travail ne soit pas là où il le devrait.
Une fois l'IDE ouvert, un écran de bienvenue s'affiche. Vous pouvez le fermer sans en tenir compte. Vous allez pouvoir ensuite créer un projet ou importer un projet existant.
Pour créer un projet, développez la ligne C/C++ et sélectionnez l'assistant Maxim Microcontrollers, cliquez sur Next et indiquez un nom de projet. Cliquez une nouvelle fois sur Next puis, dans la boîte de dialogue qui s'ouvre, fixez le type de puce (Chip type) à MAX78000, le type de carte à FTHR_RevA et le type d'adaptateur à CMSIS-DAP. Comme type d'exemple, faites un choix se rapprochant de ce que vous prévoyez de faire, puis cliquez sur Finish pour créer le projet (figure 3).
Sélectionner la bonne carte
La toute première chose à faire est de réparer le projet, car même si vous avez sélectionné la carte MAX78000FTHR, le projet est créé pour la MAX78000EVKIT. Vous aurez à garder cela à l'esprit car presque tout ce qui se trouve dans le SDK est traité par défaut pour ce kit. Il y a deux manières de sélectionner la bonne carte (ou même choisir les deux, ce qui ne fonctionnera pas mieux) :
- Dans la section Specify the board used du makefile, décommentez la mention de la carte FTHR_RevA et mettez en commentaire EvKit_V1 (figure 4). Une fois cela effectué, enregistrez le fichier.
- Éditez la commande build, accessible par le biais de la boîte de dialogue des propriétés du projet dans la section C/C++ Build. Ajoutez la mention BOARD=FTHR_RevA dans la zone de commande de compilation (figure 5), cliquez sur le bouton Apply and Close.
Par sécurité, nettoyez le projet avant de continuer. Le nettoyage est disponible dans le menu Project ou après un clic droit sur le projet dans la fenêtre Project Explorer.
Vous pouvez ensuite compiler et exécuter le projet, ou le déboguer. Si vous cliquez sur la commande d'exécution (le point vert avec un triangle blanc) ou de débogage (le petit insecte), une fenêtre intitulée Create, manage and run configurations peut apparaître. Dans ce cas, développez la ligne GDB OpenOCD Debugging et sélectionnez le projet avant de continuer.
Si vous avez démarré en mode de débogage, le programme sera arrêté au début du programme principal. Utilisez les commandes du menu Run pour parcourir le programme et inspecter les variables.
Importer un exemple
Dans le menu File, cliquez sur Import… pour importer un exemple. Développez la première ligne, General, et choisissez l'assistant Existing Projects into Workspace. Accédez au répertoire racine. Pour les exemples relatifs au SDK, il s'agit du répertoire MaximSDK\Examples\MAX78000. Vous obtiendrez ainsi une liste d'exemples parmi lesquels vous pourrez sélectionner ceux que vous souhaitez importer. Vous pouvez même les importer tous, si nécessaire.
Pour continuer notre parcours de repérage de mots-clés entamé précédemment, cliquez sur Deselect All, puis cochez kws20_demo. Cochez également Copy projects into workspace car nous allons modifier l'exemple tout en conservant l'original.
Notez qu'un certain nombre de projets ont besoin de fichiers absents du dossier où ces projets résident. Ces fichiers ne sont pas copiés en même temps que le projet, ce qui provoquera un échec de la compilation. Vous devez, au choix, copier ces fichiers vous-même, ou modifier le makefile pour réparer le chemin d'accès à ces fichiers. Le projet cats-dogs_demo, par exemple, nécessite le dossier Common. Vous devez donc copier ce dossier également (au lieu d'utiliser l'exemple original ou, pire encore, faire du dossier d'exemple votre espace de travail).
Après avoir importé l'exemple de projet, modifiez la carte concernée comme décrit ci-dessus. Compilez l'exemple et essayez-le. Si tout fonctionne bien, vous pouvez le modifier.
J'ai modifié la démo KWS pour qu'elle positionne la broche P2.3 à l'état haut lorsque la carte entend le mot On, et à l'état bas lorsqu'elle entend le mot Off. Selon le mot-clé concerné, la LED sera verte (On) ou rouge (Off). Si un autre mot-clé a été reconnu, la LED devient bleue, mais la broche ne change pas d'état. La broche P2.4 indique le niveau de confiance. Lorsque le niveau de confiance de l'inférence est trop faible (inférieur ou égal à 95 %), cette broche passe à l'état bas.
Finalement, j'ai ajouté UART2 au mix d'E/S. Ce port série est disponible sur les barrettes d'extension et peut donc être connecté à un autre système pour traiter les données arrivant par ce lien. Tous les mots-clés reconnus avec une probabilité supérieure à 95 % sont envoyés par ce lien. Les mots clés On et Off sont précédés de la mention 'Y', les autres mots clés commencent par 'N'. En cas de faible niveau de confiance, la chaîne commence par '?'. N'hésitez pas à changer ce schéma de codage arbitraire en choisissant une approche plus utile pour votre application.
Il est possible de télécharger mon projet sur GitHub. Vous y trouverez également une version de démonstration du détecteur de chat/chien qui produit des données supplémentaires sur le port UART2.
MAX78000FTHR : quelques détails à prendre en compte
Alors que vous vous préparez à travailler avec la carte MAX78000FTHR, gardez les éléments suivants à l'esprit.- Le niveau de tension sur les ports d'E/S est par défaut de 1,8 V. Vous pouvez le modifier par broche en complétant le champ vssel de la structure mxc_gpio_cfg_t lorsque la broche est configurée avec la fonction MXC_GPIO_Config. Pour 3,3 V, vous voulez MXC_GPIO_VSSEL_VDDIOH (la valeur par défaut est MXC_GPIO_VSSEL_VDDIO, sans le 'H' à la fin).
- Le problème du niveau de tension existe également pour les fonctions à broches alternées comme TX et RX pour UART2. Toutefois, leurs structures de configuration des broches sont en quelque sorte en lecture seule, de sorte que vous ne pouvez pas modifier le champ vssel. Une solution consiste à copier d'abord la structure, à modifier la copie, puis à l'utiliser pour (re)configurer la broche comme n'importe quelle autre. Si vous connaissez une meilleure façon de procéder, n'hésitez pas à me l'indiquer.
- La fonction MXC_GPIO_OutPut ne m'a pas permis de définir la valeur d'une broche, et j'ai dû à la place utiliser MXC_GPIO_OutSet et MXC_GPIO_OutClr. La cause semble être la valeur de broche passée. Zéro fonctionne comme on pouvait s'y attendre, mais pas 1. Pour que cela fonctionne, il faut passer la valeur sous la forme −1 (moins un, c'est-à-dire 0xffffffff)...
- Maxim a créé sur GitHub des référentiels pour les cartes et les outils MAX78000. Vous y trouverez toutes les versions les plus récentes, dont des tutoriels et des exemples.
- Le SDK est proposé avec MinGW comme alternative à Eclipse. Ainsi, si vous préférez une console au lieu d'un IDE, vous êtes parfaitement équipé(e).
- La minuscule caméra de la carte MAX78000FTHR peut être recouverte d'un film protecteur (figure 6). Veillez à le retirer avant d'essayer les applications utilisant la caméra.
À vous d'expérimenter !
Vous êtes maintenant prêt(e) à commencer à expérimenter l'apprentissage automatique (ML ou machine learning en anglais) et l'intelligence artificielle (IA) à l'aide de la carte MAX78000FTHR. Dans cet article, nous n'avons fait qu'effleurer les caractéristiques de cette puissante carte. D'autres articles plus approfondis vont suivre. Nous vous avons montré ici comment mettre en place l'environnement de développement et modifier certains exemples pour exécuter, dans des applications personnalisées, des processus d'IA entraînés au préalable.
L'un des sujets que nous avons laissés de côté est l'entraînement de l'application d'IA. Cette tâche demande beaucoup de temps et de ressources, mais elle doit être réalisée si vous voulez que l'application d'IA fonctionne avec vos données. Vous trouverez plus d'informations sur la manière de procéder dans les référentiels de Maxim sur GitHub.
L’intelligence artificielle (IA) a encore besoin de l’intelligence naturelle pour innover, autrement dit a besoin de votre talent !
Et puisque le talent se récompense, Elektor organise un concours vous invitant à imaginer et concevoir une application originale pour le microcontrôleur MAX78000 à ultra-basse consommation de Maxim Integrated.
Traduction : Pascal Godart