SE5 ECEAI/eceai 2023/2024/AmorosDelaby

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche

Nous essayons d'implémenter une application qui permet de détecter un mouvement de type "Swipe" vers la gauche, la droite, le haut ou le bas, dans l'objectif de développer une application type Tinder.

Raspberry Pi

- Création d'une image Raspberry Pi OS pour la Raspberry pi 4 et formatage de la carte SD.

- Premier démarrage de la Raspberry PI.

- Communication en série avec la carte grâce à Minicom


Machine virtuelle (serveur) et requêtes MQTT

Serveur

Création d'une VM sur Chassiron pour l’agrégation des données.

Paramètre Valeur
hostname g5amodelVM
ipv6 2001:660:4401:6050:216:3eff:fe40:73d8/64

Capteur X-NUCLEO-53L5A1

Modèle de machine learning

Les jeux de données d'entraînement pour le modèle créés sont les suivants:

- un jeu de données pour lequel rien de se passe pour le capteur (ni mouvement de swipe à gauche, ni à droite)

- un jeu de données pour le swipe à gauche,

- un jeu de données pour le swipe à droite.


Le formatage des données pour que nanoedgestudio puisse les utiliser pour générer un modèle est un mélange du code implémenté dans le capteur et d'un script Python modifiant les fichiers de logs générés par nanoedgestudio pour créer des lignes contenant les données des 16 axes sur une durée de 10 à 16 samples.


Le test du benchmark sur nanoaistudio avec les jeux de données de swipe gauche ou swipe droite n'ont pas donné de résultats concluants lors de l'émulation avec un nouveau jeu de données de test. En revanche, les jeux de données avec aucun mouvement et un mouvement de swipe droit on donné un modèle assez efficace dans la reconnaissance du mouvement.

Le manque d'efficacité d'un modèle peut-être dû notamment aux jeu de données d’entraînement qui n'est pas assez conséquent. Pour obtenir un modèle fiable dans tous les cas, il serait nécessaire d'utiliser des certaines voire des milliers de samples.


Travail restant

- Implémentation du modèle de machine learning sur le capteur NUCLEO-53L5A1 avec STM32CubeIDE

- Récupération de la réponse du modèle de machine learning via la Raspberry


Codes Sources

webserver.py :

from flask import Flask, request, render_template, jsonify
import paho.mqtt.client as mqtt
import random
import os

client_id = f'python-mqtt-{random.randint(0, 1000)}'

IMAGE_DIR = os.path.join('static', 'images')
image_files = [f for f in os.listdir(IMAGE_DIR) if os.path.isfile(os.path.join(IMAGE_DIR, f))]
current_image_index = 0


mqtt_client = mqtt.Client(client_id, userdata=None)#,protocol=mqtt.MQTTv5)
app = Flask(__name__)

broker = '127.0.0.140'
#broker = '2001:660:4401:6050:216:3eff:fe40:73d8'
port = 1883
username = "paul"
password = "pasglop"

messages = []



def on_connect(client,userdata,flags, rc):
	print("Connected with result code " +str(rc))
	client.subscribe("history")

def on_message(client, userdata, msg):
	global current_image_index
	print(msg.topic+"  "+str(msg.payload))
	messages.append(str(msg.payload))
	if msg.payload.decode() == "Right":
        	current_image_index = (current_image_index + 1) % len(image_files)

mqtt_client.on_connect = on_connect
mqtt_client.on_message = on_message
mqtt_client.username_pw_set(username,password)

mqtt_client.connect(broker,port)
print("MQTT client connected successfuly !")


@app.route("/home")  # this sets the route to this page
def home():
	return "Hello! this is the main page <h1>HELLO</h1>"

@app.route("/")
def index():
	return render_template('index.html')

@app.route("/get_messages")
def get_messages():
	return jsonify(messages)

@app.route('/current_index')
def current_index():
	global current_image_index
	return jsonify(current_image_index)

@app.route('/current_image')
def current_image():
	global current_image_index
	image_path = os.path.join('static', 'images', image_files[current_image_index])
	return jsonify({'image_url': image_path})

if __name__ == "__main__":
	mqtt_client.loop_start()
	app.run(host="0.0.0.0",debug=True)


index.html :

<!DOCTYPE html>
<html>
<head>
	<title>MQTT Messages</title>
	<script>
		function fetchMessages(){
		fetch('/get_messages')
			.then(response => response.json())
			.then(data => {document.getElementById('messages').innerHTML = data.join('<br>');
			if (data.includes("Right")) {
                    		updateCarouselImage();
                	}
		})
		.catch(error => {
                console.error('Error fetching messages:', error);
		});
		}

		function updateCarouselImage() {
        	fetch('/current_image')
            		.then(response => response.json())
            		.then(data => {
                			document.getElementById('carousel-image').src = data.image_url;
            		console.log('Updated Carousel');
})
            		.catch(error => {
                	console.error('Error fetching current image:', error);
            });
    }

		setInterval(fetchMessages, 1000);
		setInterval(updateCarouselImage, 1000);
	</script>
</head>
<body>
	<h1>TINDER</h1>
	<div id="carousel-images">
    		<img id="carousel-image" src="static/images/img1.jpg" alt="Carousel Image">
	</div>
	
	<h1>MQTT Messages</h1>
	<div id="messages"></div>
</body>
</html>


File Structure :

`-- website
    |-- static
    |   |-- images
    |   |   |-- img1.jpg
    |   |   |-- img2.jpg
    |   |   `-- img3.jpg
    |   `-- index.css
    |-- templates
    |   `-- index.html
    `-- webserver.py


raspberry script :

import paho.mqtt.client as paho
from datetime import datetime

username = "pifou"
password = "pasglop"
server_address = "2001:660:4401:6050:216:3eff:fe40:73d8"
mqtt_hostname = "G5_RPI4"

print("Connecting to MQTT server")

client = paho.Client(client_id="", userdata=None, protocol=paho.MQTTv5)

#client.tls_set(tls_version=mqtt.client.ssl.PROTOCOL_TLS)

client.username_pw_set(username,password)

client.connect(server_address, 1883)

print("Connection to MQTT server successfully established !")

now = datetime.now()
dt_string = now.strftime("%d/%m/%Y %H:%M:%S")

client.publish("history", payload= mqtt_hostname+" "+dt_string, qos=1)

print("Mqtt message sent, exiting")