Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OpenBCI, où comment lire dans les pensées en Java

OpenBCI, où comment lire dans les pensées en Java

Illustrations du cerveau par Pontus Forslund, via 'A Neural Network Based Brain–Computer Interface for Classification of Movement Related EEG'

79dc5d13bab6d382ae346ecbb0b9876a?s=128

mathieuancelin

April 13, 2015
Tweet

Transcript

  1. @TrevorReznik #ReactIsAwesome OpenBCI, ou comment lire dans les pensées en

    Java @TrevorReznik ! SERLI
  2. @TrevorReznik #OpenBCI Mathieu ANCELIN • Développeur @SERLI • Scala, Java,

    JS, web & OSS • ReactiveCouchbase, Weld-OSGi, etc ... • Poitou-Charentes JUG • Membre de l’expert group CDI • @TrevorReznik
  3. @TrevorReznik #OpenBCI Mathieu ANCELIN • Développeur @SERLI • Scala, Java,

    JS, web & OSS • ReactiveCouchbase, Weld-OSGi, etc ... • Poitou-Charentes JUG • Membre de l’expert group MVC • @TrevorReznik
  4. @TrevorReznik #OpenBCI Mathieu ANCELIN • Développeur @SERLI • Scala, Java,

    JS, web & OSS • ReactiveCouchbase, Weld-OSGi, etc ... • Poitou-Charentes JUG • Membre de l’expert group MVC • @TrevorReznik
  5. @TrevorReznik #OpenBCI Serli • Société de conseil et d’ingénierie du

    SI • 70 personnes • Java, cloud, mobilité • Contribution à des projets OSS • 10% de la force de travail sur l’OSS • Membre du JCP • www.serli.com @SerliFr
  6. @YourTwitterHandle @YourTwitterHandle @TrevorReznik #OpenBCI Disclaimer

  7. @YourTwitterHandle @YourTwitterHandle @TrevorReznik #OpenBCI Disclaimer OpenBCI ne permet PAS de

    lire dans les pensées !!!!
  8. @YourTwitterHandle @YourTwitterHandle @TrevorReznik #OpenBCI Disclaimer Je n’ai pas fait de

    bio depuis plus de 12 ans
  9. @TrevorReznik #OpenBCI

  10. @TrevorReznik #OpenBCI Background • L’idée de créer un lien direct

    entre le cerveau humain et un appareil électronique est apparue au milieu des années 60 • Lancement d’un programme par le DoD américain pour aider les pilotes de chasse à piloter leur appareil. • Devait aider à faire baisser la charge de travail mental pour le pilote • Technologie pas assez sophistiquée, projet annulé • Programme annulé au bout de quelques années • point de base de toutes les recherches sur le sujet
  11. @TrevorReznik #OpenBCI BCI • Brain Computer Interface • Système permettant

    à une personne de contrôler le monde extérieur sans aucune activité musculaire • Les entrées du système sont les impulsions électro-chimiques directement enregistrées depuis le cerveau • reconnaissance de patterns dans ces impulsions • association de commandes à ces patterns • De manière générale, basé sur 3 étapes
  12. @TrevorReznik #OpenBCI Enregistrement du signal • Ces appareils sont souvent

    basés sur des électro- encéphalogrammes (EEG) • c’est la méthode la plus simple • c’est la méthode la moins chère • c’est la méthode la moins invasive • Capte les impulsions • les amplifie, les filtre • les numérise
  13. @TrevorReznik #OpenBCI Pré-processing • Phase permettant de transformer le signal

    pour qu’il soit plus simple à traiter • filtrage • réduction du bruit • composition d’inputs • etc …
  14. @TrevorReznik #OpenBCI Classification • Phase permettant de transformer le signal

    en catégories • A partir de ces catégories, le système va pouvoir extraire des commandes • Souvent, les systèmes de classification sont basé sur de l’auto apprentissage • on entraine le système pour qu’il puisse reconnaitre les patterns représentant les commandes • chaque personne est unique, il est difficile de généraliser des patterns précis associés à des commandes • par exemple, des réseaux de neurones
  15. @YourTwitterHandle @YourTwitterHandle @TrevorReznik #OpenBCI Le projet OpenBCI

  16. @TrevorReznik #OpenBCI Le projet OpenBCI • Projet lancé sur Kickstarter

    en décembre 2013 • Joel Murphy • Conor Russomanno • backé par 947 personnes pour la somme 215 438 $ « A customizable and fully open brain-computer interface platform that gives you access to high-quality brain wave data. » - Joel Murphy
  17. @TrevorReznik #OpenBCI Le projet OpenBCI

  18. @TrevorReznik #OpenBCI Le projet OpenBCI

  19. @TrevorReznik #OpenBCI Le projet OpenBCI

  20. @TrevorReznik #OpenBCI Le projet OpenBCI

  21. @TrevorReznik #OpenBCI Le projet OpenBCI

  22. @TrevorReznik #OpenBCI Le projet OpenBCI

  23. @TrevorReznik #OpenBCI Le projet OpenBCI

  24. @TrevorReznik #OpenBCI Les outils

  25. @YourTwitterHandle @YourTwitterHandle @TrevorReznik #OpenBCI Demo

  26. @YourTwitterHandle @YourTwitterHandle @TrevorReznik #OpenBCI Un peu de théorie

  27. @TrevorReznik #OpenBCI Modèle d’un neurone

  28. @TrevorReznik #OpenBCI Modèle d’un neurone Dentrites en entrée . .

    . Σ fonction d’activation Axone de sortie poids synaptique
  29. @TrevorReznik #OpenBCI Modèle d’un neurone • Unité de processing autonome

    • spécialisée dans la réception et l’émission de signaux électro- chimiques • accepte en entrée les résultats d’autres cellules à travers les dendrites et les somme • si l’addition arrive jusqu’à un certains seuil propre au neurone • le neurone « fait feu » et envoie un signal de sortie à travers son axone
  30. @TrevorReznik #OpenBCI Modèle d’un neurone down the cell and escapes

    out of its deeper part creating a positive charge in the extracellular fluid around the “base of the pyramid” as described by Figure 3.2. The process is similar to the generation of the action potential described in Section 2.2. + + + + + + + + + + - - - - - - - + - - - - - - - + + Na+, K+ ion flow Figure 3.2: Current flow within and around a triggered pyramidal cell.
  31. @TrevorReznik #OpenBCI Modèle d’un neurone • Composés majoritairement de membranes

    semi perméables et de fluides conducteurs • fluide composé majoritairement de potassium et de sodium • contrairement à l’extérieur de la cellule • En cas de stimulus • la perméabilité de la membrane change • les ions passent à travers • chargement de la cellule • une protéine fait sortir du potassium de la cellule peu de temps après pour faire baisser le potentiel
  32. @TrevorReznik #OpenBCI Les rythmes du cerveau • Ondes Alpha •

    entre 8 et 13 Hz, lorsque le sujet se repose mais est éveillé, les yeux fermés • Ondes Beta • entre 13 et 30 Hz, lorsque le sujet ouvre brusquement les yeux ou entre dans une activité mentale • Ondes Theta • Entre 4 et 8 Hz, stress émotionnel et frustration • Ondes Delta • Entre 0.5 et 4 Hz, sommeil profond
  33. @TrevorReznik #OpenBCI Ondes 0 0.5 1 1.5 2 2.5 3

    Time (s) Figure 3.4: EEG recorded when opening and closing the eyes. –50 0 50 Alpha –20 0 20 Beta –100 0 100 Theta 0 0.5 1 1.5 2 2.5 3 3.5 4 –200 0 200 Delta Time (s) EEG (µV) Figure 3.5: Brain waves are categorized based on their frequency content.
  34. @TrevorReznik #OpenBCI Le cerveau humain 16 CHAPTER 2. THE HUMAN

    BRAIN Cerebrum Brain stem Cerebellum Figure 2.6: The human brain consists of three diÆerent parts. 2.3.1 The Cerebral Cortex
  35. @TrevorReznik #OpenBCI Le cerveau humain 2.3. THE STRUCTURE OF THE

    HUMAN BRAIN 17 Primary motor area Visual areas I, II, III Sensory area Auditory area Premotor area Broca's Speech centra Temporal lobe Frontal lobe Occipital lobe Parietal lobe Figure 2.7: The functionality of diÆerent areas of the cerebral cortex.
  36. @TrevorReznik #OpenBCI Le cerveau humain 1 2 3 4 5

    6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 11 – 12 – 13 – 14 – 15 – 16 – 17 – 18 – 19 – 20 – 21 – 22 – 23 – 24 – chewing swallowing tounge teeth, jaw speech lips face eyes forehead neck thumb index finger middle finger ring finger little finger hand wrist elbow shoulder trunk hip knee ankle toes Figure 2.8: The motor homunculus map. (After Penfield and Ras-
  37. @TrevorReznik #OpenBCI Position des électrodes 28 CHAPTER 3. EEG RECORDING

    from the nasion. The following points are named: frontal (F), central (C), parietal (P) and occipital (O), and are positioned 20% of the distance from each other with the F-point 20% away from the Fp-point. That leaves 10% between the O-point and the inion. Fp Nasion Inion 20% 20% 20% 20% 10% 10% F C P O Figure 3.7: Division of the midline between nasion and inion according to the 10-20 system. (From Jasper, 1958.) The measurements in the left–right direction is based on a imagined line
  38. @TrevorReznik #OpenBCI Position des électrodes 3.5. THE 10–20 SYSTEM FOR

    ELECTRODE PLACEMENT 29 10% 10% 20% 20% 20% 20% C4 C3 T4 T3 Cz Nasion F8 Fp2 Fp1 F7 F4 Fz F3 Figure 3.8: Frontal view of the head showing electrode positions along the central line. (From Jasper, 1958.)
  39. @TrevorReznik #OpenBCI Position des électrodes 10% 10% 20% 20% 20%

    20% Fp1 F7 T3 T5 O1 O2 P3 Pz P4 C4 Cz C3 F4 Fz F3 Fp2 F8 T4 T6 Figure 3.9: Top view of the skull illustrating electrode positions according
  40. @TrevorReznik #OpenBCI Position des électrodes

  41. @YourTwitterHandle @YourTwitterHandle @TrevorReznik #OpenBCI L’environnement de démo

  42. @TrevorReznik #OpenBCI Le cérébro

  43. @TrevorReznik #OpenBCI Imprimer son propre casque

  44. @TrevorReznik #OpenBCI Imprimer son propre casque

  45. @TrevorReznik #OpenBCI Imprimer son propre casque

  46. @TrevorReznik #OpenBCI Imprimer son propre casque

  47. @TrevorReznik #OpenBCI The first one

  48. @YourTwitterHandle @YourTwitterHandle @TrevorReznik #OpenBCI Demo

  49. @TrevorReznik #OpenBCI Comment ca marche ? • Sur le serveur

    • Application Play 2 • accès simple aux fonctionnalités web temps réel • Scala / Java • Connecteur à l’OpenBCI • stream les données dans un bus d’évènements Akka • Acteurs classifieurs / détecteurs • Acteur Akka abonné à une ligne de données en particulier • gère une série temporelle et une fenêtre glissante • Responsables de l’envoi de commandes vers le navigateur
  50. @TrevorReznik #OpenBCI Comment ca marche ? Event stream Akka Enumerator

    SSE connecteur OpenBCI Pattern detector Pattern detector Pattern detector
  51. @TrevorReznik #OpenBCI Comment ca marche ? • Dans le browser

    • Intégration des slides via pdf.js • API pour piloter le défilement, etc … • Utilisation intensive des Server Sent Event pour transmettre les « brainwaves » en temps réel • Monitoring • JQuery sparklines • Demo • Canvas et JavaScript
  52. @YourTwitterHandle @YourTwitterHandle @TrevorReznik #OpenBCI Problèmes rencontrés

  53. @TrevorReznik #OpenBCI Interfaçage avec l’EEG • Pas d’API de haut

    niveau • Pas de module Java • Protocole basé sur une échange série • bien documenté • mais pas forcément simple à maitriser • notamment au niveau de l’initialisation de l’EEG • Création d’un librairie Java permettant de simplifier la communication • https://github.com/mathieuancelin/openbci-java
  54. @TrevorReznik #OpenBCI OpenBCI GUI //here  is  the  processing  routine  called

     by  the  OpenBCI  main  program...update  this  with  whatever  you'd  like  to  do   public  void  process(float[][]  data_newest_uV,  //holds  raw  EEG  data  that  is  new  since  the  last  call              float[][]  data_long_uV,  //holds  a  longer  piece  of  buffered  EEG  data,  of  same  length  as  will  be  plotted  on  the  scre            float[][]  data_forDisplay_uV,  //this  data  has  been  filtered  and  is  ready  for  plotting  on  the  screen              FFT[]  fftData)  {                            //holds  the  FFT  (frequency  spectrum)  of  the  latest  data          //for  example,  you  could  loop  over  each  EEG  channel  to  do  some  sort  of  time-­‐domain  processing        //using  the  sample  values  that  have  already  been  filtered,  as  will  be  plotted  on  the  display      float  EEG_value_uV;      for  (int  Ichan=0;Ichan  <  nchan;  Ichan++)  {          //loop  over  each  NEW  sample          int  indexOfNewData  =  data_forDisplay_uV[Ichan].length  -­‐  data_newest_uV[Ichan].length;          for  (int  Isamp=indexOfNewData;  Isamp  <  data_forDisplay_uV[Ichan].length;  Isamp++)  {              EEG_value_uV  =  data_forDisplay_uV[Ichan][Isamp];    //  again,  this  is  from  the  filtered  data  that  is  ready  for  displ                                        //add  your  processing  here...                                          println("EEG_Processing_User:  Ichan  =  "  +  Ichan  +  ",  Isamp  =  "  +  Isamp  +  ",  EEG  Value  =  "  +  EEG_value_uV  +  "  uV");        }      }
  55. @TrevorReznik #OpenBCI OpenBCI GUI //here  is  the  processing  routine  called

     by  the  OpenBCI  main  program...update  this  with  whatever  you'd  like  to  do   public  void  process(float[][]  data_newest_uV,  //holds  raw  EEG  data  that  is  new  since  the  last  call              float[][]  data_long_uV,  //holds  a  longer  piece  of  buffered  EEG  data,  of  same  length  as  will  be  plotted  on  the  scre            float[][]  data_forDisplay_uV,  //this  data  has  been  filtered  and  is  ready  for  plotting  on  the  screen              FFT[]  fftData)  {                            //holds  the  FFT  (frequency  spectrum)  of  the  latest  data          //for  example,  you  could  loop  over  each  EEG  channel  to  do  some  sort  of  time-­‐domain  processing        //using  the  sample  values  that  have  already  been  filtered,  as  will  be  plotted  on  the  display      float  EEG_value_uV;      for  (int  Ichan=0;Ichan  <  nchan;  Ichan++)  {          //loop  over  each  NEW  sample          int  indexOfNewData  =  data_forDisplay_uV[Ichan].length  -­‐  data_newest_uV[Ichan].length;          for  (int  Isamp=indexOfNewData;  Isamp  <  data_forDisplay_uV[Ichan].length;  Isamp++)  {              EEG_value_uV  =  data_forDisplay_uV[Ichan][Isamp];    //  again,  this  is  from  the  filtered  data  that  is  ready  for  displ                                        //add  your  processing  here...                                          println("EEG_Processing_User:  Ichan  =  "  +  Ichan  +  ",  Isamp  =  "  +  Isamp  +  ",  EEG  Value  =  "  +  EEG_value_uV  +  "  uV");        }      }
  56. @TrevorReznik #OpenBCI OpenBCI GUI public  void  mouseReleased()  {    

     ...      for  (int  i  =  0;  i  <  nchan;  i++)  {          //was  on/off  clicked?          if  (channelSettingButtons[i][0].isMouseHere()  &&  channelSettingButtons[i][0].wasPressed  ==  true)  {              if  (channelSettingValues[i][0]  <  maxValuesPerSetting[0])  {                  channelSettingValues[i][0]  =  '1';                  powerDownChannel(i);                  deactivateChannel(i);              }  else  {                  channelSettingValues[i][0]  =  '0';                  powerUpChannel(i);                  activateChannel(i);              }              writeChannelSettings(i);//write  new  ADS1299  channel  row  values  to  OpenBCI          }          ...
  57. @TrevorReznik #OpenBCI OpenBCI GUI public  void  mouseReleased()  {    

     ...      for  (int  i  =  0;  i  <  nchan;  i++)  {          //was  on/off  clicked?          if  (channelSettingButtons[i][0].isMouseHere()  &&  channelSettingButtons[i][0].wasPressed  ==  true)  {              if  (channelSettingValues[i][0]  <  maxValuesPerSetting[0])  {                  channelSettingValues[i][0]  =  '1';                  powerDownChannel(i);                  deactivateChannel(i);              }  else  {                  channelSettingValues[i][0]  =  '0';                  powerUpChannel(i);                  activateChannel(i);              }              writeChannelSettings(i);//write  new  ADS1299  channel  row  values  to  OpenBCI          }          ...
  58. @YourTwitterHandle @YourTwitterHandle @TrevorReznik #OpenBCI Le futur

  59. @TrevorReznik #OpenBCI Le futur • Finir la librairie de connexion

    simplifiée avec l’EEG • Ajouter un réseau de neurone • permet une classification plus aisée • plus adaptable • processus d’apprentissage pour chaque utilisateur • Piloter un drone :-)
  60. @YourTwitterHandle @YourTwitterHandle @TrevorReznik #OpenBCI Q & A