Projet

Général

Profil

Arthur Tetaz

Plan général - J1
Le but est de reprendre le projet Robot_Go_West. Pour cela, nous nous focaliserons sur ces différentes étapes :

1- Capter les signaux

Grâce au capteur Vegetal Signal, nous allons utiliser 4 capteurs pour une plante qui serait au soleil et 4 capteurs pour une plante qui serait à l'ombre (ou bien carrément prendre 4 plantes et mettre 2 capteurs sur chacune). Au début, nous préférons simplifier les choses en faisant l'expérience avec du soleil en extérieur et mettre une plante dans une boîte pour la priver du soleil.

2- Visualiser les signaux en temps réel

Cette étape est pédagogique. Nous pouvons utiliser le logiciel Chataigne pour visualiser en temps réel les signaux des plantes.

3- Traiter les signaux

Il faut séparer cette étape en deux : d'abord acquérir les signaux des plantes puis les traiter ensuite. Nous avons vu en premier lieu les données de Quentin Perret, mais il semble à ce jour qu'il y a un problème avec la transformée de Fourier (TDF) car elle affiche seulement un pic à 0.

4- Entraîner les données

Tout d'abord, il faut réfléchir à l'architecture du modèle d'IA qui serait le plus adapté (modèle U-Net, random forest ou bien des réseaux de convolution type CNN). Ensuite choisir le bon framework entre PyTorch, Keras et TersorFlow (même si nous sommes plus partis sur PyTorch pour son aspect open source). Enfin, analyser le signal en Deeplearning. C'est-à-dire quelles méthodes peut-on utiliser et quelles sont les pipeline qui sont utilisées.

Note : ne pas oublier l'étape de normalisation dans le traitement.

5- Faire bouger le robot

Puisque le robot chenille n'est pas fonctionnel pour le moment, il faut d'abord se focaliser sur le robot axial, qui fait tourner le pot sur un seul axe. Pour ensuite, pourquoi pas, utiliser un plateau roulant ou un robot avec roue holonome (qu'on emprunterait à Rhoban) à utiliser en extérieur ou dans le Fablab.

6- Faire une interface utilisateur

Pour finaliser le projet et le présenter.

Au vu de mes 2 mois de stage, je me préoccuperais en particulier du traitement du signal ainsi que l'entraînement des données.

J2

Nous avons rencontrés un problème avec Jhodi et Ludovic pour récupérer les signaux enregistrés par le capteur vegetal signals. Il semblerait y avoir un soucis avec la carte SD car rien ne s'affiche après l'enregistrement des signaux. Nous avons d'abord pensé aux 20 minutes après la pose des capteurs, qui représente la période d'adaptation à la plante suite à l'implantation des capteurs, et qui représente donc une période de mesure inutilisable. Mais après avoir attendu presque 1h, le résultat est le même; pas d'enregistrement dans la carte SD.

Pour de ce qui est de la partie d'entraînement des données, je commence à me familiariser avec la consctruction d'un réseau de neurone convolutif. En me basant sur le code de cet article, et en utilisant des données plus concrètes trouvées sur kaggle plutôt que les données aléatoires créées dans la partie training de l'article, j'essaie de comprendre comment ces modèles fonctionnent pour ensuite les utiliser sur les données récoltés des plantes (afin de savoir si le modèle repère si les plantes sont à l'ombre ou bien au soleil).

J3

Télétravail, même boulot que J2 sur la création d'un réseau de neurone convolutif.

J4

Je dois faire une biblio de tous les articles regardés (en commençant par l'article de com racinaire, puis les articles utilisés pour le réseau de neurone).

Détails pour les données EEG-Data de kaggle :
  • O et Z = set A et B, respectivement les mesures yeux ouverts et jeux fermés pour des individus neurotypiques
  • F et N = set C et D, respectivement les mesures des zones épileptogènes pendant une période sans crise et prélevées dans l'hippocampe de l’hémisphère opposé chez les patients épileptiques
  • S = set E, mesures d'une crise épileptique chez les patients épileptiques.

Je pense partir sur des bibliothèques Python que j'ai déjà vu telles que Keras et TensorFlow. Nous étions partis de base sur PyTorch, car le gros point fort de cet librairie est qu'elle est open source, mais après avoir mis les mains dans le cambouis je me suis rendu compte que je n'y comprenais pas grand chose. Donc grâce à ce site et à mes connaissances passées en deeplearning avec la fac, je pense utiliser TensorFlow et Keras (qui est intégrée à TensorFlow) pour construire mes réseaux de neurones et entraîner mes modèles sur les données récupérées sur les plantes.

J'ai l'impression de vouloir avancer sans comprendre les notions de base en informatique (programmation orientée objet, construire son environnement virtuel et passer par un venv...)

J5

Aujourd'hui c'était full deeplearning. On a travailler en PyTorch avec Jhodi et on a bien avancé. On a une bonne base de données d'entrainements avec les données kaggle et le script EEGNet. On a notamment repris la partie du script qu'on avait laissé sur la création de données aléatoire pour faire la transformation en tensor. La transformation permet de nettoyer (en enlevant le bruit), de normaliser (mettre tout sur la même échelle) et mettre en forme (adapter le signal à l'architecture).
Nous avons donc créer le modèle, fait la partie training et load (charger les données), mis les data en les mettant dans des listes puis mis les listes dans le même format que celles créées de façon random pour le modèle EEGNet.

Manque plus qu'à les entraîner pour voir si notre modèle construit fonctionne bien pour ensuite l'entraîner sur les données des plantes.

J8

Voici l'article qui a prouvé que les racines de plantes communiquées entre elles : https://www.sciencedirect.com/science/article/abs/pii/S1567539419301914 / DOI : 10.1016/j.bioelechem.2019.05.003 (sinon le pdf entier sur sci-bub).

Aujourd'hui, nous continuons sur la construction du réseau de neurones avec Jhodi. Nous avons rencontré plusieurs problèmes tels que celui ci :

RuntimeError: mat1 and mat2 shapes cannot be multiplied (16x2880 and 3072x5)
En premier lieu nous avons pensé que cette erreur était due à la fonction d'activation utilisée dans les couches denses (hidden layers) du réseau. J'ai donc changé la fonction ELU par Tanh mais rien ne changeait. L'autre possibilité venait de cette ligne dans le script du modèle EEGNet :
self.Dense = nn.Linear(F2*round(signal_length/32), num_class)
J'ai donc changé le premier argument en mettant 2880 (pour avoir la même taille que la matrice attendue), sans changer le deuxième argument (num_class = 5).
Ca fonctionne bien, le modèle s'entraîne ! Avec 50 époques, on obtient ce graphe avec la fonction d'activation Tanh :

Avec 50 époques, on obtient ce graphe avec la fonction d'activation ELU :

Avec les quelques ajustements ci-dessous,

fs= 173                  #sampling frequency
channel= 8               #number of electrode (8 au lieu de 22 dans le script EEGNet et au lieu de 1 que j'avais mis)
num_input= 1             #number of channel picture (for EEG signal is always : 1)
num_class= 5             #number of classes 
signal_length = 512      #number of sample in each tarial (512 au lieu de 200 dans le script EEGNet et au lieu de 4076 que j'avais mis)
on obtient ces résultats :

J9

Télétravail. J'ai commencé à faire la fonction validation pour pouvoir afficher la différence de précision et de perte entre les données d'entraînement et de validation. Comme nous nous sommes basés sur le dataset de base (sans avoir à séparer les données dans des dossiers distincts pour l'entraînement, la validation et le test), je devrais, par la suite, séparer les données en 3 dossiers :
  • 80% entraînement
  • 10% validation
  • 10% test

Ensuite, il faudra faire la matrice de confusion puis, enfin, faire le calcul des scores (précision, recall et F1).

J10

Voici ce que j'obtiens pour la précision du modèle pour l'apprentissage des données :

Et pour la perte :

Avec cette réponse du script :

500
500
torch.Size([500, 1, 8, 512])
train batch size: 16 , num of batch: 32
epoch 0:
 train loss= 1.486, val loss=1.317,train acc= 38%, val acc= 57% 

epoch 5:
 train loss= 1.123, val loss=1.036,train acc= 79%, val acc= 88% 

epoch 10:
 train loss= 1.103, val loss=0.9952,train acc= 82%, val acc= 92% 

epoch 15:
 train loss= 1.064, val loss=0.9632,train acc= 83%, val acc= 94% 

epoch 20:
 train loss= 1.042, val loss=0.9585,train acc= 87%, val acc= 95% 

epoch 25:
 train loss= 1.036, val loss=0.9487,train acc= 86%, val acc= 95% 

epoch 30:
 train loss= 1.017, val loss=0.9464,train acc= 88%, val acc= 95% 

epoch 35:
 train loss= 1.03, val loss=0.9375,train acc= 87%, val acc= 96% 

epoch 40:
 train loss= 1.045, val loss=0.9443,train acc= 86%, val acc= 96% 

epoch 45:
 train loss= 1.027, val loss=0.9347,train acc= 87%, val acc= 97%