« SE5 ECEAI/eceai 2024/2025/benmbarek-elqastalani » : différence entre les versions
Aucun résumé des modifications |
|||
(15 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 46 : | Ligne 98 : | ||
* Soleil | * 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. | 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. | ||
Ligne 51 : | 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) | [[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]] | |||
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| | [[Fichier:Pqspqopsckpoqc.png|centré|571x571px]] | ||
[[Fichier:Pappapappapaa.png| | [[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.
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 :
- 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
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é :
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 :
Voici un aperçu de la matrice :
Après cela, nous avons pu générer un benchmark, représentatif de l'apprentissage du système :
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 :
Après avoir validé cette étape la librairie .a est alors prête à être exportée et intégrée au nucleo.