« 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
 
(34 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
'''Le 03/09/2024 :'''
Pour ce TP d'IA, nous avons décidé de concevoir un système qui reconnaîtra des diverses formes.


- Recherche du sujet
[[Fichier:2025013063924.jpg|centré|vignette|Formes utilisées]]


- Installation des logiciels


'''Le 05/09/2024 :''' Nous avons décidé de concevoir un système qui déterminera dans un premier temps la pression dans une balle en chute libre, puis, si on avance bien, prédire la hauteur du deuxième rebond.
== Réseau ==


Voici la démarche à laquelle nous avons pensé :
[[Fichier:Schema ia1.png|800px|center|Schéma]]


Avec quelques entrainements, nous pourrons calculer la pression.
=== 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 :
<div style="flex:1; padding-left:10px;">[[Fichier:Pppp.png|vignette|centré|571x571px]]</div>
 
* 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 :
<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 ==
 


Le matériel utilisé :
Le matériel utilisé :
Ligne 18 : Ligne 86 :
* Nucleo-F401RE
* Nucleo-F401RE


* Capteur de distance Nucleo-53L5A1
* Capteur de distance Nucleo-53L5A1  


* Accéléromètre (pas pour le moment) (mettre reference)


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.
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.


Lors de cette première séance, nous avons aussi configuré l'OS de la Raspberry ainsi que sa connexion à la borne Wi-Fi de la salle.
Nous avons mis en place un modèle simple de classification avec 3 classes, correspondant à 3 formes :
 
* Coeur
 
* Ours
 
* Soleil
[[Fichier:274314.jpg|gauche|vignette|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é :
 
[[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.  


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]]


Nous avons besoin //
Notre première approche est de proposer un modèle simple de classification.


// La communication entre l'accéléromètre et la nucleo se fait en I2C.
Notre benchmark indique 83% de fiabilité. Ce n'est pas l'idéal, mais c'est utilisable.


// Possible Challenges:  
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 :


// The trajectory of the falling object will almost always be non linear, which introduces new parameters to the equation.
[[Fichier:Pqspqopsckpoqc.png|centré|571x571px]]


// Need to take in account the weight of the object, the size, the rebound behaviour (ricochet). (Probably need a soft surface in order not to damage the object).
[[Fichier:Pappapappapaa.png|centré|571x571px]]


// The length of the connection could probably affect the communication ? Would it be possible to store the experience data then feed the model, or should it be real time ?
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.