пятница, 2 ноября 2012 г.

Охота на вызванные потенциалы

'Вот где водится Снарк!' -- возгласил Балабон.
Указав на вершину горы;
И матросов на берег вытаскивал он,
Их подтягивал за вихры.

(Тут и далее "Охота на Снарка")
После полугодового перерыва в экспериментах над мозгом, решил вернуться к теме измерения и анализа вызванных потенциалов с помощью Emotiv EPOC.

В результате почти месяца плясок с бубном, был приобретен некий опыт, которым Я хочу поделится. Дальше идет пошаговое описание процесса и много-много буков. :)
В конце видео с записью процесса.

Для регистрации вызванных потенциалов потребуется:
1) Шлем Emoitiv EPOC + ПО Emotiv SDK Research Edition v.1.0.0.5. - 1 шт.
2) Для записи сигнала и формирования стимулов - ПО OpenVibe (использовался v. 0.14.2)
3) Для анализа результатов EEGLAB 11.0.4.3b

Для измерения вызванных потенциалы будем использовать следующую схему эксперимента.
Испытуемому каждые 3 секунды показывается изображение, при появлении одного изображения он должен нажимать на кнопку, другое изображение - игнорируется.
Всего предъявляется 200 стимулов, примерно по 100 на стимулов на каждое изображение. Порядок предъявления определяется генератором случайных чисел.

OpenVibe прекрасно подходит для того чтобы не только показывать изображения, но и записывать действия пользователя пользователя.

Часть 1. ПОДГОТОВКА ЭКСПЕРИМЕНТА.

И со свечкой искали они, и с умом,
С упованьем и крепкой дубиной,
Понижением акций грозили притом
И пленяли улыбкой невинной.

1) Запускаем OpenVibe Designer.
2) Создаем новый документ.
3) Справа в окне Boxes находим и перетаскиваем в документ из раздела:
4) Acquisition компонент Acquisition client (он там один) - 1 шт.
5) File reading and writing->EDF компонент Edf File Writer - 1 шт.

Соединяем сиреневые порты Signal. Тем самым мы перенаправляем измеряемый поток в EDF-файл. Далее два раза щелкнуть по по компоненту EDF FileWriter. Советую оставить название record-[$core{date}-$core{time}].edf добавив спереди только путь директории куда будет сохраняться файл с результатом.

6) Samples - Clock Stimulator - 1 шт.
7) Stimulation - Player Controller - 1 шт.
8) Соединяем их между собой.

Эти два компонента в связке остановят эксперимент через заданное время. Что избавит от необходимости следить за временем эксперимента.
В свойствах Clock - выставляем время 630 - т.е. 10 минуть + 30 секунд на всяческие приготовления и фильтрацию.

9) Samples - Clock Stimulator
10) Scripting - Lua Stimulator
11) Streaming - Simulation Multiplexer
12) Visualization>Presentation - Display cue image.
13) Stimulation - Keybord Stimulator
Вот эти компоненты обеспечат функционал эксперимента.
Щелкнув два раза по Clock настраиваем его на 3 секунды. Раз в 3 секунды clock будет генерировать стимул который будет запускать скрипт.

14) Щелкаем правой кнопкой по компоненту Lua Stimulator
и в контекстном меню Modify Inputs жмем (+New)

15) Ставим компонент Display cue image. Щелкаем по нему правой кнопкой и в контекстном меню добавляем второе изображение.

Я использовал картинки которые идут с OpenVibe вы можете поставить те которые вам нравятся.
SuperMario - NOGO-стимул и BomberMan - GO-стимул.


В итоге должно получится примерно то что показано на рисунке.


16) Щелкаем по Display Cue Image - и ставим флаг Display images in full screen
а Clear screen Stimulation устанавливаем в OVTK_StimulationId_Label_00.

17) Щелкаем по объекту Keyboard stimulator - и указываем путь к текстовому файлу.
Который содержит одну строку.

space 0x00008103 0x00008104
Т.е. по нажатию пробела в поток стимулов будет записываться стимул с кодом
OVTK_StimulationId_Label_03 , по отпусканию OVTK_StimulationId_Label_04.

18) Щелкаем по компоненту LUA Script и указываем путь к файлу.
Который можно скачать по этой ссылке.
Для тех кому интересно что там написано. Я взял файл из директории с примером работы Lua Stimulator и добавил туда такие строчки.

gonogo = math.random(1,2);    
box:send_stimulation(1, OVTK_StimulationId_Label_00+gonogo, date+1, 0)
box:send_stimulation(1, OVTK_StimulationId_Label_00, date+1.1, 0)

Первая строка генерирует случайным числа 1 или 2. Две последующих шлют в поток стимулов, два стимула. Первый высылает через секунду после приема стимула от Clock - стимул демонстрации того или иного изображения. Второй высылает стимул гашение этого изображения. Если вам надо увеличить время демонстрации то добавьте к числу 1.1 столько сколько вам нужно (в секундах)

Обращаю внимание на важную деталь.
Как говориться дьявол в деталях.
При отправке новых стимулов надо брать именно date от пришедшей стимуляции, а не t полученного:
t = box:get_current_time()

Потому как при срабатывании скрипта на пришедший на 3 секунде стимул.
t = 3.047 - т.е. реально скрипт активируется с некоторой задержкой.
Поэтому если мы просто пошлем стимул
box:send_stimulation(1, OVTK_StimulationId_Label_00+gonogo, t, 0)
box:send_stimulation(1, OVTK_StimulationId_Label_00, t+0.1, 0)
В этом случае скрипт создаст стимул с временными смещениям 3.047 и 3.147.

Послать стимул строкой.
box:send_stimulation(1, OVTK_StimulationId_Label_00+gonogo, date, 0)
box:send_stimulation(1, OVTK_StimulationId_Label_00, date+0.1, 0)
Тоже нельзя т.к. OpenVibe блокирует генерацию стимула со временем меньшем текущего.
Поэтому по приходу стимула на 3 секунде мы создаем два стимула на 4 и 4.1 секундах.

19) Тестируем эксперимент.
Перед измерением все советую тестировать. Очень обидно когда намучаешься, а в итоге выясняется что какой-то из параметров оказался неверным или файл не сформировался.
Жмем Play(Стрелка)
Если все нормально должны открыться два окна окно изображения другое ввода данных.
В окне будут периодически вспыхивать различные изображения. Нажимаем кнопочку >>
если все нормально то через 15-20 секунд эксперимент остановится.

Часть 2. ИЗМЕРЕНИЕ.
'Цель близка, о сограждане! Очень близка!'
(Все поежились, как от морозу.
Впрочем, он заслужил два-три жидких хлопка,
Разливая повторную дозу.)

Т.к. амплитуда вызванного потенциала составляет около 10-15 мкВ (0.000015 Вольта) и по мимо специальных методов, очень важно добиться минимального сопротивления.

1) Переставим контакты опорных электродов с позиций T3, T4(так они идут с завода) на CMS,DRL. В этом случае снижаются шумы и контакт идет с открытым участком кожи.


2. Для смачивания электродов будем использовать не гламурные капли для контактных линз, а брутальный насыщенный рассол раствор поваренной соли. Который обладает лучшей проводимостью (но к сожалению и более сильной коррозионной активностью, поэтому электроды лучше потом снять и промыть водой).
При этом не капаем , а замачиваем электроды в соляном растворе.
Предварительно сняв их со шлема.

3. Закрываем все программы которые могут привести к появлению на экране всплывающих окон, быть источниками звуков и задержек работы компьютера (Skype , Explorer, закрываем все включая звуковой проигрыватель).

4. И только теперь достаем и слегка отжимаем от раствора электроды вытираем на сухо контактные площадки, устанавливаем их на шлем и одеваем его на себя или испытуемого. Рекомендую принять максимально удобное положение. Сидеть в течении 10 минут и нажимать на одну кнопку это крайне утомительный и скучный процесс.

5. Запускаем Control Panel убеждаемся что все каналы светят зеленым (ну вам эта процедура уже должна быть знакомой.)

6. Запускаем Acquisition Server выбираем в окне драйвера Emotiv Epoc.

Внимание! На Windows XP последняя версия не видит Emotiv Epoc 1.0.0.5 возможно вам придется создать директорию Program Files (x86) и перенести туда файлы. На Windows 7 этого делать судя по всему не надо.


7. Жмем кнопки Подключится и Воспроизвести. Внизу должна начать прыгать синяя шкала. Иногда с первого раза не включается. Повторить попытку.

8. Переключаемся в OpenVibe и нажимаем кнопку Play. Появившиеся два окна увеличиваем до комфортного размера черное окно Display Cue Image а затем переключаемся на окно Keyboard Stimualtor.

Внимание! Если этого не сделать реакция испытуемого не будет записана (соответственно использована для последующего анализа)

Через 10 минут Вы поймете что работа испытуемого - тяжела и изнурительна.
Если не сильно устали советую не снимать сразу шлем а немного передохнуть и записать еще раз. Имея два комплекта данных проще понять на сколько хорошо воспроизводятся результаты эксперимента.

Часть 3. Анализ данных.

Плыли много недель, много дней и ночей,
Нам встречались и рифы, и мели;
Но желанного Снарка, отрады очей,
Созерцать не пришлось нам доселе.

Не смотря на присутствие в OpenVibe практически всех средств для математической обработки вызванных потенциалов, но он крайне имеет их очень плохо отображает. Поэтому советую все же делать анализ именно в EEGLAB-е. Конечно это требует некоторых познаний в работе с MATLAB, но оно того стоит. Возможности визуализации и последующего тестирования собственных алгоритмов анализа и обработки полученных данных на порядок выше чем в OpenVibe. Пожалуй это наиболее доступное и мощное средство анализа вызванных потенциалов. Единственный недостаток заключается в том, что для использования последних версий требуется установленный MATLAB.

1) Запускаем MATLAB, заходим в директорию с файлами EEGLAB-а(предварительно надо скачать и распаковать) набираем в командной строке EEGLAB.
После чего откроется меню EEGLAB.

2) Импортируем данные.
Заходим в меню Import Data > Using BIOSIG Interface
Открываем в появившимся окне полученные в результате измерения EDF-файлы.
На все доп. запросы жмем OK.

Для вычисления вызванных потенциалов нам надо нарезать и сложить все отрезки времени (эпохи)отмеченными метками. В полученном мною файле 1257 - 6 типов.

1 - секундная метка (зачем не понятно но OpenVibe всегда ее пишет)
2 - метка очистки экрана OVTK_StimulationId_Label_00
3 - метка NOGO-стимула OVTK_StimulationId_Label_01
4 - метка GO-стимула OVTK_StimulationId_Label_02
5 - метка нажатия кнопки OVTK_StimulationId_Label_03
6 - метка отпускания кнопки OVTK_StimulationId_Label_04

Если будете менять порядок меток в LUA-файле он изменится и в EDF-е.

3) Формируем эпохи GO.
Выбираем меню Tools > Extract Epoch
В качестве метки выбираем 4 - это GO-стимул.
Советую ввести "Name for new dataset" - Go Epochs

На все запросы вводим OK.

4) Формируем эпохи NOGO.
Повторяем описанную процедуру с меткой 3.
Именуем датасет как - NoGO Epochs.

5) Строим вызванные потенциалы.
Для этого лезем в Sum/Compare ERPs
Datasets to Average - указываем число 2
Datasets to Substract - указываем число 3

Получили такую карту вызванных потенциалов для каждого датчика Emotiv.
Если щелкнуть по каналу откроется увеличенный график.
Лучше всего видны на O1 и O2, также есть сигнал на AF3 и AF4.


При анализе Я не делал никакой фильтрации. Т.к. после фильтрации компоненты становятся менее выраженными.

6) Построим ERP Image - это очень красивая и наглядная картинка показывающая как вызванный потенциал присутствует в каждом из измерений.
Для этого переключаемся на интересующий нас Dataset.
Выбираем Plot->Channel ERP Image.
В поле номер канала например 7 - O1 , 8 - O2 (номера каналов соответствуют нумерации у Emotiv)
Для GO-эпох можно отсортировать измерения по времени реакции пользователя.
ЗАполнив поля Epoch-sorting field (latency) а поле Event type(s) указать 5 - метка нажатия пользователем кнопки.

Изображение для GO канал O1

Четко видно что время реакции пользователя коррелирует с задержкой второй положительной компоненты. В тоже время когда первая положительная компонента не зависит от времени реакции и примерно постоянна.

Изображение для NOGO канал O1

В данном случае видно в случае NOGO-стимула что первая положительная компонента меньше, а вторая значительно меньше чем у NOGO.

7) Еще можно сделать анализ независимых компонент (ICA).
Данная процедура позволяет построить карту статистические независимые источники активности.

Для этого:
8) Выбираем GO-dataset.
Загружаем координаты электродов. (Edit->Channel Locations)

9) Запускаем Tools-"Run ICA"
Ждем порядка двух минут пока программа рассчитает коэффициенты.

Повторить аналогичную процедуру для NOGO датасета нельзя. Т.к. если
мы прогоним ICA на нем результаты будут несколько иными.
Поэтому чтобы сравнить данные импортируем полученные коэффициенты в NOGO датасет.

10) Делаем активным NOGO-датасет (DataSets->NOGO epoch)
Через пункт меню Edit->DataSet Info.
Напротив поля "ICA weights array" жмем кнопку From Other Dataset и указываем число 2
Если вы все делали в том порядке как Я писал.

Строим карты компонент через меню Plot -> Sum Compare Comp ERPs

У меня получилась такая карта.
Ну разложение сразу скажу не особо хорошее, и даже предварительная фильтрация не улучшает результат.


Номера компонент идут по убыванию их вклада.
1 и 2 - судя по расположению и структуре артефакты,
А вот 3 очень похож на моторную активацию.

Для GO стимула

Для NOGO стимула

4. Заключение.
Так внемлите, друзья! Вам поведаю я
Пять бесспорных и точных примет,
По которым поймете -- если только найдете,-
Кто попался вам -- Снарк или нет.

Что из всего этого полезного можно заключить:

1) Ну во первых ясный вывод что Emotiv таки можно использовать для измерения вызванных потенциалов, в простейших поведенческих тестах только необходимо учесть и по возможности исключить все источники фазового шума.

2) На самом деле вызванные потенциалы обладают достаточно большой амплитудой, и предварительная фильтрация сигнала не всегда улучшает соотношение сигнал-шум.

3) Лучше всего потенциалы вызванные визуальными стимулами измерять на каналах О1 и О2 в виду их хорошей синхронности можно сделать O1+O2 или взять ICA весовые коэффициенты из EEGLAB. Хотя у людей из разных возрастных категорий они могут отличаться.

4) На основе формы сигнала можно попробовать сделать адаптивный фильтр который позволит классифицировать сигналы БЕЗ предварительного накопления.

5) Локализацией источников у Emotive EPOC не очень хорошо получается видимо все-таки сказывается малое число каналов. Спасает то что электроды расположены в местах расположения основных генераторов и артефактов.

5. Материалы.
Кому лень собирать все самим вот архив с готовым проектом в папке processed set-ы для анализа в EEGLAB-е.

Архив с проектом OpenVibe.
В проекте потребуется поправить пути.

EDF-файлы с данными ЭЭГ.

В качестве пробы пера выкладываю видео процесса (без звуковой дорожки)
Если будет много страждущих, сделаю звук с комментариями. :)
В видео результаты несколько отличаются от изображенных в статье.


4 комментария:

  1. А зачем это надо вообще?
    Вернее для чего?
    И нужно ли?

    ОтветитьУдалить
    Ответы
    1. Хороший вопрос :)
      Ну лично для меня это просто интересно. Вне зависимости от практического значения. Тем не менее мог бы ответить так.

      Долгое время, исследователи задумывались почему человек поступает так или иначе. Под воздействием каких факторов он может изменить решение. Или наоборот какие факторы будут его отвлекать или наоборот стимулировать внимание.

      Ну а нейронаука и в частности вызванные потенциалы как один из ее методов пытается объективно исследовать, пожалуй самый совершенный и современный компьютер находящийся на планете Земля.

      Ну если совсем спуститься на землю.
      С помощью данного метода например если заменить картинки словами (логотипами, слоганами) можно построить семантическую карту (карту ассоциаций) - это можно использовать например в разработке более эффективной рекламы. Чтобы ай-фон покупали к примеру не по 1000$ а по 3000$, или на выборах была явка 110%.

      Ну и конечно как у любых фундаментальные исследование к чему они приведут разглядеть очень не просто. Но и когда разрабатывалась квантовая физика мало кто думал о ядерном оружии. Тоже самое к примеру закон тяготения Ньютона ... Ну кому было нужно знать с какой силой притягиваются какие-то там объекты. И без Ньютона яблоки падали на землю.

      Кто сейчас задается вопросами
      "Зачем это было нужно изучать квантовую физику? "
      "Зачем обезьяна слезла с дерева?"

      Удалить
  2. Добрый день. Тоже присматриваюсь к этому аппарату. У меня помимо схожих с вашими интересов- есть вопрос изучения и записи разных измененных состояний сознания, обработке этих записей возможной передаче на другого человека через мп3, картинки- как это уже делали с псилероном. Возможное создании сессий для майнд машины шива с электромагнитными катушками. Вы можете попробовать перевести запись eeg в звук? При этом один датчик отвечает за некий диапазон звуковой частоты, другой датчик тоже имеет свой кусок диапазона- и так далее..

    ОтветитьУдалить
  3. Здравствуй уважаемый mozgonavt. Компания xerox изобрела мышь и графику. сейчас все компы на ней. Компания EPOC продвигает ИМК, скоро все компы будут на ней. Кто думает иначе - тому не запретишь:). Мы скорешом давно интересуемся ИКМ. Проблема в том что мы по большей части электронщики:). Если не затруднит - включи звук на видео, а то без звука как то тяжело доходит.

    ОтветитьУдалить