SE5 ECEAI/eceai 2024/2025/cruchet-deryckere

De wiki-se.plil.fr
Révision datée du 23 septembre 2024 à 16:03 par Scruchet (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

Introduction

Notre projet est d'entraîner une IA à reconnaitre nos deux voix afin de déterminer quelle personne parle. Pour ce faire, nous disposons de :

  • une carte Nucleo-F401RE
  • un microphone Adafruit MAX4466
  • une machine virtuelle
  • une Raspberry Pi 4 (IP : 172.26.145.209)
  • le logiciel Nanoedge AI

Architecture réseau

Voici l'architecture proposé pour le TP :

  • le microphone récupère le son et le transmet à la carte nucléo
  • le bus de donnée est transmis à la Raspberry par connection série
  • cette dernière envoie le message par MQTT à la VM

Ceci nous permet de tester l'IA a dofférent niveau :

  • sur la carte Nucléo
  • sur la Raspberry
  • sur la VM

Pour ce faire, nous avons configurer un réseau ("WIFI_IA_SE5") sur un Cisco pour permettre la connection entre les Raspberry et VM de la promo. Pour ce faire, nous nous sommes basés sur le TP de réseau de SE4 et avons paramétré le Cisco via minicom. Ce dernier sert d'access point et permet d'avoir un réseau privé (et sans connection à l'extérieur pour le moment).

Développement

Pour prendre en main le microphone, nous avons développé un programme python pour afficher le signal et sa FFT. On connecte le micro à la carte Nucleo avant d'envoyer les données (entre 0 et 4095) par liaison série. Le programme python intercepte ses données et les centre autour de 0 avant de les afficher sur un graphique.

Pour que l'IA comprenne ces données, nous envoyons un bus comprennant entre 2 et 4096 données (puissance de 2) séparées par des ";", qui seront ensuite découpées et placées dans un tableau sur Nanoedge AI.


Pour envoyer les données via USB, nous avons créé un firmware qui lit les données sur l'ADC et l'envoie sur l'UART.

    unsigned int microphone = 0;
	unsigned char chaine[100];
	int i = 0;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
   {

 	    /* Infinite loop */
 	    /* USER CODE BEGIN WHILE */
 	        HAL_ADC_Start(&hadc1);
 	        HAL_ADC_PollForConversion(&hadc1, 1000);
 	        microphone = HAL_ADC_GetValue(&hadc1);
 	        HAL_ADC_Stop(&hadc1);
 	        // Conversion de l'entier en chaîne de caractères
 	        sprintf((char*)chaine, "%u;", microphone);  // Conversion en chaîne de caractères
 	        // Transmission de la chaîne via UART
 	        HAL_UART_Transmit(&huart2, chaine, strlen((char*)chaine), 1000);  // Envoyer la chaîne
 	        i++;

 	        if (i == TAILLE_LIGNE){
 	        	i = 0;
 	        	 sprintf((char*)chaine, "\r\n");
 	        	 HAL_UART_Transmit(&huart2, chaine, strlen((char*)chaine), 1000); //Retour à la ligne après TAILLE_LIGNE
 	        }

 	    }

Implémentation de l'IA

Nous avons enregistré séparément nos 2 voix (et, dans certains cas, un signal "autre", avec des bruits de fond et d'autres voix que les notres) et les avons donné à l'IA pour qu'elle les "apprenne". Nous nous sommes rendu compte d'un dilemme important pour notre utilisation de l'IA :

  • soit on choisit d'envoyer un grand bus de données : l'IA trouve plus souvent notre voix mais le temps de calcul est plus long
  • soit on choisit d'envoyer un petit bus de données : l'IA a plus de mal à avoir le bon résultat mais le temps de calcul est plus court

Nous avons essayé de régler ce problème pour calculer rapidement en envoyant de grand bus de données en supprimant le délai de 1ms mis en place dans le firmware.

Taille du bus Score (%) Graphique
2 99.88
Score en fonction de la taille du bus
64 56.37
512 78.94
2048 83.75
4096 65.39

Bien évidemment, le résultat pour un bus à 2 données est erroné (l'IA n'a pas assez d'information pour juger une voix avec seulement 2 données) et affiche donc qu'il recconnaît tout le temps la même voix à 100%.

A part cela, le résultat est croissant, à part pour un bus à 4096, qui doit sûrement être trop grand pour être précis sur ses résultats, ou dont nous n'avons pas laissé assez le temps de réfléchir (moins de 1 évaluation par seconde...).



Lors de la 2eme séance, nous avons réalisé plusieurs tâches:

-Mise en place de la Raspberry Pi 4 (OS + configuration UART)

-Prise en main du capteur de Nucleo-53L5A1

-Réflexion des différents protocoles qui vont être utilisé pour ce projet

- Installation de mosquitto sur la vm

-Nous avons mis en place le point d'accès Wifi sur le Cisco pour la promo connexion sur cet AP avec la raspberry (ping possible depuis la vm)


Concernant la communication entre le capteur et la Raspberry Pi 4, elle se fera en UART car simple à mettre en oeuvre, puis la communication entre la Raspeberry Pi 4 et la Machine Virtuelle se fera via MQTT qui est un protocole de communication utilisé dans les réseaux privés.