« SE5 ECEAI 2024/2025/elhasnaoui-chaouni » : différence entre les versions

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche
 
(21 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
=<div class="mcwiki-header" style="padding: 10px; font-family: 'Times New Roman' ; font-weight: bold; color: #0000FF; text-align: center; font-size: 100%; background: #808080; vertical-align: top; height:70%; width: 98%;"> Introduction </div>=
=<div class="mcwiki-header" style="padding: 10px; font-family: 'Times New Roman' ; font-weight: bold; color: #FFFFFF; text-align: center; font-size: 100%; background: #808080; vertical-align: top; height:70%; width: 98%;"> Introduction </div>=
==Objectifs du projet==
==Objectifs du projet==
Séance 1 (03/09) :  Lors de la première séance, nous avons entamé une réflexion sur les différentes idées de projets que nous pourrions développer en utilisant notre carte STM32, pour explorer les possibilités offertes par la carte, en considérant des applications potentielles dans divers domaines, tels que l'automatisation, la reconnaissance de formes ou le contrôle intelligent de systèmes. Ces premières discussions nous ont permis de poser les bases de projets innovants, alignés sur nos objectifs d'apprentissage et les capacités techniques de la STM32.
Séance 1 (03/09) :  Lors de la première séance, nous avons entamé une réflexion sur les différentes idées de projets que nous pourrions développer en utilisant notre carte STM32, pour explorer les possibilités offertes par la carte, en considérant des applications potentielles dans divers domaines, tels que l'automatisation, la reconnaissance de formes ou le contrôle intelligent de systèmes. Ces premières discussions nous ont permis de poser les bases de projets innovants, alignés sur nos objectifs d'apprentissage et les capacités techniques de la STM32.
Ligne 5 : Ligne 5 :
Par ailleurs, nous avons également configuré notre environnement de travail en installant les logiciels nécessaires, à savoir NanoEdge AI et STM32, afin de pouvoir commencer le développement de nos projets de manière efficace.
Par ailleurs, nous avons également configuré notre environnement de travail en installant les logiciels nécessaires, à savoir NanoEdge AI et STM32, afin de pouvoir commencer le développement de nos projets de manière efficace.


=<div class="mcwiki-header" style="padding: 10px; font-family: 'Times New Roman' ; font-weight: bold; color: #0000FF; text-align: center; font-size: 100%; background: #808080; vertical-align: top; height:70%; width: 98%;"> Configuration Réseau </div>=
=<div class="mcwiki-header" style="padding: 10px; font-family: 'Times New Roman' ; font-weight: bold; color: #FFFFFF; text-align: center; font-size: 100%; background: #808080; vertical-align: top; height:70%; width: 98%;"> Configuration Réseau </div>=
==Configuration serveur Cloud==
==Configuration serveur Cloud==


Ligne 33 : Ligne 33 :
</syntaxhighlight>
</syntaxhighlight>


==Configuration Gateway Raspberry Pi==
==Configuration Microcontrôleur SMT32==
==Configuration Microcontrôleur SMT32==


=<div class="mcwiki-header" style="padding: 10px; font-family: 'Times New Roman' ; font-weight: bold; color: #0000FF; text-align: center; font-size: 100%; background: #808080; vertical-align: top; height:70%; width: 98%;"> Communication des objets </div>=
=<div class="mcwiki-header" style="padding: 10px; font-family: 'Times New Roman' ; font-weight: bold; color: #FFFFFF; text-align: center; font-size: 100%; background: #808080; vertical-align: top; height:70%; width: 98%;"> Communication des objets </div>=
==Communication RaspberryPi & Serveur Cloud ==
==Communication RaspberryPi & Serveur Cloud ==


La communication entre la Raspberry Pi et le serveur Cloud se fait en utilisant le protocole MQTT. Le serveur Cloud est une machine virtuelle (VM) dans le même sous-réseau que la Raspberry Pi. Nous avons configuré le serveur MQTT Mosquitto en utilisant un Dockerfile pour créer et déployer le conteneur Docker sur le serveur Cloud. Nous avons également développé deux scripts Python pour gérer la communication : '''subscriber.py''' pour le serveur Cloud et '''publisher.py''' pour la Raspberry Pi.
La communication entre la Raspberry Pi et le serveur Cloud se fait en utilisant le protocole '''MQTT'''. Le serveur Cloud est une machine virtuelle (VM) dans le même sous-réseau que la Raspberry Pi. Nous avons configuré le serveur '''MQTT''' en utilisant un '''Dockerfile''' pour créer et déployer le '''conteneur Docker''' sur le serveur Cloud. Nous avons également développé deux scripts Python pour gérer la communication : '''subscriber.py''' pour le serveur Cloud et '''publisher.py''' pour la Raspberry Pi.


===Déploiement du Serveur MQTT Mosquitto :===
===Déploiement du Serveur MQTT===
Nous avons créé un Dockerfile pour configurer Mosquitto.<syntaxhighlight lang="bash">
Nous avons créé un Dockerfile pour configurer Mosquitto.<syntaxhighlight lang="bash">
  # Utiliser l'image de base de Mosquitto
# Utiliser l'image de base de Mosquitto
  FROM eclipse-mosquitto:latest
FROM eclipse-mosquitto:latest
  # Fichier de configuration  
# Fichier de configuration  
  COPY mosquitto.conf /mosquitto/config/mosquitto.conf
COPY mosquitto.conf /mosquitto/config/mosquitto.conf
  # Exposer le port 1883 pour MQTT
# Exposer le port 1883 pour MQTT
  EXPOSE 1883  
EXPOSE 1883  
  EXPOSE 9001
EXPOSE 9001
   </syntaxhighlight>
   </syntaxhighlight>


Nous avons construit l'image Docker à partir du Dockerfile avec la commande suivante :<syntaxhighlight lang="bash">
Nous avons construit l'image Docker à partir du Dockerfile avec la commande suivante :<syntaxhighlight lang="bash">
  docker build -t mosquitto-mqtt .
docker build -t mosquitto-mqtt .
   </syntaxhighlight>Puis, nous avons lancé le conteneur Mosquitto avec la commande :<syntaxhighlight lang="bash">
   </syntaxhighlight>Puis, nous avons lancé le conteneur Mosquitto avec la commande :<syntaxhighlight lang="bash">
  docker run -d --name mosquitto -p 1883:1883 -p 9001:9001 mosquitto-mqtt
docker run -d --name mosquitto -p 1883:1883 -p 9001:9001 mosquitto-mqtt
   </syntaxhighlight>Cette commande démarre Mosquitto en arrière-plan (-d) et mappe le port '''1883''' du conteneur au port '''1883''' de l'hôte (RasberryPI), qui est le port par défaut utilisé par '''MQTT'''.
   </syntaxhighlight>Cette commande démarre Mosquitto en arrière-plan (-d) et mappe le port '''1883''' du conteneur au port '''1883''' de l'hôte (RasberryPI), qui est le port par défaut utilisé par '''MQTT'''.
=== REST-API Flask ===
Nous avons développé un serveur HTTP avec Flask pour récupérer et afficher les données reçues via MQTT. Ce serveur permet à la Raspberry Pi de communiquer avec le serveur Cloud en temps réel, affichant les messages publiés sous une forme interactive. L'interface utilisateur de Flask permet de visualiser facilement les informations, facilitant ainsi la surveillance et l'analyse des données.<syntaxhighlight lang="python3">
from flask import Flask, render_template
from flask_socketio import SocketIO
import paho.mqtt.client as mqtt
app = Flask(__name__)
socketio = SocketIO(app)
# MQTT configuration, BROKER : Serveur MQTT (RaspberryPi)
mqtt_broker = 'IP_ADDRESS_RASPBERRYPI'
# TOPIC : Messages queue
mqtt_topic = 'default/topic'
# Callback when a message is received from MQTT
def on_message(client, userdata, message):
    msg = message.payload.decode()
    print(f'Received message: {msg} on topic {message.topic}')
    socketio.emit('mqtt_message', {'message': msg, 'topic': message.topic})
mqtt_client = mqtt.Client()
mqtt_client.on_message = on_message
mqtt_client.connect(mqtt_broker)
mqtt_client.subscribe(mqtt_topic)
mqtt_client.loop_start()
# The index.html file contains the page HTML to show the data received over MQTT
# We have only one ENDPOIT (Route) GET / : Returns the html page
# To access the page go to : https://VM_IP:5000
@app.route('/')
def index():
    return render_template('index.html')
if __name__ == '__main__':
    socketio.run(app, debug=True)
</syntaxhighlight>


==Communication STM32 & RaspberryPi==
==Communication STM32 & RaspberryPi==
La Raspberry Pi recevra les données envoyées par le STM32 via le port série. Ensuite, la Raspberry Pi servira de broker MQTT, transmettant ces données au serveur Cloud pour un traitement et affichage. Cette configuration permet de centraliser les données collectées par le STM32 et de les envoyer de manière sécurisée et efficace vers le Cloud (Machine virtuelle) via MQTT.
= <div class="mcwiki-header" style="padding: 10px; font-family: 'Times New Roman' ; font-weight: bold; color: #FFFFFF; text-align: center; font-size: 100%; background: #808080; vertical-align: top; height:70%; width: 98%;"> Entraînement du modèle d’apprentissage </div>Entraînement sur Microcontrôleur NUCLEO =
L'idée sera de développer un système capable de détecter et de reconnaître les chiffres de 0 à 5, représentés par les positions des doigts de la main.


= <div class="mcwiki-header" style="padding: 10px; font-family: 'Times New Roman' ; font-weight: bold; color: #0000FF; text-align: center; font-size: 100%; background: #808080; vertical-align: top; height:70%; width: 98%;"> Entraînement du modèle d’apprentissage </div> =
Pour cela, nous utilisons la carte '''NUCLEO-F401RE''' associée au capteur de distance '''X-NUCLEO-53L5A1''', ainsi que '''NanoEdge AI Studio''' pour l'entraînement et le déploiement d'un modèle d'apprentissage automatique.
L'idée sera de développer un système capable de détecter et de reconnaître les chiffres de 0 à 5, représentés par les positions des doigts de la main.
Pour cela, nous utilisons la carte <code>NUCLEO-F401RE</code> associée au capteur de distance <code>X-NUCLEO-53L5A1</code>, ainsi que '''NanoEdge AI Studio''' pour l'entraînement et le déploiement d'un modèle d'apprentissage automatique.


Les étapes principales du projet sont :
Les étapes principales du projet sont :


# '''Acquisition des données''' : Nous avons configuré le capteur X-NUCLEO-53L5A1 pour collecter des données sur les distances des doigts, selon différentes configurations de la main correspondant aux chiffres de 0 à 5.
=== '''Collect Dataset''' ===
# '''Prétraitement des données''' : Pour nettoyer et formater les données collectées afin de les rendre compatibles avec NanoEdge AI Studio (en utilisant '''Data Logger''') puis les stocker dans un fichier .bin.
[[Fichier:WhatsApp Image 2025-01-09 at 15.22.17.jpg|vignette|388x388px|Collecte des donnés pour la classe "1"]]
# '''Entraînement du modèle''' : Nous avons utilisé NanoEdge AI Studio pour créer et entraîner un modèle basé sur les données collectées, capable de reconnaître les positions des doigts.
Les chiffres de 0 à 5 ont été associés à des configurations spécifiques des doigts :
# '''Déploiement''' : Intégration du modèle entraîné dans la carte NUCLEO-F401RE et le combiner avec le capteur pour effectuer une détection en temps réel.
{| class="wikitable sortable"
# '''Tests et validation''' : Pour évaluer les performances du système (précision, stabilité...) et ajuster le modèle ou les paramètres du capteur si nécessaire.
|+
!Number
!Position des doigts
!'''Class'''
|-
|0
|Poing fermé. 
|'''Class-0'''
|-
|1
|Seul l'index levé.
|'''Class-1'''
|-
|2
|Index et majeur levés.
|'''Class-2'''
|-
|3
|Index, majeur et annulaire levés.
|'''Class-3'''
|-
|4
|Tous les doigts sauf le pouce levés.
|'''Class-4'''
|-
|5
|Main entièrement ouverte.  
|'''Class-5'''
|}
 
Pour améliorer la précision et la robustesse du modèle, nous avons adopté une stratégie consistant à capturer plusieurs positions de la main pour chaque chiffre.
 
On a collecté 15 lignes de données pour chaque signal (Chiffre) de '''0''' à '''5'''.
 
=== Réalisation de Benchmark ===
[[Fichier:WhatsApp Image 2025-01-09 at 15.46.45.jpg|vignette|393x393px|Score Benchmarks réalisés]]
Nous avons réalisé plusieurs séries de benchmarks en utilisant différents datasets afin de maximiser les performances et la fiabilité de notre modèle. Chaque test a permis d'évaluer l'impact des variations de données sur l'accuracy, la consommation de ressources (RAM et Flash), et le temps d'exécution.
 
Après plusieurs itérations, nous avons obtenu un score final de '''82,84 %''', avec une précision équilibrée de '''86,94 %''' (variation minimale de 83,33 % et maximale de 90,28 %, avec un écart-type de 2,87 %).
 
Ce résultat indique que le modèle est bien optimisé pour reconnaître les différentes configurations de doigts tout en restant adapté aux contraintes matérielles, avec une utilisation de '''29,9 KB de RAM''' et '''62 KB de Flash''', et un temps d'exécution de seulement '''11,4 ms''' sur un microcontrôleur STM32F411 cadencé à '''84 MHz'''.
 
=== Validation du Modèle ===
Pour valider le modèle, une phase de test en temps réel a été mise en place. Les données étaient collectées en continu à partir du capteur '''X-NUCLEO-53L5A1''', et chaque configuration de main (chiffres de 0 à 5) était analysée par le modèle embarqué sur la carte '''NUCLEO-F401RE'''. Les prédictions générées par le modèle étaient affichées instantanément sur un terminal série, permettant de visualiser en temps réel le chiffre détecté.
 
Cette étape a permis de vérifier la robustesse du modèle dans des conditions réelles. Nous avons évalué sa capacité à prédire avec précision les chiffres malgré des variations d'angles, de distances ou d’éclairage. Les résultats ont confirmé que le modèle pouvait maintenir une précision élevée et une réactivité satisfaisante, validant ainsi son utilisation pour l’application embarquée.
[[Fichier:WhatsApp Video 2025-01-09 at 16.22.02.mp4|vignette|Démonstration validation du modèle|centré|0x0px]]
=== Déploiement du modèle ===
[...]
[[Fichier:Capture d’écran 2025-01-10 à 22.56.28.png|alt=Visualisation du modèle|vignette|408x408px|Visualisation du modèle]]
 
=== Visualisation ===
Nous visualisons les résultats du modèle d'IA en temps réel grâce à la communication '''MQTT'''. Cette visualisation permet de suivre l’efficacité du modèle, d’évaluer les performances et de détecter d’éventuelles anomalies dans les configurations de main, garantissant ainsi une interface utilisateur claire et dynamique.


==Entraînement sur serveur Cloud==
Les données sont envoyées dans le topic '''default/topic.'''
[[Fichier:Enregistrement de l’écran 2025-01-10 à 22.59.22.mov|alt=Visualisation du Modèle - Video Démonstration|vignette|Visualisation du Modèle - Video Démonstration|centré]]

Version actuelle datée du 11 janvier 2025 à 13:13

Introduction

Objectifs du projet

Séance 1 (03/09) : Lors de la première séance, nous avons entamé une réflexion sur les différentes idées de projets que nous pourrions développer en utilisant notre carte STM32, pour explorer les possibilités offertes par la carte, en considérant des applications potentielles dans divers domaines, tels que l'automatisation, la reconnaissance de formes ou le contrôle intelligent de systèmes. Ces premières discussions nous ont permis de poser les bases de projets innovants, alignés sur nos objectifs d'apprentissage et les capacités techniques de la STM32.

Par ailleurs, nous avons également configuré notre environnement de travail en installant les logiciels nécessaires, à savoir NanoEdge AI et STM32, afin de pouvoir commencer le développement de nos projets de manière efficace.

Configuration Réseau

Configuration serveur Cloud

Nous allons créer une machine virtuelle sur Capbreton avec un accès internet IPv6.
Cette machine virtuelle sera déployée grâce à Xen (Hyperviseur) et portera le nom "SE5-elhaschaouni".
La commande lancée pour créer cette machine est la suivante :

xen-create-image --hostname SE5-elhaschaouni --force --dist bookworm --size 10G --memory 1G --dir /usr/local/xen --dhcp --bridge bridgeStudents

Configuration Réseau

Nous devrons ensuite configurer son réseau, sa résolution DNS, et ses sources de paquets Debian.
Pour configurer le réseau de notre machine, nous allons modifier le fichier /etc/network/interfaces qui est un fichier de configuration réseau où sont spécifiés les paramètres de l'interface.

auto eth0
iface eth0 inet6 auto

Configuration DNS

Pour configurer la résolution DNS de notre machine, nous allons modifier le fichier /etc/resolv.conf. Ce fichier permet de spécifier la configuration des serveurs de nom (DNS) afin de résoudre les noms de domaine en adresses IP. Voici la configuration DNS à appliquer :

domain plil.info
search plil.info
nameserver 2a01:c916:2047:c800:216:3eff:fe82:8a5c

Configuration Microcontrôleur SMT32

Communication des objets

Communication RaspberryPi & Serveur Cloud

La communication entre la Raspberry Pi et le serveur Cloud se fait en utilisant le protocole MQTT. Le serveur Cloud est une machine virtuelle (VM) dans le même sous-réseau que la Raspberry Pi. Nous avons configuré le serveur MQTT en utilisant un Dockerfile pour créer et déployer le conteneur Docker sur le serveur Cloud. Nous avons également développé deux scripts Python pour gérer la communication : subscriber.py pour le serveur Cloud et publisher.py pour la Raspberry Pi.

Déploiement du Serveur MQTT

Nous avons créé un Dockerfile pour configurer Mosquitto.

# Utiliser l'image de base de Mosquitto
FROM eclipse-mosquitto:latest
# Fichier de configuration 
COPY mosquitto.conf /mosquitto/config/mosquitto.conf
# Exposer le port 1883 pour MQTT
EXPOSE 1883 
EXPOSE 9001

Nous avons construit l'image Docker à partir du Dockerfile avec la commande suivante :

docker build -t mosquitto-mqtt .

Puis, nous avons lancé le conteneur Mosquitto avec la commande :

docker run -d --name mosquitto -p 1883:1883 -p 9001:9001 mosquitto-mqtt

Cette commande démarre Mosquitto en arrière-plan (-d) et mappe le port 1883 du conteneur au port 1883 de l'hôte (RasberryPI), qui est le port par défaut utilisé par MQTT.

REST-API Flask

Nous avons développé un serveur HTTP avec Flask pour récupérer et afficher les données reçues via MQTT. Ce serveur permet à la Raspberry Pi de communiquer avec le serveur Cloud en temps réel, affichant les messages publiés sous une forme interactive. L'interface utilisateur de Flask permet de visualiser facilement les informations, facilitant ainsi la surveillance et l'analyse des données.

from flask import Flask, render_template
from flask_socketio import SocketIO
import paho.mqtt.client as mqtt

app = Flask(__name__)
socketio = SocketIO(app)

# MQTT configuration, BROKER : Serveur MQTT (RaspberryPi)
mqtt_broker = 'IP_ADDRESS_RASPBERRYPI'
# TOPIC : Messages queue
mqtt_topic = 'default/topic'

# Callback when a message is received from MQTT
def on_message(client, userdata, message):
    msg = message.payload.decode()
    print(f'Received message: {msg} on topic {message.topic}')
    socketio.emit('mqtt_message', {'message': msg, 'topic': message.topic})

mqtt_client = mqtt.Client()
mqtt_client.on_message = on_message
mqtt_client.connect(mqtt_broker)
mqtt_client.subscribe(mqtt_topic)
mqtt_client.loop_start()

# The index.html file contains the page HTML to show the data received over MQTT
# We have only one ENDPOIT (Route) GET / : Returns the html page
# To access the page go to : https://VM_IP:5000 
@app.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    socketio.run(app, debug=True)

Communication STM32 & RaspberryPi

La Raspberry Pi recevra les données envoyées par le STM32 via le port série. Ensuite, la Raspberry Pi servira de broker MQTT, transmettant ces données au serveur Cloud pour un traitement et affichage. Cette configuration permet de centraliser les données collectées par le STM32 et de les envoyer de manière sécurisée et efficace vers le Cloud (Machine virtuelle) via MQTT.

Entraînement du modèle d’apprentissage
Entraînement sur Microcontrôleur NUCLEO

L'idée sera de développer un système capable de détecter et de reconnaître les chiffres de 0 à 5, représentés par les positions des doigts de la main.

Pour cela, nous utilisons la carte NUCLEO-F401RE associée au capteur de distance X-NUCLEO-53L5A1, ainsi que NanoEdge AI Studio pour l'entraînement et le déploiement d'un modèle d'apprentissage automatique.

Les étapes principales du projet sont :

Collect Dataset

Collecte des donnés pour la classe "1"

Les chiffres de 0 à 5 ont été associés à des configurations spécifiques des doigts :

Number Position des doigts Class
0 Poing fermé. Class-0
1 Seul l'index levé. Class-1
2 Index et majeur levés. Class-2
3 Index, majeur et annulaire levés. Class-3
4 Tous les doigts sauf le pouce levés. Class-4
5 Main entièrement ouverte. Class-5

Pour améliorer la précision et la robustesse du modèle, nous avons adopté une stratégie consistant à capturer plusieurs positions de la main pour chaque chiffre.

On a collecté 15 lignes de données pour chaque signal (Chiffre) de 0 à 5.

Réalisation de Benchmark

Score Benchmarks réalisés

Nous avons réalisé plusieurs séries de benchmarks en utilisant différents datasets afin de maximiser les performances et la fiabilité de notre modèle. Chaque test a permis d'évaluer l'impact des variations de données sur l'accuracy, la consommation de ressources (RAM et Flash), et le temps d'exécution.

Après plusieurs itérations, nous avons obtenu un score final de 82,84 %, avec une précision équilibrée de 86,94 % (variation minimale de 83,33 % et maximale de 90,28 %, avec un écart-type de 2,87 %).

Ce résultat indique que le modèle est bien optimisé pour reconnaître les différentes configurations de doigts tout en restant adapté aux contraintes matérielles, avec une utilisation de 29,9 KB de RAM et 62 KB de Flash, et un temps d'exécution de seulement 11,4 ms sur un microcontrôleur STM32F411 cadencé à 84 MHz.

Validation du Modèle

Pour valider le modèle, une phase de test en temps réel a été mise en place. Les données étaient collectées en continu à partir du capteur X-NUCLEO-53L5A1, et chaque configuration de main (chiffres de 0 à 5) était analysée par le modèle embarqué sur la carte NUCLEO-F401RE. Les prédictions générées par le modèle étaient affichées instantanément sur un terminal série, permettant de visualiser en temps réel le chiffre détecté.

Cette étape a permis de vérifier la robustesse du modèle dans des conditions réelles. Nous avons évalué sa capacité à prédire avec précision les chiffres malgré des variations d'angles, de distances ou d’éclairage. Les résultats ont confirmé que le modèle pouvait maintenir une précision élevée et une réactivité satisfaisante, validant ainsi son utilisation pour l’application embarquée.

Déploiement du modèle

[...]

Visualisation du modèle
Visualisation du modèle

Visualisation

Nous visualisons les résultats du modèle d'IA en temps réel grâce à la communication MQTT. Cette visualisation permet de suivre l’efficacité du modèle, d’évaluer les performances et de détecter d’éventuelles anomalies dans les configurations de main, garantissant ainsi une interface utilisateur claire et dynamique.

Les données sont envoyées dans le topic default/topic.