FBCSP est une méthode populaire de classification d'imagerie motrice (Motor Imagery : MI) à classes multiples, à partir de signaux EEG et est généralement utilisé dans des applications d'interface cerveau ordinateur (ICO).
Au fil des ans, le FBCSP a été largement déployé ou évalué pour la classification de deux ou plusieurs classes de MI. La boîte à outils que nous allons vous présenter fournit les outils et les méthodes pour utiliser le FBCSP sur les données EEG. Des exemples sont également fournis pour démontrer l'utilisation de cette boîte à outils.
Un lien vers la base du code est disponible à cette adresse : https://github.com/fbcsptoolbox/fbcsp_code .Un fichier yml contenant les exigences d'environnement pour l'exécution de cette boîte à outils est également inclus avec le code.
Les données doivent être au format original GDF ou au format mat.
Le FBCSP s'appuie sur le machine learning pour classifier les données. Il fonctionne en 4 étapes résumées sur ce schéma et détaillées ci-dessous:
Les mesures EEG sont filtrées par un filtre passe-bande en de multiple bandes de fréquences.
On extrait les caractéristiques CSP de chacune des bandes de fréquences.
Un algorithme de sélection des caractéristiques est utilisé pour sélectionner automatiquement les paires discriminantes de bandes de fréquences et les caractéristiques CSP correspondantes.
Un algorithme de classification est utilisé pour classifier les caractéristiques CSP.
Le code source du FBCSP toolbox est téléchargeable directement sur la page Github dédiée.
Pour l'installer, il suffit de placer l'ensemble des fichiers .py dans la racine du projet. Il existe un tutoriel consultable sur le site de FBCSP toolbox montrant comment utiliser les différentes classes afin de classifier un signal EEG issu du dataset BCI Competition 2008 2a.
Cependant, ce tutoriel indique comment l'exploiter à l'intérieur des classes existantes. Nous verrons ici comment utiliser ces fonctionnalités dans un programme externe afin, par exemple, de le lier à d'autres applications ou d'autres méthodes de classification.
Pour la suite, nous supposerons que les données d'entraînement ont déjà été chargées dans une instance de la classe Epochs nommée train_data.
Cette étape consiste à récupérer les données et à les formater afin de pouvoir entraîner ultérieurement la Filter Bank Common Spatial Patterns.
Le code suivant permet d'obtenir les données sous un format correct :
data = train_data.get_data() * 1e6 sample_frequency = 250 eeg_data = {'x_data': data, 'y_labels': train_labels, fs : 'sample_frequency'}
Maintenant que les données sont formatées, elles doivent être filtrées convenablement.
Il suffit pour cela d'utiliser le code suivant :
fbank = FilterBank(eeg_data.get('fs')) X_train = fbank.filter_data(eeg_data.get('x_data'), {'tmin': 0.5, 'tmax': 2.5}) y_train = eeg_data.get('y_labels')
On remarque qu'on instancie la classe FilterBank fournie par la FBCSP toolbox. Celle-ci va permettre de filtrer les données grâce à sa méthode filter_data. Les arguments tmin et tmax définissent la fenêtre, en secondes, qui sera conservée dans le signal après filtrage.
Maintenant que les données sont filtrées, nous allons pouvoir entraîner le filtre FBCSP grâce à ces données.
Pour cela il suffit, à la manière d'une IA classique, de faire appel à la méthode fit() d'un objet FBCSP :
m_filters = 2 fbcsp_train = FBCSP(m_filters) fbcsp_train.fit(X_train, y_train)
On observe ici que les données précédemment filtrées sont utilisées pour entraîner le FBCSP avec un nombre de filtres CSP m_filters égal à 2. Il est bien sûr possible de modifier cette valeur.
Enfin, après avoir entraîné le FBCSP, nous allons pouvoir l'utiliser pour filtrer des données EEG.
A ces fins, nous devons simplement utiliser la méthode transform() de notre objet CSP de la manière suivante :
filtered_data_with_fbcsp = fbcsp_train.transform(X,class_idx=cls_of_interest)
On remarque particulièrement le second argument de transform(). Par défaut, sa valeur est de 0. Il permet de spécifier une classe qui sera considérée pour le filtrage.
Ceci peut être utile notamment pour l'utilisation d'une SVR car on effectuera autant de classifications par essai qu'il y a de classes dans le problème que l'on cherche à résoudre.