Intelligence embarque IMA5 2022/2023 G8 : Différence entre versions

De Wiki d'activités IMA
(Installation de STM32 Cube IDE et de nanoedgeaistudio)
(Déploiement)
 
(43 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 19 : Ligne 19 :
  
 
=== Configuration de STM32 Cube IDE ===
 
=== Configuration de STM32 Cube IDE ===
Configurer le réseau de manière à avoir le proxy : proxy.polytech-lille.fr avec le port 3128.
+
*Configurer le réseau de manière à avoir le proxy : proxy.polytech-lille.fr avec le port 3128.
 +
*Ajouter la licence.
  
 
=== Téleversement du programme ===
 
=== Téleversement du programme ===
 
Dans STM32Cube IDE, on ouvre le projet 53L5A1_ThresholdDetection.ioc et on build le project en mode release, cela génère un fichier éxecutable .elf. Enfin on fait un run pour téléverser le programme et le lancer sur la carte.
 
Dans STM32Cube IDE, on ouvre le projet 53L5A1_ThresholdDetection.ioc et on build le project en mode release, cela génère un fichier éxecutable .elf. Enfin on fait un run pour téléverser le programme et le lancer sur la carte.
 +
 +
[[Fichier:Screenshot programme ide.png|800px]]
  
 
=== Affichage des résultats ===
 
=== Affichage des résultats ===
 
Dans le programme fourni, il faut modifier les affichages en ajoutant des retours chariot pour pouvoir afficher correctement les valeurs sur le terminal. Ouvrir un terminal et ouvrir minicom dessus, configurer le nombre de bauds à 460800, et observer le tableau des distances.
 
Dans le programme fourni, il faut modifier les affichages en ajoutant des retours chariot pour pouvoir afficher correctement les valeurs sur le terminal. Ouvrir un terminal et ouvrir minicom dessus, configurer le nombre de bauds à 460800, et observer le tableau des distances.
  
=== Configuration de nano edge ai studio ===
+
=== Utilisation de nano edge ai studio ===
 
*Sélectionner un capteur générique avec 64 axes pour le capteur.
 
*Sélectionner un capteur générique avec 64 axes pour le capteur.
*Acquisition des signaux (port de casque, port de lunettes, port des deux, port de rien) du port série ou d'un fichier.
+
 
*Benchmarking des 4 classes de signaux.
+
[[Fichier:Config acquisition.png|800px]]
*Emulation du benchmark.
+
 
 +
*Acquisition des signaux avec 4 cas possibles (port de casque, port de lunettes, port des deux, aucune protection) via le port série configuré avec le bon nombre de Bauds. Pour ce faire on a modifié le programme de base pour qu'il envoie les différentes données avec comme délimiteur une virgule. Lorsque le programme devait afficher une croix on l'a remplacé par un zéro. On essaie d'avoir un maximum de données pour que le programme soit le plus fiable possible.
 +
 
 +
[[Fichier:Signaux reçus.png|800px]]
 +
 
 +
 
 +
 
 +
*Benchmarking des 4 classes de signaux, on remarque que la précision est plutôt bonne :
 +
 
 +
[[Fichier:Benchmark1.png|800px]]
 +
 
 +
 
 +
*Emulation du benchmark. Pendant l'émulation on se rend vite compte que notre programme n'est pas précis. En effet, il détecte que l'utilisateur ne porte pas decasque alors qu'il en porte un et inversement.
 +
 
 +
=== Maquette ===
 +
 
 +
Pour la maquette nous nous sommes munis d'EPI (Équipement de protection individuelle) à savoir un casque et des lunettes de protection. Nous avons positionné le capteur à une distance fixe de l'utilisateur.
 +
 
 +
[[Fichier:IC1.png|300px]]
 +
 
 +
=== Problème  ===
 +
*Le benchmarking fait des 4 classes de signaux, avec 100 mesures par classe, ne donne pas des résultats corrects vu que le modèle indique la présence du casque ou des lunettes même en leur absence.
 +
*Le fait de s'éloigner même de quelques centimètres du capteur fait que les résultats attendus sont erronés, le test a été refait à une distance fixe sans trop bouger.
 +
*Le modèle a vraiment du mal à identifier la différence entre le cas où l'utilisateur ne porte qu'un EPI (lunette ou casque) du cas où il en porte 2.
 +
 
 +
 
 +
=== Solution Envisagée ===
 +
*Ajouter plus de mesures dans chaque signal. Cependant il a un problème lorsque'on utilise trop de mesures, lors de la création du benchmark, le pc freeze ou crash.
 +
 
 +
*Les mesures ont été prises d'une distance très proche du capteur vu que la précision est un peu faible lorsqu'on s'éloigne du capteur.
 +
 
 +
*Faire une classification où on ne vérifie que si l'utilisateur porte un casque ou non, puis faire un autre modèle où il ne vérifie que les lunettes.
 +
 
 +
=== Résultats de la nouvelle solution ===
 +
Le fait de ne regarder que 2 classes améliore grandement la précision du modèle, de plus nous avons pris 150 valeurs pour les datasets pour éviter que le PC crash.
 +
En revanche même en n'ayant que 2 classes, le modèle ne parvient pas à discerner les lunettes. Cela peut être dû au fait que les lunettes ne modifient pas grandement la valeur du capteur de par leurs tailles ou du fait de leurs transparences.
 +
 
 +
[[Fichier:Casque test.png|600px]]
 +
 
 +
=== Déploiement ===
 +
 
 +
Le déploiement du benchmark génère 2 fichiers .h et 1 fichier .a que nous rangeons dans un dossier include et lib respectivement.
 +
Il y a eu un problème lors de l'intégration de la librairie et des fichiers entêtes dans le code de la carte, pour une raison inconnue, le programme ne voulait pas compiler avec les librairies qui ont été ajoutées. Ce qui a rendu le déploiement impossible.
 +
 
 +
 
 +
=== Présentation et retour ===
 +
Lors de la présentation nous avons signalé les problèmes liés au déploiement et à l'intégration de nos librairies dans le programme. Nous avons donc dû faire la demonstration avec l'émulateur pour montrer la faisabilité de notre projet. La présentation s'est bien passée et les personnes de ST ont bien aimés notre idée puis ils nous ont donné quelques pistes d'amélioration :
 +
 
 +
- Filtrer les données relatives au fond derrières qui ne sont que parasites lors de l'acquisition des données. C'est à dire ajouter un seuil au programme qui filtre toutes les distances supérieures à un seuil et les ramènerait à une valeur max.
 +
 
 +
- Avoir plus de données pour l'IA, c'est ce que nous avons essayé de faire, mais comme dit précédemment, les zabeths crashent au delà de 250 données, ce qui nous fixe une limite physique à ce niveau là.

Version actuelle datée du 4 janvier 2023 à 14:55

Projet utilisation de l'IA pour une application embarquée

L'objectif du projet est d'utiliser une application utilisant de l'intelligence artifielle avec des microcontroleurs STM32F401 ainsi qu'un capteur TOF X-NUCLEO-53L5A1

Idées en vrac :

  • reconnaissance d'objets (formes, dimensions) : par exemple boîte en carton
  • détection de position d'objet
  • IHM avec reconnaissance gestuelle (main, mouvements, doigts ...)
  • Détection de la fatigue en regardant les clignements des yeux.
  • Detection du port du casque et équipements de sécurité dans une usine.

Idée retenue : Détection du port du casque et équipements de sécurité dans une usine (lunettes de sécurités, masques...)

Installation de STM32 Cube IDE et de nanoedgeaistudio

  • Extraire les dossiers control et data
  • Executer la commande :
 apt-get update -qy && apt-get -y install procps libnss3

Configuration de STM32 Cube IDE

  • Configurer le réseau de manière à avoir le proxy : proxy.polytech-lille.fr avec le port 3128.
  • Ajouter la licence.

Téleversement du programme

Dans STM32Cube IDE, on ouvre le projet 53L5A1_ThresholdDetection.ioc et on build le project en mode release, cela génère un fichier éxecutable .elf. Enfin on fait un run pour téléverser le programme et le lancer sur la carte.

Screenshot programme ide.png

Affichage des résultats

Dans le programme fourni, il faut modifier les affichages en ajoutant des retours chariot pour pouvoir afficher correctement les valeurs sur le terminal. Ouvrir un terminal et ouvrir minicom dessus, configurer le nombre de bauds à 460800, et observer le tableau des distances.

Utilisation de nano edge ai studio

  • Sélectionner un capteur générique avec 64 axes pour le capteur.

Config acquisition.png

  • Acquisition des signaux avec 4 cas possibles (port de casque, port de lunettes, port des deux, aucune protection) via le port série configuré avec le bon nombre de Bauds. Pour ce faire on a modifié le programme de base pour qu'il envoie les différentes données avec comme délimiteur une virgule. Lorsque le programme devait afficher une croix on l'a remplacé par un zéro. On essaie d'avoir un maximum de données pour que le programme soit le plus fiable possible.

Signaux reçus.png


  • Benchmarking des 4 classes de signaux, on remarque que la précision est plutôt bonne :

Benchmark1.png


  • Emulation du benchmark. Pendant l'émulation on se rend vite compte que notre programme n'est pas précis. En effet, il détecte que l'utilisateur ne porte pas decasque alors qu'il en porte un et inversement.

Maquette

Pour la maquette nous nous sommes munis d'EPI (Équipement de protection individuelle) à savoir un casque et des lunettes de protection. Nous avons positionné le capteur à une distance fixe de l'utilisateur.

IC1.png

Problème

  • Le benchmarking fait des 4 classes de signaux, avec 100 mesures par classe, ne donne pas des résultats corrects vu que le modèle indique la présence du casque ou des lunettes même en leur absence.
  • Le fait de s'éloigner même de quelques centimètres du capteur fait que les résultats attendus sont erronés, le test a été refait à une distance fixe sans trop bouger.
  • Le modèle a vraiment du mal à identifier la différence entre le cas où l'utilisateur ne porte qu'un EPI (lunette ou casque) du cas où il en porte 2.


Solution Envisagée

  • Ajouter plus de mesures dans chaque signal. Cependant il a un problème lorsque'on utilise trop de mesures, lors de la création du benchmark, le pc freeze ou crash.
  • Les mesures ont été prises d'une distance très proche du capteur vu que la précision est un peu faible lorsqu'on s'éloigne du capteur.
  • Faire une classification où on ne vérifie que si l'utilisateur porte un casque ou non, puis faire un autre modèle où il ne vérifie que les lunettes.

Résultats de la nouvelle solution

Le fait de ne regarder que 2 classes améliore grandement la précision du modèle, de plus nous avons pris 150 valeurs pour les datasets pour éviter que le PC crash. En revanche même en n'ayant que 2 classes, le modèle ne parvient pas à discerner les lunettes. Cela peut être dû au fait que les lunettes ne modifient pas grandement la valeur du capteur de par leurs tailles ou du fait de leurs transparences.

Casque test.png

Déploiement

Le déploiement du benchmark génère 2 fichiers .h et 1 fichier .a que nous rangeons dans un dossier include et lib respectivement. Il y a eu un problème lors de l'intégration de la librairie et des fichiers entêtes dans le code de la carte, pour une raison inconnue, le programme ne voulait pas compiler avec les librairies qui ont été ajoutées. Ce qui a rendu le déploiement impossible.


Présentation et retour

Lors de la présentation nous avons signalé les problèmes liés au déploiement et à l'intégration de nos librairies dans le programme. Nous avons donc dû faire la demonstration avec l'émulateur pour montrer la faisabilité de notre projet. La présentation s'est bien passée et les personnes de ST ont bien aimés notre idée puis ils nous ont donné quelques pistes d'amélioration :

- Filtrer les données relatives au fond derrières qui ne sont que parasites lors de l'acquisition des données. C'est à dire ajouter un seuil au programme qui filtre toutes les distances supérieures à un seuil et les ramènerait à une valeur max.

- Avoir plus de données pour l'IA, c'est ce que nous avons essayé de faire, mais comme dit précédemment, les zabeths crashent au delà de 250 données, ce qui nous fixe une limite physique à ce niveau là.