https://www.youtube.com/watch?v=S7EpSgWPKJY

Kim, J., Kim, T., & Lee, J. (2024, May). VR-SSVEPeripheral: Designing Virtual Reality Friendly SSVEP Stimuli using Peripheral Vision Area for Immersive and Comfortable Experience. In Extended Abstracts of the CHI Conference on Human Factors in Computing Systems (pp. 1-7).

'Cognitive Neuroscience > BCI' 카테고리의 다른 글

3. Deep Learning BCI (focused on EEG)  (0) 2022.08.06
Machine Learning on EEG Data  (1) 2022.03.15
2. Brain Signal Acquisition  (0) 2021.12.25
1. Introduction  (0) 2021.12.04

1. Spontaneous EEG Potentials

  1) 수면

    불면증을 진단하고 수면의 단계(non-REM1~4, REM [R&K rules])에 대해 분석할 때 사용된다. 이런 용도의 분석에서는 50Hz Notch, 30s windows를 주로 사용한다. Vilamala et al, 2017에서는 Fpz-Cz, Pz-Oz channel에서 얻은 EEG 신호들을 CNN을 통해서 5-class classification에서 86% 정확도를 확인할 수 있었다. Tan et al., 2015에서는 DBN-RBM에 PSD feature를 넣어서 92.78%까지도 향상시키는걸 볼 수 있었다.

  2) Motor-Imagery (MI)

    사용자의 운동 의도를 탐지하는 MI EEG는 주로 DBN (Deep Belief Network)를 활용한다 (Kumar et al., 2016, Lu et al., 2017). 이 분야는 수면과는 다르게 아직 70%대로 성능이 좋지는 않은데 그래서 다양한 시도들이 이루어지고 있는듯하다. Event-related desynchronization/synchronization (ERD/ERS)를 사용하기도 하는데, 이는 뇌가 특정 상태일 때 EEG signal power의 magnitude, frequency distribution이 달라지는 것에서 감소하면 ERD, 증가하면 ERS를 나타낸다. 이 특징으로 EEG fluctuation을 탐지할 수 있는데, ERD/ERS는 sensory, cognitive, motore procedures task에서 주로 관찰된다. 하지만 개인차가 심하기 때문에 다른 brain research에서는 잘 쓰이지 않는다.

  3) 감정

    감정은 valence, arousal, dominance 3가지로 상태를 평가하는데, 이 3가지 조합으로 fear, sadness, anger 등의 감정을 만들어낸다. MLP가 주로 사용됬었지만 최근에는 CNN, RNN이 더 많이 사용되고 있다. 추가로 Eye movement+EEG 데이터를 bimodal deep autoencoder (BDAE) 과 SVM으로 분석을 했을 때 성별에 따른 감정의 차이가 있다는 것을 찾은 연구도 있었다 (Liu et al., 2016). 그래서 이 차이를 줄이고자 Subsapce alignment autoencoder를 만드는 연구들도 진행되고 있다 (Chai et al., 2016).

  4) 정신 질환

    https://github.com/AITRICS/EEG_real_time_seizure_detection

  5) Data Augmentation

    최근 연구들에 따르면 GAN 같은 모델이 EEG data augmentation으로 활용될 수 있다고 한다 (Abdelfattah et al., 2018). Palazzo et al., 2017은 EEG 신호 feature를 GAN을 통해 image로 변환하기도 하고, Abdelfattah는 seizure EEG data를 GAN을 통해 증강함으로 정확도를 48%에서 82%까지 끌어올릴 수 있었다. (이전 post 참고)

  6) Etc: EEGNet (https://arxiv.org/abs/1611.08024, https://github.com/aliasvishnu/EEGNet)

 

2. Evoked Potentials

  1) ERP (P300)

    Visual, Audio 두가지 sensory에 대한 P300 (Oddball, P3 Speller) 신호를 classification하는데 주로 사용된다. 2~35Hz bandpass filter를 적용한 데이터를 갖고 학습을 하는데, Liu et al., 2017에서는 DBN-RBM + SVM으로 97.3%까지 결과를 얻을 수 있었다. 해당 Dataset으로는 유명한 BCI Competition II가 있다 (https://www.bbci.de/competition/ii/). AEP의 경우 0.1~8Hz freq band 범위에서 sample rate를 256에서 25Hz까지 downsample하여 분석하는 것이 더 좋은 결과를 보인다고 한다. Audio processing에서 주로 쓰이는 SincNet (low and high cutoff frequencies에 더 attention 둠)를 통해 feature extraction을 하는 경우도 있다.   

    VEP diagram 중에 Rapid Serial Visual Presentation (RSVP)가 가장 인기가 많은데, CNN, MLP모델로도 좋은 성능이 report 되고 있다. RSVP는 연달아서 나오는 이미지/텍스트 중에 연관성이 없는것이 나오면 report하는 테스트입니다. 0.1~50Hz까지 넓게 사용되고 LSTM 같은 모델에서도 좋은 성능을 보인다고 한다.

  2) SSEP

    대부분 Visual을 중심으로 하는 SSVEP를 기반으로 연구가 진행되는데, SSVEP는 특정 주파수로 깜빡인는 자극을 볼때 나오는 parietal, occipital 영역 뇌파를 기반으로 한다. CNN+RNN 모델로 93.5% 정확도를 얻은 논문 (Attia et al.,2018)부터 compact CNN model로 cross-subject 정확도 향상 시도 (Waytowich et al., 2018), DFT 후 CNN/LSTM에 넣는 등 다양한 시도가 되고 있다. 그런데 online / offline, subject-in/dependent 한 요소들도 고려되어야하므로 오히려 간단한 CNN 모델이 더 좋은 성능을 보이는 경우가 많이 있다.

 

3. Applications

  위의 논문들에 기반하면 간단한 CNN 모델만으로도 70%대 정확도가 나오는 걸 확인할 수 있었습니다. 이는 CNN이 충분히 EEG의 latent discriminative feature와 spatial dependencies를 뽑아낼 수 있기 때문이다. 또한 CNN 모델들이 public한 repo가 많기 때문에 이를 EEG에 적용해보는 시도들이 필요하다고 한다. 그리고 1D (signal)인 EEG를 여러 방법으로 2D로도 변환 가능하다. 예를 들어 각 time point를 2D image로 변환하거나, segment를 2D matrix로 만드는 방법 (32 channel x 100 time point) 을 선택할 수 있다.

    Representative model (DBN)의 경우 주로  DBN-RBM이 사용되는 걸 볼 수 있었는데, 이는 근처 layer의 변수 간 관계를 보여주는 generative param를 효율적으로 학습하고, 각 hidden layer의 latent var를 직관적으로 계산한다는 점이다 (Deng, 2012). 한동안 DBN이 잘 쓰이지 않다가 최근들어 CNN과 같이 하이브리드 형태로 사용되고 있다.

    이런 model을 기반으로 BCI는 헬스케어, Smart Environment (IoT, Robot control 등), 통신, 보안, 감정, 운전 피로 등 다양한 분야에서 활용되고 있다.

1. 개요

실험을 시작하기 전에 우선 CGX Data Aquisition 프로그램을 다운/설치하여 기본적인 프로그램 환경을 구축한다 (http://cognionics.com/wiki/uploads/Main/CGXAcquisitionv66.zip). 아래 이미지와 같이 동봉된 CGX Trigger, Receiver를 PC에 연결시킨다. 이때 Trigger는 Unity 또는 실험을 구동하는 컴퓨터에, Receiver는 CGX Data Aquisition을 구동하는 컴퓨터에 연결을 해야한다. 성능이 좋은 경우 한 컴퓨터에서 다 해도 문제는 없어보인다. 아래의 미지는 헤드셋에 내장된 SD카드에 직접 저장하는 것인데 손실위험이 있기 때문에 Steraming으로 받아서 저장하는 것을 추천한다. EEG 기기를 장착하고 impedance값을 최대한 낮게 조정한 뒤 연결 후 실험을 시작하면 된다.

`Trigger System Flow (http://cognionics.com/wiki/pmwiki.php/Main/WirelessTrigger)

 

2. Wireless Trigger

다음으로는 Data Acquisition Program에서 Recording 중에 Trigger 신호를 주는 방법에 대해 설명한다. 랩에서는 주로 Unity를 활용하기 때문에 CGX Wiki에서 제공하는 예시를 변형하여 구현하였다. 아직 프로그램 내에서 문자열을 보내서 해석까지는 하지 못해서 문자열을 숫자로 변환하여 전송하도록 하였다.

Python 버젼은 LSL을 활용해서 Data Acquisition Program에서 LSL Streaming 버튼을 눌러 실행하면 그때부터 받은 데이터를 따로 저장하고, Trigger도 같이 저장하게끔하였다. 데이터 수집이 동일하게 되는 것은 확인했지만 아직 이를 활용해서 분석을 해보지는 않았으니 참고하길 바랍니다.

1) Unity (C#) - Port 설정 (https://coderzero.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%8B%9C%EB%A6%AC%EC%96%BC%ED%86%B5%EC%8B%A0-RS232-%EC%8B%9C%EB%A6%AC%EC%96%BC-%ED%86%B5%EC%8B%A0)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

using System.IO;
using System.IO.Ports;

/**
Baud Rate: 57,600 bps
Data Bits: 8
Stop Bits: 1
Flow Control: None
COM3
**/

public class serialCom : MonoBehaviour {
    public static serialCom sc;

    public enum PortNumber{
        COM1, COM2, COM3, COM4,
        COM5, COM6, COM7, COM8,
        COM9,COM10,COM11,COM12,
        COM13,COM14,COM15,COM16
    }

    private SerialPort serial;

    [SerializeField]
    private PortNumber portNumber = PortNumber.COM1;
    [SerializeField]
    private string baudRate = "9600";

    void Start(){
        if(sc && sc != this)
            Destroy(this);
        else
            sc = this;

        serial = new SerialPort(portNumber.ToString(), int.Parse(baudRate), Parity.None, 8, StopBits.One);
    }

    public void sendTriggerEEG(string data){
        if(!serial.IsOpen)
            serial.Open();

        int marker;
        if(data == "T"){  //response
            marker = 102;
        }else if(data == "S"){  //dummy
            marker = 101;
        }else if(data == "N"){  //Normal
            marker = 11;
        }else{
            marker = 10;  //Odd
        }

        byte[] buffer = new byte[] { Convert.ToByte(marker) };
        serial.Write(buffer, 0, buffer.Length);

        //0~255 사이 값을 보낼 수 있는데, 찍혀 나오는 값은 256이 곱해져있는 값이 찍히게 됨
    }
}

2) Python LSL (LabStreamingLayer) : https://github.com/jinwook31/Quick20_LSL_rtRecording_python

https://github.com/nikk-nikaznan/SSVEP_Stimuli/blob/master/onebox_stimuli_RDA.py (이거도 참고해볼만한 코드)

 

GitHub - jinwook31/Quick20_LSL_rtRecording_python: Quick20 Labstreaminglayer real-time recording (python)

Quick20 Labstreaminglayer real-time recording (python) - GitHub - jinwook31/Quick20_LSL_rtRecording_python: Quick20 Labstreaminglayer real-time recording (python)

github.com

3) MATLAB 및 기타 등등 : http://cognionics.com/wiki/pmwiki.php/Main/WirelessTrigger

 

CGX Wiki | Main / Wireless Trigger

#include #include HANDLE hSerial; COMMTIMEOUTS timeouts={0}; int init_SPP(int port){     char com[100];     sprintf(com, "\\\\.\\COM%d", port);         hSerial = CreateFile(com,                                              

cognionics.com

 

3. 주의 사항

주석에도 있지만 실험 코드에서 Trigger 신호를 보낼 때 0~255사이의 값 (8 bit)만 사용을 할수 있다. 그런데 이게 전송 과정에서 8bit Shift 되버려서 Data Aqu. Program에서 보낸 값에 256이 곱해진 값으로 보여지게 된다. 그래서 분석 전에 Trigger 값에 256을 다시 나누어주면 원래 값을 볼 수 있을 것이다.

추가로 연속으로 같은 Trigger Tag를 전송하면 찍히지 않는 것을 볼 수 있는데, 문의를 해보니 그냥 Dummy Trigger Tag를 그 사이에 보내야 한다고 한다. 그리고 이 Tag도 간격이 너무 짧으면 찍히지 않는 경우가 가끔 있으니 반드시 잘 찍히는지 확인 후 실험을 하길 바란다.

다음에는 LSL, RDA 등으로 데이터를 읽는 것과 실시간 Streaming에 대해 정리해보겠습니다.

'Cognitive Neuroscience > EEG' 카테고리의 다른 글

ERP Core P300 (EEGLAB, ERPLAB)  (0) 2021.01.13

주로 뇌파 데이터에서는 RNN보다는 CNN을 주로 활용함

 

13년도부터 뇌파 데이터에 딥러닝 적용해보려는 시도가 이루어 졌지만 발견한 문제점

 - 데이터가 부족 : 이미지처럼 많은 데이터를 얻기 힘듦

 - 불확실성이 크다 (Non stationary, Non linearity) 시간에 따라 분산 등이 변함

 

문제 해결 시도

1) 뇌파 신호의 이미지화

=> 뇌파 Data를 알파, 베타 ,감마의 이미지로 변형하여 적용해보자! (Bashivan et al., 2015) = 가능은 하지만 기존 ML보다는 성능이 낮음

=> Power-Spectral Density Image로 분류 (Ieracitano et al., 2019), Topography map CNN에 적용 (Mao et al., 2018)

 

2) Feature Extraction

=> Power-Spectral Density, Covariance 등의 Feature를 추출하여 CNN 적용 (Zhang & Eskandarian, 2020)

=> Channel Synchronicity Visualization하여 이미지화 (Naira & Alamo, 2019)

 

1,2번 방법들 모두 분류는 가능하나 LDA, SVM보다 낫지 않아 대부분 비교한 것을 보고를 하지 않음!!

 

3) Raw Data 직접 적용

=> Deep Learning with Convolution Neural Network for EEG Decoding and Visualization, Shirrmeister et al., 2017 (https://braindecode.org/) EEG 딥러닝 대중화를 위해 Pytorch 기반 툴박스 제작 & 기존 모델(FBCSP)과 비교! Shallow, Deep Conv Net 모두 성능 향상되지만 Deep이 더 안정적으로 향상되는 것을 확인

=> 시간, 공간을 분리, 즉 각각 Time-Channel에 대해 Kernel을 사용 / Time에 대해, 공간에 대해 각각 Kernel을 분리하였더니 정확도가 상승하는 것을 발견! Model 구성, parameter 최적화 부재 때문에 비교적 성능은 떨어짐

=> EEGNet (Lawhern et al., 2018) 도 나옴

 

뇌파 Data를 적용할 때 주의사항

- 여러 Model을 적용하고 기존 ML 결과와 비교하는 것이 중요 (최적화, 노다가 작업..)

- 기존 논문 결과가 항상 그대로 나오지 않는 경우가 많음 (기존 논문은 비교를 잘 하지 않았고, Data 수집 방법의 차이가 큼, Subject dependent로 높은 정확도 유도한 경우도..)

- 기존 모델 (Shallow, DeepNet, EEGNet, SVM 등), Batch Size, Subject Dependent/Independent에 따라 비교해볼 것

- Data Augmentation 하여 데이터 확대해보기

 

EEG Data Augmentation 방법 (1번(epoch < 10s)과 2-4번(~2s epoch)방법이 주로 가장 효과가 좋은 것으로 보임)

1) Sliding Window (Sakai et al., 2017) - Epoch size가 10s 정도로 긴 경우 가장 최적의 step, window size를 찾아 활용

2) EEG Data에 Noise 추가

2-1) Short-time Fourier Transform (STFT) Amplitude Perturbation (Li et al., 2019) - STFT로 EEG Spectrum를 추출하고 Amplitude Spectrum에 Noise를 더한 뒤 inverse STFT로 신호 복원; Noise 종류는 Gaussian, Salt&Pepper, Speckle 등 사용 가능 (EEG Data 특성 상 시계열에 직접 추가하면 안됨!)

2-2) STFT 한 후 관심 없는 고주파 Noise 신호 (100Hz 이상)를 추출하여 다른 Sample에 더해 Data 증강, 데이터를 n-1배까지 Augmentation 가능!! (Zhang et al., 2021)

2-3) FFT Phase Randomized Surrogates - FFT로 얻은 스펙트럼에서 amplitude는 고정한 상태에서 phase만 섞은 뒤에 inverse FFT

2-4) STFT time domain recombination (Lotte et al., 2015) - STFT로 Time-Freq Map을 만들고 시간 축으로 섞은 뒤 inverse STFT

3) GAN EEG Data Augmentation (Luo & Lu, 2018)

Taxonomy of brain signals

 Non-invasive 방법 중에는 fNIRS, fMRI, EOG, MEG 가장 대표적인 방법으로는 EEG로 본 내용에서 주로 다룰 데이터이다. Delta (0.5~4 Hz), Theta (4~8 Hz), Alpha (8~12 Hz), Beta (12~30 Hz), Gamma (30~100 Hz)로 나누어 져있고, Alpha~Gamma에서 인간의 인지 과정 및 정도에 대한 정보를 얻을 수 있다 (Zhang et al., 2018h).

 EEG의 또 다른 특징으로는 휴대성이 좋고, temporal resolution이 높다는 것이다. 그리고 다른 방법에 비해 Signal processing으로 충분히 착용자의 움직임에 영향을 줄일 수 있고, 강한 자기장에 노출되지 않아도 된다는 점이다. 그렇게 때문에 EEG를 활용한 분석 방법들이 많이 개발되어 있다. 위의 그림과 같이 여러 Paradigm으로 나눌 수 있는데, Spontaneous EEG의 경우 lower SNR과 참가자간 larger variation 때문에 분석 및 사용이 어려운 부분이 있다. 반대로 Evoked Potential의 경우에는 event를 기준으로 분석을 하기 때문에 이러한 단점들이 많이 보완될 수 있다. 하지만 ERP에서는 event 간의 간격이 겹치면 안되기 때문에 stimuli 자극 주기가 2Hz이하인 경우가 많고, SSEP는 3.5~75Hz까지 다양하게 제시 가능하다.

1) Event-Related Potential: visual, audio, somatosensory 등 다양한 감각으로 인한 evoked potential이 존재하고, occipital lobe에서 나오는 VEP가 가장 뚜렷하게 측정된다. Rapid serial visual presentation (RSVP)로 background noise를 제거하기 위해 여러번 반복하는 실험 패러다임을 사용한다. (SEP로 VR Haptic Evaluation이 가능할지??)

2) P300: Positive potential of ERP at 300ms라는 뜻으로, P1, N1, N2 등 다양한 종류가 있다. 그 중에서드 P300은 큰 진폭으로 인해 탐지하기 쉽워 대표적으로 많이 쓰인다. P3 신호를 얻기 위해서는 Odd-ball paradigm을 사용하는데 BCI에서는 P300 Speller라는 input 방식으로 활용된다.

3) Steady State Evoked Potentials: 평상시의 Brain signal과 Steady-state stimuli (고정 주기로 깜빡이는 자극)가 제시 되고 있을 때의 braing signal을 비교하여 이를 Trigger로써 활용한다. 이러한 자극에도 Auditory, Somatosensory를 기반으로 한 것들이 있지만 주로 Visual을 활용한다.

 

[참고 Link]

 

Virtual ERP Boot Camp: Introduction to ERPs

An introduction to the event-related potential technique for students and researchers with little or no prior ERP experience.

courses.erpinfo.org

 

Online EEGLAB workshop

EEGLAB Documentation including tutorials and workshops information

eeglab.org

 

* 본 Chapter는 Deep Learning for EEG-Based Brain-Computer Interface: Representations, Algorithms and Applications 책을 기반으로 공부하며 정리한 내용들입니다!

http://www.moregrasp.eu/technologies/Brain-Computer-Interfaces

BCI는 휠체어를 조작하거나 로봇을 원격으로 조작하듯 주로 motion에 불편함을 느끼는 경우 이를 보조하기 위한 기술 개발로 주로 쓰여왔다. BCI는 옆의 이미지와 같이 시스템이 구성되어있는데, EEG의 경우 noise가 포함되기 쉬운 기기이기 때문에 이러한 과정에서 Signal-to-Noise (SNR)을 높이는 것이 중요하다. 이를 위해 Preprocessing 과정에서 signal cleaning, signal normalization, signal enhancement (DC 제거), signal reduction이 수행된다. 

그 뒤에 Feature engineering에서는 도메인 지식이 필요하다. preprocess 된 후의 신호에서 사용할만한 feature를 뽑기 위해 EEG 데이터를 time (variance, mean value, kurtosis), frequency (FFT), time-frequency (Discrete wavelet transform) 도메인으로 주로 접근한다. (참고해보면 좋은 링크: https://youtu.be/48qi0exuWRI)

이러한 과정을 프로그래밍을 통해서 자동화하지만 그래도 noise가 많고 개인차가 크기 때문에 최근에 Deep learning을 활용한 방법들이 BCI에서 많이 주목을 받고 있다. BCI에서 DL을 통해서 얻고자하는 목표는 크게 4가지가 있다.

1. Challenge of low SNR: 근육, 눈움직임으로 인한 noise를 효과적으로 제거하고 feature를 찾아내는 것

2. Feature engineering Automation: 전문적인 지식이 없더라도 효율적이고 명확한 feature를 찾아낼 수 있어야함

3. High Accuracy: 기존 SVM을 활용한 방법들의 정확도가 80% 이하였는데, 이를 그 이상으로 끌어올릴 수 있어야 함

4. Handle unlabeled data: 대부분 EEG의 데이터들은 라벨링이 되있지 않거나, 데이터의 크기가 크지 않은 경우가 많은데, 이러한 조건에서도 좋은 성능을 이끌어 낼 수 있어야 함

최근들어 다양한 DL 알고리즘과 GPU가 개발되면서 BCI 분야도 많이 발전이 되었다. 앞으로 이러한 부분들을 더 다룰 예정이다. 아래는 책에서 추천해준 몇 EEG-DL 관련 git 주소들이다.

https://github.com/xiangzhang1015/Deep-Learning-for-BCI

 

GitHub - xiangzhang1015/Deep-Learning-for-BCI: Resources for Book: Deep Learning for EEG-based Brain-Computer Interface: Represe

Resources for Book: Deep Learning for EEG-based Brain-Computer Interface: Representations, Algorithms and Applications - GitHub - xiangzhang1015/Deep-Learning-for-BCI: Resources for Book: Deep Lear...

github.com

https://github.com/NeuroTechX/dl-eeg-playground

 

GitHub - NeuroTechX/dl-eeg-playground: Deep Learning EEG Playground

Deep Learning EEG Playground. Contribute to NeuroTechX/dl-eeg-playground development by creating an account on GitHub.

github.com

https://github.com/QTIM-Lab/DeepNeuro

 

GitHub - QTIM-Lab/DeepNeuro: A deep learning python package for neuroimaging data. Made by:

A deep learning python package for neuroimaging data. Made by: - GitHub - QTIM-Lab/DeepNeuro: A deep learning python package for neuroimaging data. Made by:

github.com

 

21년도에 나온 ERPLAB을 개발한 Steve Luck 교수님의 저널 논문으로 Event-Related Potential (ERP)의 대표적인 패러다임들 각각에 대한 분석 방법 및 코드, 전처리, 실험 자극 구조, 실험 및 신호가 포함하는 의미 등 매우 잘 정리가 되어있다.

개인적으로 P300에 해당하는 Component에 대한 코드를 깊게 분석해보았다. 데이터 셋도 오픈소스로 공개되어있고 코드 한줄 한줄에 대한 설명이 자세하게 써있으니 직접 돌려보면서 아래 PDF 슬라이드를 참고해보아도 좋을 것 같다.

추가로 같은 데이터를 MNE 라이브러리를 활용해서 개발을 해보고, 이 논문의 결과와 비교해보며 제대로 코드가 작성 된것인지 검증해볼 수도 있었다 (https://github.com/jinwook31/MNE_Event-Related-Potential).

논문 링크 : www.sciencedirect.com/science/article/pii/S1053811920309502?via%3Dihub

 

ERP CORE: An open resource for human event-related potential research

Event-related potentials (ERPs) are noninvasive measures of human brain activity that index a range of sensory, cognitive, affective, and motor proces…

www.sciencedirect.com

 

[21.01.06] ERP CORE_P3.pdf
1.46MB

'Cognitive Neuroscience > EEG' 카테고리의 다른 글

CGX Quick 30 - Data Acquisition Program  (0) 2022.03.27

+ Recent posts