SE5 ECEAI/eceai 2024/2025/benmbarek-elqastalani
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.