- đ Total Perspective Vortex â EEG Brain-Computer Interface (BCI)
- đ Overview
- đ„ TĂ©lĂ©charger le dĂ©pĂŽt
- đ§ Objectifs pĂ©dagogiques (42 / IA / ML)
- đ§© Architecture du projet
- đŹ 1. PrĂ©processing & parsing EEG (MNE)
- đ Visualiser raw vs filtrĂ©
- đ§ Justification scientifique : canaux & fenĂȘtres temporelles
- đïž 2. Extraction de features
- đ§ź 3. RĂ©duction de dimension (PCA, CSP, ICAâŠ)
- đ§ 4. Pipeline scikit-learn
- đ 5. EntraĂźnement
- ⥠6. Prédiction en pseudo temps réel
- đ§Ș Tests & qualitĂ© logicielle
- â Contraintes officielles du sujet
- đ Stack technique
- đ§ Vue dâensemble documentation
- đ Pourquoi cette stack ? © Licence
- đ Ressources utilisĂ©es
- đ€ Auteur
Total Perspective Vortex est un projet de Brain-Computer Interface (BCI) utilisant des donnĂ©es EEG pour dĂ©terminer, en quasi temps rĂ©el, lâintention motrice dâun individu (mouvement A ou B).
Il implémente un pipeline complet :
- đ§ Parsing & preprocessing EEG (MNE, filtres 8â40 Hz)
- đïž Extraction de features (spectre, puissance, canaux Ă temps)
- đ» RĂ©duction de dimension implĂ©mentĂ©e manuellement (CSP, PCA, ICAâŠ)
- đ Pipeline scikit-learn (baseEstimator + transformerMixin)
- đ€ lassification supervisĂ©e
- â±ïž Prediction < 2 secondes (lecture pseudo temps rĂ©el)
- đ Validation croisĂ©e (cross_val_score)
- đ§Ș Accuracy â„ 75 % sur sujets non vus â mĂ©trique obligatoire
Le travail final ne contient que le code Python ; le dataset EEG Physionet nâest pas versionnĂ©.
Cloner le projet depuis GitHub :
git clone https://github.com/raveriss/Total_Perspective_Vortex.git
cd Total_Perspective_Vortex- Concevoir un pipeline ML complet sur données EEG
- Implémenter un algorithme mathématique de réduction de dimension
- Intégrer ce module dans un pipeline scikit-learn
- Traiter un flux temps réel
- Travailler sur un dataset bruité (EEG réel)
- Manipuler MNE, NumPy, Pandas, SciPy, scikit-learn
- Construire des métriques reproductibles et un score fiable
- Préparer une défense solide (norme 42 + compréhension algorithmique)
Total_Perspective_Vortex/
.
âââ AGENTS.md
âââ author
âââ codecov.yml
âââ create_tpv_fields.sh
âââ data
âââ docs
â  âââ assets
â  â  âââ image01.png
â  â  âââ image02.png
â  âââ index.md
â âââ metrics
â â âââ eval_payload.json
â â âââ eval_payload.npz
â  âââ project
â  â  âââ benchmark_results.json
â  â  âââ benchmark_results.md
â  â  âââ checklist_wbs_matrix.md
â  â  âââ gantt_tpv.png
â  â  âââ physionet_dataset.md
â  â  âââ roadmap.md
â  â  âââ splits_metrics.md
â  â  âââ split_strategy.md
â  â  âââ wbs_tpv.md
â  âââ risk
â  â  âââ tpv_murphy_map.csv
â  âââ total_perspective_vortex.en.checklist.pdf
â  âââ Total_Perspective_Vortex.en.subject.pdf
âââ LICENSE
âââ Makefile
âââ mybci.py
âââ poetry.lock
âââ poetry.toml
âââ pyproject.toml
âââ README.md
âââ scripts
â âââ aggregate_accuracy.py
â âââ aggregate_experience_scores.py
â âââ aggregate_scores.py
â âââ benchmark.py
â âââ fetch_physionet.py
â âââ __init__.py
â âââ predict.py
â âââ prepare_physionet.py
â âââ sync_dataset.py
â âââ train.py
â âââ visualize_raw_filtered.py
âââ src
â  âââ tpv
â  âââ classifier.py
â  âââ dimensionality.py
â  âââ features.py
â  âââ __init__.py
â  âââ pipeline.py
â  âââ predict.py
â  âââ preprocessing.py
â âââ __pycache__
â â âââ classifier.cpython-310.pyc
â â âââ dimensionality.cpython-310.pyc
â â âââ features.cpython-310.pyc
â â âââ __init__.cpython-310.pyc
â â âââ pipeline.cpython-310.pyc
â â âââ preprocessing.cpython-310.pyc
â â âââ utils.cpython-310.pyc
â  âââ realtime.py
â  âââ train.py
â  âââ utils.py
âââ tests
âââ test_aggregate_scores_cli.py
âââ test_benchmark.py
âââ test_classifier.py
âââ test_dimensionality.py
âââ test_docs.py
âââ test_experience_scores.py
âââ test_features.py
âââ test_fetch_physionet.py
âââ test_mybci.py
âââ test_pipeline.py
âââ test_predict_cli.py
âââ test_predict_evaluate_run.py
âââ test_predict_load_data.py
âââ test_predict_reports.py
âââ test_prepare_physionet.py
âââ test_preprocessing.py
âââ test_realtime.py
âââ test_scripts_roundtrip.py
âââ test_sync_dataset.py
âââ test_tpv_entrypoints.py
âââ test_train_cli.py
âââ test_train.py
âââ test_utils.py
âââ test_visualize_raw_filtered.py
Le projet utilise Poetry exclusivement (aucun requirements.txt).
Le Makefile expose des raccourcis vers les commandes poetry run ....
| Objectif | Commande recommandée | Commande équivalente |
|---|---|---|
| Installer le projet + dataset | make install |
make install-deps && make download_dataset |
| Installer les dépendances | make install-deps |
poetry install --with dev |
| Télécharger / valider le dataset | make download_dataset |
validation locale puis scripts/download_dataset.py (sources officielles PhysioNet) |
| Linter | make lint |
poetry run ruff check . |
| Formatter | make format |
poetry run ruff format . && poetry run ruff check --fix . |
| Type-check | make type |
poetry run mypy src scripts tests |
| Tests | make test |
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 poetry run pytest -vv |
| Coverage | make cov |
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 poetry run coverage run -m pytest ... |
| Mutation | make mut |
MUTMUT_USE_COVERAGE=1 ... poetry run mutmut run |
| EntraĂźner | make train |
poetry run python mybci.py 109 3 train (par défaut) |
| Prédire | make predict |
poetry run python mybci.py 109 3 predict (par défaut) |
| Temps réel | make realtime <subject> <run> |
poetry run python src/tpv/realtime.py <subject> <run> |
| Visualiser brut/filtré | make visualizer <subject> <run> |
poetry run python scripts/visualize_raw_filtered.py <subject> <run> |
| Moyenne des moyennes | make compute-mean-of-means |
poetry run python scripts/aggregate_experience_scores.py |
| Benchmark global | make mybci |
poetry run python mybci.py |
| Sanitize benchmark / profiling | make sanitizer |
poetry run python scripts/sanitizer.py -- make -j1 mybci wavelet |
| Nettoyer | make clean |
supprime ./artifacts + les *.npy (hors .venv, .git, artifacts) |
L'exécution de make mybci sans arguments déclenche
l'Ă©valuation des 6 expĂ©riences (3 â 14) sur 109 sujets. Pour Ă©viter
les avertissements "aucun modĂšle disponible", assurez-vous que
artifacts/<subject>/<run>/model.joblib existe pour chaque run visé.
L'appel make mybci wavelet relaie la stratégie
--feature-strategy wavelet Ă la CLI globale tout en journalisant la sortie
dans artifacts/benchmarks/bench_YYYYmmdd_HHMMSS.log.
make sanitizer lance scripts/sanitizer.py sur la commande
make -j1 mybci wavelet par défaut et produit un dossier
artifacts/sanitizer/<timestamp>/ contenant :
summary.jsonetsummary.md- un sous-dossier par sonde (
A1.make,A2,F1,P1.make, etc.) - les commandes rejouables,
stdout.log,stderr.loget les artefacts associés (time.csv,time.jsonl,perf.csv,mprof.dat,pyspy.svg...)
Exemples :
make sanitizer
make sanitizer SANITIZER_ARGS='--probe A2 --time-csv-runs 20'
make sanitizer SANITIZER_COMMAND='make -j1 compute-mean-of-means'
make sanitizer SANITIZER_ARGS="--probe F1 --python-command 'python mybci.py --feature-strategy wavelet'"
make sanitizer SANITIZER_ALLOW_PRIVILEGED_TOOLS=1 SANITIZER_ARGS='--probe P1.make --probe P1.poetry --probe P2 --probe P3'
make sanitizer-privileged SANITIZER_ARGS='--probe P1.make --probe P1.poetry --probe P2 --probe P3'Quand une sonde affiche SKIPPED ou WARN, summary.md et la sortie console
incluent désormais des command: structurés :
- commandes d'installation Poetry (
poetry install --with dev) pour les outils Python - commandes systĂšme Ubuntu (
sudo apt-get install ...) pour les binaires hors venv - commandes de fallback ou de re-run ciblé
- commandes privilégiées explicites (
sudo -v, puisSANITIZER_ALLOW_PRIVILEGED_TOOLS=1)
Le mode privilégié reste opt-in. Il est utile sur un poste perso pour
perf, mais n'est pas activé par défaut afin de préserver le comportement
canonique Ubuntu/no-sudo de la CI et des machines 42.
raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make install
poetry install --with dev
Installing dependencies from lock file
No dependencies to install or update
Installing the current project: total-perspective-vortex (0.1.0)
Dataset incomplet: dossier racine manquant (data).
Téléchargement EEGMMIDB PhysioNet (~3.4GB), cela peut prendre du temps...
Source: https://physionet.org/files/eegmmidb/1.0.0/
...
Dataset EEGMMIDB complet et validé dans data.raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make install-deps
poetry install --with dev
Installing dependencies from lock file
No dependencies to install or update
Installing the current project: total-perspective-vortex (0.1.0)raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make download_dataset
Dataset incomplet: dossier racine manquant (data).
Téléchargement EEGMMIDB PhysioNet (~3.4GB), cela peut prendre du temps...
Source: https://physionet.org/files/eegmmidb/1.0.0/
...
Dataset EEGMMIDB complet et validé dans data.Si le dataset est déjà présent et complet, la commande sort immédiatement :
raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make download_dataset
Dataset EEGMMIDB déjà complet dans data (aucun téléchargement).Si la connexion internet est indisponible (DNS/route), la commande échoue avec un diagnostic actionnable :
raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make download_dataset
Dataset incomplet: dossier sujet manquant (data/S001).
â Connexion internet indisponible ou instable: impossible de joindre PhysioNet.
- https://physionet.org/files/eegmmidb/1.0.0/ -> Temporary failure in name resolution
- https://physionet.org/static/published-projects/eegmmidb/1.0.0/ -> Temporary failure in name resolution
Diagnostic local automatique:
- ping -c 1 1.1.1.1 -> code retour 2
stderr: ping: connect: Network is unreachable
- getent hosts physionet.org -> code retour 2
sortie: aucune réponse
Cause probable: la machine n'a plus d'accÚs réseau sortant.
Action: rétablissez la connexion réseau (Wi-Fi, cùble, VPN ou routage), puis relancez make download_dataset.make download_dataset n'utilise plus d'URL configurable dans le Makefile : le script choisit dynamiquement une source officielle PhysioNet parmi les endpoints supportés.
raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make download_dataset
Dataset incomplet: dossier sujet manquant (data/S001).
Téléchargement EEGMMIDB PhysioNet (~3.4GB), cela peut prendre du temps...
Source: https://physionet.org/files/eegmmidb/1.0.0/raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make show-activate
Commande d'activation (a executer dans le shell courant) :
source /home/raveriss/Desktop/Total_Perspective_Vortex/.venv/bin/activate
raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ source /home/raveriss/Desktop/Total_Perspective_Vortex/.venv/bin/activate
(total-perspective-vortex-py3.10) raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$(total-perspective-vortex-py3.10) raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make train 1 4
CV_SPLITS: 10 (scores: 10)
[0.6667 0.6667 0.6667 0.6667 0.3333 0.3333 0.6667 1.0000 0.6667 0.3333]
cross_val_score: 0.6000Entraßner via Makefile avec une stratégie de features :
(total-perspective-vortex-py3.10) raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make train 1 3 wavelet
INFO: dim_method='csp/cssp' appliqué avant l'extraction des features.
[⥠TPV] Extracting wavelet features...
CV_SPLITS: 10 (scores: 10)
[0.6667 0.3333 0.3333 0.6667 1.0000 0.6667 0.6667 0.6667 0.3333 1.0000]
cross_val_score: 0.6333
(total-perspective-vortex-py3.10) raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$(total-perspective-vortex-py3.10) raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make predict 1 3
epoch nb: [prediction] [truth] equal?
epoch 00: [1] [1] True
epoch 01: [0] [0] True
epoch 02: [0] [0] True
...
epoch 14: [0] [0] True
Accuracy: 1.0000(total-perspective-vortex-py3.10) raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make realtime 1 3
realtime prediction window=0 offset=0.000s raw=1 (T2) smoothed=1 (T2) latency=0.000s
realtime prediction window=1 offset=0.500s raw=1 (T2) smoothed=1 (T2) latency=0.000s
realtime prediction window=2 offset=1.000s raw=1 (T2) smoothed=1 (T2) latency=0.000s
...
realtime prediction window=188 offset=94.000s raw=0 (T1) smoothed=0 (T1) latency=0.000s
realtime prediction window=189 offset=94.500s raw=0 (T1) smoothed=0 (T1) latency=0.000s
realtime prediction window=190 offset=95.000s raw=0 (T1) smoothed=0 (T1) latency=0.000s(total-perspective-vortex-py3.10) raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make mybci
experiment 0: subject 001: accuracy = 1.0000
INFO: modĂšle absent pour S002 R03, entraĂźnement automatique en cours...
experiment 0: subject 002: accuracy = 0.6923
...
experiment 5: subject 109: accuracy = 1.0000
Mean accuracy of the six different experiments for all 109 subjects:
experiment 0: accuracy = 0.8894
experiment 1: accuracy = 0.8799
experiment 2: accuracy = 0.9056
experiment 3: accuracy = 0.9013
experiment 4: accuracy = 0.8935
experiment 5: accuracy = 0.8972
Mean accuracy of 6 experiments: 0.8945(total-perspective-vortex-py3.10) raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make mybci wavelet
experiment 0: subject 001: accuracy = 1.0000
INFO: modĂšle absent pour S002 R03, entraĂźnement automatique en cours...
[⥠TPV] Extracting wavelet features...
experiment 0: subject 002: accuracy = 0.6923
...
experiment 5: subject 109: accuracy = 1.0000
Mean accuracy of the six different experiments for all 109 subjects:
experiment 0: accuracy = 0.8894
experiment 1: accuracy = 0.8799
experiment 2: accuracy = 0.9056
experiment 3: accuracy = 0.9013
experiment 4: accuracy = 0.8935
experiment 5: accuracy = 0.8972
Mean accuracy of 6 experiments: 0.8945(total-perspective-vortex-py3.10) raveriss@raveriss-NLx0MU:~/Desktop/Total_Perspective_Vortex$ make compute-mean-of-means
Subject T1 T2 T3 T4 Mean Eligible(4/4) MeetsThreshold_0p75
S001 0.962 0.895 1.000 0.933 0.947 yes yes
S002 0.846 0.900 1.000 0.857 0.901 yes yes
...
S108 0.833 1.000 0.900 0.917 0.912 yes yes
S109 0.900 0.933 1.000 0.867 0.925 yes yes
Global 0.891 0.889 0.906 0.901 0.897 109 subjects, bonus 5 yes
Worst subjects by Mean (mean_of_means):
- S092: 0.765
- S066: 0.780
- S059: 0.795
- S089: 0.799
- S045: 0.815- Lecture des fichiers Physionet
- Visualisation du signal brut
- Filtrage bande-passante 8â40 Hz
- DĂ©coupage des epochs (t0âtn)
- Extraction des événements motrices (Left Hand / Right Hand / Feet)
Structure locale attendue (non versionnée) : data/<subject>/<run>.edf.
VĂ©rifiez lâintĂ©gritĂ© et le nombre de runs avant tout parsing :
Ce script gĂ©nĂšre une figure comparative signal brut vs signal filtrĂ© (bande-passante 8â40 Hz), afin de valider visuellement le prĂ©processing sur un couple (subject, run) avant dâenchaĂźner sur lâextraction de features.
RecommandĂ© : exĂ©cuter via Poetry pour garantir lâenvironnement.
make visualizer 1 9Les canaux EEG retenus se concentrent sur la région sensorimotrice
(10-20) car lâimagerie motrice induit des variations dâERD/ERS surtout
sur les sites C3/Cz/C4 et leurs voisins fronto-centraux et centro-pariétaux.
Cela aligne la sélection DEFAULT_MOTOR_ROI (ex: FC3/FC1/FCz/FC2/FC4,
C3/C1/Cz/C2/C4, CP3/CP1/CPz/CP2/CP4) du script
scripts/visualize_raw_filtered.py et les recommandations classiques en BCI
(Pfurtscheller & Neuper, 2001; Wolpaw et al., 2002).
Références :
- Pfurtscheller, G. & Neuper, C. (2001). Motor imagery and direct brain-computer communication. https://doi.org/10.1109/5.939829
- Wolpaw, J. R. et al. (2002). Brain-computer interfaces for communication. https://doi.org/10.1016/S1388-2457(02)00057-3
Les fenĂȘtres temporelles dâepoching 0.5â2.5 s, 1.0â3.0 s et 0.0â2.0 s
correspondent aux valeurs par défaut de tpv.utils.DEFAULT_EPOCH_WINDOWS. Elles
Ă©vacuent la phase de rĂ©action immĂ©diate Ă lâindice visuel tout en couvrant la
rĂ©ponse motrice soutenue, ce qui limite les risques de fenĂȘtres trop courtes
ou mal alignĂ©es avec lâERD/ERS (cf. Murphy TPV-032, TPV-052).
Pour visualiser lâimpact de ces choix (canaux + filtrage), utiliser le script de comparaison brut/filtrĂ© :
make visualizer 1 3 C3 Cz C4Ce graphique permet de vĂ©rifier visuellement que les canaux sensorimoteurs prĂ©sentent bien une dynamique exploitable dans la bande 8â40 Hz avant dâalimenter la pipeline de features.
- Puissances par fréquence
- Spectrogrammes ou FFT
- Projection channel Ă time
- Agrégation temporelle
Tu dĂ©cides des features que tu veux envoyer Ă ta matrice X â R^(d Ă N).
đ Partie obligatoire du sujet : implĂ©menter lâalgorithme soi-mĂȘme
- calcul des matrices de covariance
- décomposition SVD / eigendecomposition
- normalisation
- projection Wá”X â X'
- tests de cohérence dimensionnelle
Le sujet exige :
- héritage de
baseEstimatoretTransformerMixin - pipeline â
[Preprocessing â Dimensionality â Classifier] - utilisation de
cross_val_score
- pytest
- ruff
- black
- mypy
- coverage
- mutation testing (mutmut)
- la configuration Mutmut couvre
mybci.py,src/tpvetscriptspour évaluer la qualité sur l'ensemble du pipeline
- la configuration Mutmut couvre
- CI GitHub Actions + Codecov
| Item checklist TPV | WBS / livrable | Test ou commande reproductible |
|---|---|---|
| Visualisation raw vs filtrĂ© | 3.3.1â3.3.4 | poetry run python scripts/visualize_raw_filtered.py data/S001 ; poetry run pytest tests/test_preprocessing.py::test_apply_bandpass_filter_preserves_shape_and_stability |
| Filtre 8â30 Hz + notch 50 Hz | 3.1.1â3.1.3 | poetry run pytest tests/test_preprocessing.py::test_apply_bandpass_filter_preserves_shape_and_stability |
| RĂ©duction dimension (PCA/CSP) | 5.2.1â5.2.4 | poetry run pytest tests/test_dimensionality.py::test_csp_returns_log_variances_and_orthogonality |
| Pipeline sklearn (BaseEstimator/TransformerMixin) | 5.3.1â5.3.4 | poetry run pytest tests/test_pipeline.py::test_pipeline_pickling_roundtrip |
| Train + score via CLI | 6.3.x & 7.1.x | poetry run pytest tests/test_classifier.py::test_training_cli_main_covers_parser_and_paths |
| Predict renvoie lâID de classe | 1.2.x & 6.2.x | poetry run pytest tests/test_classifier.py::test_predict_cli_main_covers_parser_and_report |
| Temps rĂ©el < 2 s | 8.2.xâ8.3.x | poetry run pytest tests/test_realtime.py::test_realtime_latency_threshold_enforced |
| Score ℠75 % (agrégation) | 7.2.x | poetry run pytest tests/test_classifier.py::test_aggregate_scores_exports_files_and_thresholds |
- Eligible = sujet disposant des 4 types dâexpĂ©rience (T1..T4).
- Mean (par sujet) = moyenne des 4 moyennes dâexpĂ©rience.
- MeetsThreshold_0p75 =
Mean >= 0.75. - GlobalMean =
(mean(T1) + mean(T2) + mean(T3) + mean(T4)) / 4. - Le script affiche les 10 pires sujets par
Meanet retourne exit code 1 siGlobalMean < 0.75.
La version complÚte et maintenable de cette matrice, incluant les références aux risques Murphy, est disponible dans docs/project/checklist_wbs_matrix.md.
Ces exigences doivent ĂȘtre prĂ©sentes et respectĂ©es dans toute la documentation et le code :
- Finalité : classer en temps « réel » un signal EEG (imagination de mouvement A ou B).
- Source des données : utiliser exclusivement Physionet (EEG motor imagery) ; les signaux sont des matrices channels à time avec runs découpés et labellisés proprement.
- Prétraitement obligatoire :
- visualiser le signal brut dans un script dédié ;
- filtrer les bandes utiles (theta, alpha, beta⊠au choix) ;
- visualiser aprÚs prétraitement ;
- extraire les features (spectre, PSD, etc.) ;
- đ« interdiction implicite : ne pas utiliser
mne-realtime.
- Pipeline ML :
- utilisation obligatoire de
sklearn.pipeline.Pipeline; - transformer maison héritant de
BaseEstimatoretTransformerMixin; - implĂ©menter soi-mĂȘme la rĂ©duction PCA, ICA, CSP ou CSSP (NumPy/SciPy autorisĂ©s, pas de version prĂȘte de sklearn ou MNE).
- utilisation obligatoire de
- EntraĂźnement/validation/test :
cross_val_scoresur lâensemble du pipeline ;- splits Train / Validation / Test distincts pour Ă©viter lâoverfit ;
- moyenne dâaccuracy â„ 60 % sur tous les sujets du jeu de test et les 6 runs dâexpĂ©riences, sur des donnĂ©es jamais apprises.
- Temps réel : le script
predictlit un flux simulĂ© (lecture progressive dâun fichier) et produit une prĂ©diction en < 2 secondes aprĂšs chaque chunk. - Architecture : fournir un script train et un script predict ; le dĂ©pĂŽt final contient uniquement le code Python (pas le dataset).
- Bonus facultatifs : wavelets pour le spectre, classifieur maison ou autres datasets EEG.
- Formalisme mathĂ©matique : pour le transformer, avec X â R^{d Ă N}, produire une matrice W telle que W^T X = X_{CSP}/X_{PCA}/X_{ICA}.
- NumPy (matrices, opérations vectorisées)
- SciPy (eigenvalues, SVD)
- MNE (EEG parsing)
- scikit-learn (pipeline, classif, cross-validation)
- ruff, black, mypy
- pytest, coverage, mutmut
- GitHub Actions, Codecov
Les fichiers de cartographie des risques (Loi de Murphy) se trouvent dans :
docs/qa/murphy_map_tpv.csv
Tous les jalons projet sont récapitulés dans docs/index.md, avec des liens directs vers le WBS, le diagramme de Gantt, la roadmap et la Murphy map.
Les contenus suivants ont Ă©tĂ© essentiels pour comprendre lâEEG, les filtres spatiaux (CSP) et la mise en place dâun pipeline dâanalyse monotrial robuste :
-
đ„ Playlist YouTube â Machine Learning from Scratch SĂ©rie pĂ©dagogique pour consolider les bases de lâapprentissage supervisĂ© (modĂšles linĂ©aires, descente de gradient, rĂ©gularisation) utilisĂ©es pour entraĂźner le classifieur sur les features EEG.
-
đ WikipĂ©dia â ĂlectroencĂ©phalographie Notions fondamentales sur lâEEG, lâacquisition du signal et le rĂŽle des Ă©lectrodes, indispensables pour interprĂ©ter les donnĂ©es brutes.
-
đ WikipĂ©dia â Common spatial pattern PrĂ©sentation du principe des filtres spatiaux CSP, de la maximisation de la variance entre classes et de leur utilisation en BCI.
-
đ Blankertz et al., Optimizing Spatial Filters for Robust EEG Single-Trial Analysis Article de rĂ©fĂ©rence dĂ©crivant les stratĂ©gies dâoptimisation de filtres spatiaux pour amĂ©liorer la robustesse de lâanalyse EEG monotrial.
-
đïž PhysioNet â EEG Motor Movement/Imagery Dataset v1.0.0
-
đ·ïž ICLabel â Tutoriel âEEG Independent Component Labelingâ
MIT License.
Rafael Verissimo
Ătudiant IA/Data â Ăcole 42 Paris
GitHub : https://github.com/raveriss
LinkedIn : https://www.linkedin.com/in/verissimo-rafael/
