« SE5 ECEAI/eceai 2024/2025/benmbarek-elqastalani » : différence entre les versions

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
 
(7 versions intermédiaires par le même utilisateur non affichées)
Ligne 11 : Ligne 11 :
Nous avons créé un serveur virtuel sur capbreton : '''SE5-yelqasta-ybenmbar-IA'''
Nous avons créé un serveur virtuel sur capbreton : '''SE5-yelqasta-ybenmbar-IA'''
- Interface réseau dans le commutateur virtuel '''bridgeStudents'''.
- Interface réseau dans le commutateur virtuel '''bridgeStudents'''.
- IP : 172.26.145.104


Ce serveur sera nous servira de broker MQTT, afin d'analyser et afficher les résultats dynamiquement.
Ce serveur sera nous servira de broker MQTT, afin d'analyser et afficher les résultats dynamiquement.
Ligne 23 : Ligne 24 :
* La Raspberry recevra ces données par UART;
* La Raspberry recevra ces données par UART;


* Enfin, la machine virtuelle les recevra et les affichera.  
* Enfin, la machine virtuelle les recevra et les affichera.
 
=== Réception et envoi de la Raspberry Pi ===
 
La Raspberry Pi lit des données via l'UART et les publie sur le broker MQTT, de la machine virtuelle :
<syntaxhighlight lang="c">
import paho.mqtt.client as mqtt
import serial
import time
 
# Configuration UART
SERIAL_PORT = "/dev/ttyACM0"
 
# Configuration MQTT
BROKER = "172.26.145.104"
PORT = 1883 
TOPIC = "IA/data"
CLIENT_ID = "client"
 
# Connexion MQTT
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connexion au broker MQTT réussie")
    else:
        print(f"Échec de connexion, code retour : {rc}")
 
client = mqtt.Client(CLIENT_ID)
client.on_connect = on_connect
client.connect(BROKER, PORT, 60)
client.loop_start()
 
# Configuration de la liaison série
try:
    ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
    print(f"Ouverture du port série {SERIAL_PORT} à {BAUD_RATE} bauds")
except serial.SerialException as e:
    print(f"Erreur d'ouverture du port série : {e}")
    exit(1)
 
try:
    while True:
        if ser.in_waiting:
            data = ser.readline().decode('utf-8').strip()
            if data:
                print(f"Donnée reçue : {data}")
                client.publish(TOPIC, data)
        time.sleep(0.1)  # Pour éviter une surcharge CPU
except KeyboardInterrupt:
    print("Arrêt du programme")
    ser.close()
    client.disconnect()
</syntaxhighlight>


== Apprentissage ==
== Apprentissage ==
Ligne 73 : Ligne 125 :
Sous la forme d'une ligne, chaque coefficient de la matrice 8*8 est représenté :
Sous la forme d'une ligne, chaque coefficient de la matrice 8*8 est représenté :


[[Fichier:Captaaaa.png|centré|vignette|Distances (matrice 8*8) mesurées|571x571px]]Pour ajouter des données d'entraînement, nous insérons des signaux sur NanoEdge AI. Ces données représentent des mesures réelles capturées par le capteur.
[[Fichier:Captaaaa.png|centré|vignette|Distances (matrice 8*8) mesurées|571x571px]]


Comme nous avons 3 classes, nous allons le faire 3 fois :[[Fichier:Capture d’écran du 2025-01-30 17-34-42.png|centré|571x571px|ù]][[Fichier:Pqspqopsckpoqc.png|centré|571x571px]]
Pour ajouter des données d'entraînement, nous insérons des signaux sur NanoEdge AI. Ces données représentent des mesures réelles capturées par le capteur.
 
Comme nous avons 3 classes, nous allons le faire 3 fois :
 
[[Fichier:Capture d’écran du 2025-01-30 17-34-42.png|centré|571x571px]]
 
Voici un aperçu de la matrice :
 
[[Fichier:Capture d’écran du 2025-01-30 17-54-16.png|centré|571x571px]]
 
Après cela, nous avons pu générer un benchmark, représentatif de l'apprentissage du système :
 
[[Fichier:Qspkpocpqco.png|vignette|centré|571x571px]]
 
 
Notre benchmark indique 83% de fiabilité. Ce n'est pas l'idéal, mais c'est utilisable.
 
L’étape de validation dans NanoEdge AI Studio permet d’évaluer les performances du modèle généré.Pour ce faire, NanoEdge AI Studio compare les résultats du modèle avec les classes attendues et génère un rapport de performance :
 
[[Fichier:Pqspqopsckpoqc.png|centré|571x571px]]


[[Fichier:Pappapappapaa.png|centré|571x571px]]
[[Fichier:Pappapappapaa.png|centré|571x571px]]
Après avoir validé cette étape la librairie .a est alors prête à être exportée et intégrée au nucleo.

Version actuelle datée du 30 janvier 2025 à 17:13

Pour ce TP d'IA, nous avons décidé de concevoir un système qui reconnaîtra des diverses formes.

Formes utilisées


Réseau

Machine Virtuelle

Nous avons créé un serveur virtuel sur capbreton : SE5-yelqasta-ybenmbar-IA - Interface réseau dans le commutateur virtuel bridgeStudents. - IP : 172.26.145.104

Ce serveur sera nous servira de broker MQTT, afin d'analyser et afficher les résultats dynamiquement.

Architecture Réseau

Nous avons prévu cette architecture :

Pppp.png
  • La Nucleo fera les mesures par le biais du capteur ToF;
  • La Raspberry recevra ces données par UART;
  • Enfin, la machine virtuelle les recevra et les affichera.

Réception et envoi de la Raspberry Pi

La Raspberry Pi lit des données via l'UART et les publie sur le broker MQTT, de la machine virtuelle :

import paho.mqtt.client as mqtt
import serial
import time

# Configuration UART
SERIAL_PORT = "/dev/ttyACM0"

# Configuration MQTT
BROKER = "172.26.145.104"
PORT = 1883  
TOPIC = "IA/data"
CLIENT_ID = "client"

# Connexion MQTT
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connexion au broker MQTT réussie")
    else:
        print(f"Échec de connexion, code retour : {rc}")

client = mqtt.Client(CLIENT_ID)
client.on_connect = on_connect
client.connect(BROKER, PORT, 60)
client.loop_start()

# Configuration de la liaison série
try:
    ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
    print(f"Ouverture du port série {SERIAL_PORT} à {BAUD_RATE} bauds")
except serial.SerialException as e:
    print(f"Erreur d'ouverture du port série : {e}")
    exit(1)

try:
    while True:
        if ser.in_waiting:
            data = ser.readline().decode('utf-8').strip()
            if data:
                print(f"Donnée reçue : {data}")
                client.publish(TOPIC, data)
        time.sleep(0.1)  # Pour éviter une surcharge CPU
except KeyboardInterrupt:
    print("Arrêt du programme")
    ser.close()
    client.disconnect()

Apprentissage

Le matériel utilisé :

  • Raspberry Pi 4
  • Nucleo-F401RE
  • Capteur de distance Nucleo-53L5A1


Notre Raspberry communiquera avec la Nucleo par liaison série UART. Elle servira aussi d'interface entre la Nucleo, qui sera entraînée à manipuler les données, et le réseau.

Nous avons mis en place un modèle simple de classification avec 3 classes, correspondant à 3 formes :

  • Coeur
  • Ours
  • Soleil
Conditions de Mesure












Après avoir installé l'API X-CUBE-TOF1, qui nous permettra d'utiliser efficacement le capteur, nous avons pu "mettre en place" les données à envoyer.

Sous la forme d'une ligne, chaque coefficient de la matrice 8*8 est représenté :

Distances (matrice 8*8) mesurées

Pour ajouter des données d'entraînement, nous insérons des signaux sur NanoEdge AI. Ces données représentent des mesures réelles capturées par le capteur.

Comme nous avons 3 classes, nous allons le faire 3 fois :

Capture d’écran du 2025-01-30 17-34-42.png

Voici un aperçu de la matrice :

Capture d’écran du 2025-01-30 17-54-16.png

Après cela, nous avons pu générer un benchmark, représentatif de l'apprentissage du système :

Qspkpocpqco.png


Notre benchmark indique 83% de fiabilité. Ce n'est pas l'idéal, mais c'est utilisable.

L’étape de validation dans NanoEdge AI Studio permet d’évaluer les performances du modèle généré.Pour ce faire, NanoEdge AI Studio compare les résultats du modèle avec les classes attendues et génère un rapport de performance :

Pqspqopsckpoqc.png
Pappapappapaa.png

Après avoir validé cette étape la librairie .a est alors prête à être exportée et intégrée au nucleo.