В лаборатории психофизиологии МГУ: ЭЭГ как инструмент реверс-инжиниринга мозга и интерфейс мозг-компьютер

В научно-исследовательском комплексе психофизиологии факультета психологии МГУ находится, пожалуй, один из самых точных и скоростных энцефалографов в мире. Специально для научных исследований может использоваться одновременно до 258 каналов в пассивном режиме, позволяющих синхронно регистрировать и анализировать электроэнцефалограмму (ЭЭГ) в режиме реального времени.


(подключаем Катю к матрице ЭЭГ 32 канала с активными электродами)

Как «пакмэны жрут несуществующий квадрат», какая часть мозга генерирует иллюзии, какого цвета цифры, как психофизиологи обрабатывают многомерные сигналы и может ли это привести к реверс-инжинирингу мозга.

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


Удобно расположитесь в кресле, откиньтесь на спинку и сделайте глубокий вдох


ЭЭГ-шлем с системой ActiChamp от Brainproducts™ оснащен активными биосенсорами (до 128 каналов), которые улавливают мельчайшие изменения электрических сигналов от мозга человека с экстремально высокими скоростями дискретизации – до 100 КГц!

256 каналов

image

image
256 каналов


Активные, в противоположность пассивным, электроды оснащены встроенными в них микрочипами – предусилителями, которые оцифровывают аналоговый сигнал и передают его с наименьшими искажениями.

Электроды устанавливаются над всеми важными для анализа областями мозга и синхронно передают сигнал на блоки усилителей либо с помощью шлейфа, либо по wi-fi – по 32 канала на блок с пропускной полосой в 1000 Гц и частотой дискретизации до 5000 Гц в противоположность 500 Гц некоторых медицинских ЭЭГ, не говоря о нейрогарнитурах).

Wi-fi модуль

После того, как сигналы поступают на блоки усилителей (уровень шума ≤ 2 μVpp), их путь не оканчивается. Дальше они передаются по двойному оптоволоконному кабелю на USB-адаптер, в который также поступают и внешние сигналы (триггеры) для синхронизации с внешними устройствами, например EyeTracker’ом (о нем в след. раз). USB-адаптер служит коннектором с ПК.


Основная задача всех элементов-посредников в минимизации искажений и задержек в сигнале, мощность которого измеряется лишь десятками микровольт


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

Датчики

Сопротивление кожи, термодатчик, акселерометр, пульсометр оптический


Вот на ком делают измерения, когда нет студентов

Софт и обработка сигнала

Софт для обработки и анализа ЭЭГ обладает широким функционалом с возможностью интегрировать данные МРТ для локализации электрических сигналов учитывая индивидуальную конституцию мозга конкретного человека. Собственно система сама располагает модулем, который называется «томографией низкого разрешения» (LORETA) (*речь идет не о технической реализации – магнитная или позитронно эмиссионная, а о принципе визуализации и картирования мозга).

Одна из основных проблем для точности – это артефакты. Под этим термином понимаются искажения сигнала внешними или внутренними факторами, будь то движения глаз или наводка в 100 Гц от ламп дневного света.

Несмотря на кажущееся совершенство технологии регистрации ЭЭГ, недостатки все же присутствуют. Пожалуй, основной из них — необходимость использования электропроводной пасты или геля для снижения сопротивления между скальпом и электродами. Технология в целом также не является самодостаточной, и тенденция последнего времени сходится к комбинации различных методов. Уже сейчас используются электроды, которые работают в магнитном поле томографа (порядка 10 Тесла).


Пунктир — это внешний стимул. Фагмент ЭЭГ-сигнала (слева), попытки локализовать источник в трехмерном пространстве (посередине) и в проекции на скальп (справа)


Фрагмент записанной ЭЭГ


Вот такими кривульками наш мозг видит мир. Ну а если серьезно, то это ПСС (потенциалы, связанные с событиями), которые отражают чистый (специально записанный и отфильтрованный) отклик групп нейронов на тот или иной стимул. Тут они всем скопом по всем отведениям. Потенциальная и пока (а может и вообще) неразрешимая задача состоит в обратном: восстановить, что же видел/слышал/представлял/трогал человек в этот момент?


Снизу — ПСС, но не всем скопом, а по тому, как они были зарегистрированы в разных отведениях.


Карта подэлектродной локализации активности, посекундно — от картинки к картинке


3d-вид


Фурье-преобразование сигнала, зарегистрированного под разными электродами.


Непрерывное вейвлет-преобразование ЭЭГ. (Первое правило психофизиологов — никому не говорить про вейвлет. Шутка.) Вейвлет нам нужен для того, чтобы посмотреть частотную составляющую ЭЭГ (разные ритмы состоят из разных частот и отражают разные состояния человека) и рассмотреть это все во временной перспективе.

Люди

Внимание

Вячеслав Лебедев, сотрудник и аспирант кафедры психофизиологии МГУ им. М.В. Ломоносова, со-основатель проекта NeuroFuture, психофизиолог:
«Суть моей научной работы — исследование роли внимания в процессах кросс-модальной интеграции.
Расшифровка: Информация, поступающая из внешней среды, как правило, состоит из сигналов разных модальностей (слуховой, зрительной и т.д.). Обработка этой мультисенсорной информации требует синхронной совместной работы структур мозга, задействованных в обрабтке сигналов определенной модальности. Современные исследования на уровне отдельных нейронов показывают существование нейронов в различных областях и уровнях головного мозга, функцией которых является обработка именно мультисенсорной информации. Но открытым остается вопрос системного объединения этих разноуровневых структур в процессе обработки потока мультисенсорной информации, а также о роли произвольного (инициируемого самим человеком) и непроизвольного (вызванного внешними событиями) внимания в этом процессе. ЭЭГ — один из самых информативных методов исследования этого процесса в динамике.»

image
(Найдите собачку)

Иллюзии

Илья Захаров, аспирант кафедры психофизиологии МГУ им. М.В. Ломоносова, со-основатель проекта NeuroFuture, психофизиолог:
«Психофизиология пытается связать идеальное (психологию и „душу“, если она есть) и материальное (то, что можно исследовать естественно-научными методами). Получается с переменным успехом, но это интересно


Есть такие штуки — иллюзии. Что же происходит в мозге, когда мы их видим? Существует ли универсальный паттерн мозговой активности, одинаковый для всех людей, характерный только для тех моментов, когда мы видим зрительную иллюзию? А что делать, если мы смотрим на любимого человека и у нас вдруг возникает этот паттерн?


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


Черный график — просто стимул, красный — иллюзия, пунктир — момент предъявления стимула
Справа — ответ мозга на предъявление классического типа иллюзий по сравнению со стимулом, когда мозгу ничего не надо достраивать
Слева — ответ на предъявление нового типа, опять же, по сравнению с тем, когда не надо достраивать

Мы видим, что в одном и том же месте (компонент N170) амплитуда сигнала в ответ на иллюзию больше. Этот ответ — объективная мера нашего восприятия иллюзии. Если мы видим и прямые, и волнистые иллюзорные контуры на одинаковом психофизиологическом уровне, вероятно, в обоих случаях мы используем одинаковые механизмы формирования образа.»

Программирование и обработка многомерных сигналов

Костя Славнов, программист
— Какой внутренний мотив сподвиг математика пойти работать над нейросайнс-проектом?
— Интерес. Мне всегда было интересно узнать, как работает мозг человека. К тому моменту я уже достаточно много знал о возможностях метода анализа данных применительно к мозгу. Все они основываются на обработке многомерных сигналов. А у меня была именно такая тематика курсовой работы.
Как всегда большую роль сыграла случайность. я прочитал статью об Илье и решил написать ему про себя: что я — математик-программист, интересна эта тема. А ребятам как раз не хватало человека с моими навыками. И я быстро включился в работу.

Синестезия

Мария Степаненко, студентка кафедры психофизиологии МГУ им. М.В. Ломоносова, психофизиолог, исследователь синестезии

«Синестезия — это, грубо говоря, связь различных модальностей. Проявляется она в виде переживания ощущений в одной модальности во время предъявления стимулов в другой.


Можете ли вы быстро найти „цветной“ треугольник?

Вообще, синестезия — безумно интересное, но и очень малоизученное явление. Существует невероятное множество различных ее видов: некоторые синестеты „видят“ цвета определенных букв/дней недели/месяцев, кто-то из них „чувствует“ запахи при произнесении определенных слов, кто-то „ощущает“ текстуру голоса/запаха, „чувствует“ вкус имен, „слышит“ движение и так далее. Более того, у большинства синестетов проявляется связь не двух, но множества модальностей, и, таким образом, проявляются различные виды синестезии.

Существует достаточно много гипотез относительно того, каким образом возникают синестетические ощущения. В моем исследовании ставится вопрос о том, на каком уровне происходит данный процесс: только ли это перцептивные ощущения, обработка которых происходит на низших уровнях, или же это высокоуровневый, когнитивный процесс.
Акцент ставится на аудиовизуальной синестезии, а именно — на связи тонов и тембров с различными цветами. В качестве испытуемых выступают как синестеты, так и люди, не обладающие синестетическими ощущениями. В ходе эксперимента (а именно — в момент предъявления звуковых стимулов) производится запись ЭЭГ, и впоследствии — анализ данных путем сравнения ПСС, зарегистрированных у синестетов и несинестетов.

К слову об испытуемых: если вас интересует данная тема, или вдруг у вас есть знакомые синестеты, или, внезапно, вы сами обнаружили у себя наличие подходящего для данного исследования вида аудиовизуальной синестезии — смело обращайтесь ко мне, я буду рада видеть вас в числе своих испытуемых!»

Выступление на TED нейроученого

image
Тест на синестезию «цвет цифры» (Слева — то, как видит картинку обычный человек; справа — видение синестета: треугольник из двоек сразу выделяется другим цветом, вследствие чего синестет без труда и довольно быстро может указать на все двойки на картинке)

Обработка данных

Андрей Учаев, студент кафедры психофизиологии МГУ им. М.В. Ломоносова, психофизиолог:
«Моя позиция по получению экспериментальных данных была хорошо отражена в словах героя одной игры: „… мы просто бросаем наукой в стенку и смотрим, что прилипнет..“ Это говорит о том, что в исследовании я стараюсь получить максимум данных, которые вообще можно выжать из электрофизиологического сигнала.

image
Сейчас я зациклен скорее на следующем: на отработке различных методов обработки сигнала независимо от поставленной задачи. Помощь программистов тут огромна. Встречаются различные проблемы: бывает, что не все методы обработки представлены в одной программе, или же нет доступа ко всему функционалу — приходится изворачиваться, и не всегда это удается.

image
И есть еще одна немаловажная проблема — экономия времени. Довольно часто бывает необходимо обработать данные десяти человек, используя 10-15 различных преобразований. Тут бы не помешало написание скриптов, которые позволят автоматизировать задачу. Нажал на кнопку и пошел домой — а утром все уже обработано.»

Заключение

«Нейронаукам нужны программисты». Так говорят и русские коллеги, а зарубежные нейроученые даже обращаются к хакерам. Потому что очень скоро нам, не дай бог возможно, потребуются не только инструменты обеспечения приватности сообщений от технического перехвата, но и мыслей.

Как писал Азимов, что «для человечества осталось две загадки — глубины космоса и тайна мозга», радует, что Хабр очень приветствует космонавтику, надеюсь, что то же самое произойдет и с изучением мозга.

ссылка на оригинал статьи http://habrahabr.ru/company/neuronspace/blog/235399/

Replication slots в PostgreSQL

До девятой версии в PostgreSQL для создания «теплого» резервного сервера использовался WAL archiving. В версии 9.0 появилась потоковая репликация с возможностью создания «горячего» read-only сервера. В следующей версии PostgreSQL 9.4 появится новый функционал для создания потоковой репликации под названием replication slots. Рассмотрим что он собой представляет и чем отличается от предыдущих способов.
На сегодняшний момент доступен первый кандидат в релизы. В качестве тестового стенда выбраны 2 виртуалки под Ubuntu 14.04. Процесс сборки и установки одинаков для основного и резервного серверов. Ставим из исходников, предварительно поставив необходимые пакеты:

sudo apt-get update && sudo apt-get -y install make g++ checkinstall libreadline6-dev zlib1g-dev  

Скачиваем и распаковываем архив из репозитория:

wget https://ftp.postgresql.org/pub/source/v9.4rc1/postgresql-9.4rc1.tar.gz  tar xzf postgresql-9.4rc1.tar.gz  

Собираем и устанавливаем пакет:

cd postgresql-9.4rc1/  ./configure  make  sudo checkinstall  

По умолчанию бинарники для работы с СУБД ставятся в /usr/local/pgsql/.
Добавим пользователя postgres в систему:

sudo useradd -M postgres  

Создадим директорию для кластера:

sudo mkdir -p /data/db  sudo chown postgres:postgres /data/db  sudo chmod 0700 /data/db  

Далее выполняем действия на основном сервере. Инициализируем кластер:

sudo -u postgres /usr/local/pgsql/bin/initdb -D /data/db 

Кроме структуры кластера, initdb создаст дефолтные конфиги. Создадим в кластере директорию pg_log, в которой будут хранится логи:

sudo -u postgres mkdir /data/db/pg_log  sudo -u postgres chmod 0700 /data/db/pg_log  

Добавим записи в pg_hba.conf для подключения пользователей и чтобы резервный сервер мог забирать WAL-логи с основного:

host    all	                    all	                  192.168.1.0/24              md5  host    replication         replica           192.168.1.108/32          md5  

В конфиге postgresql.conf правим параметры:
listen_addresses = ‘*’ — слушать входящие соединения на всех интерфейсах
wal_level = hot_standby — необходимый формат WAL-логов для репликации
max_wal_senders = 2 — количество одновременных соединений для репликации
logging_collector = on — логи складываем в pg_log

Запускаем наш кластер:

sudo -u postgres /usr/local/pgsql/bin/pg_ctl -D /data/db start 

Смотрим состояние процессов:

ps aux | grep postgres  postgres 21295  0.0  0.0  23700   604 ?        Ss   13:39   0:00 postgres: logger process                  postgres 21297  0.0 13.6 170880 138408 ?  Ss   13:39   0:01 postgres: checkpointer process            postgres 21298  0.0  5.0 170784 51076 ?     Ss   13:39   0:00 postgres: writer process                  postgres 21299  0.0  0.5 170648  5148?       Ss   13:39   0:00 postgres: wal writer process              postgres 21300  0.0  0.1 171052  1836 ?      Ss   13:39   0:00 postgres: autovacuum launcher process     postgres 21301  0.2  0.1  25924  1060 ?        Ss   13:39   0:17 postgres: stats collector process 

Создадим пользователя replica с правами на репликацию:

/usr/local/pgsql/bin/psql -U postgres -c "create user replica with replication encrypted password '123'"  

Создадим тестовую базу с данными:

/usr/local/pgsql/bin/createdb -U postgres testdb  /usr/local/pgsql/bin/psql -U postgres -d testdb -c "create table testtable (id serial, data text)"  /usr/local/pgsql/bin/psql -U postgres -d testdb -c "insert into testtable select nextval('testtable_id_seq'::regclass), md5(generate_series(1,1000000)::text)" 

Настроим резервный сервер.
Создадим директорию для кластера:

sudo mkdir -p /data/db  sudo chmod 0700 /data/db  sudo chown postgres:postgres /data/db 

При помощи утилиты pg_basebackup сделаем резервную копию основного сервера:

sudo -u postgres /usr/local/pgsql/bin/pg_basebackup -h 192.168.1.103 -U replica -D /data/db -X s  

pg_basebackup копирует всё содержимое кластера, включая конфиги, поэтому изменяем параметр hot_standby в состояние on в postgresql.conf
Создадим файл recovery.conf в директории кластера, в котором укажем параметры подключения к основному серверу:

standby_mode='on'  primary_conninfo='host=192.168.1.103 port=5432 user=replica password=123'  

Запускаем кластер на резервном сервере:

sudo -u postgres /usr/local/pgsql/bin/pg_ctl -D /data/db start 

После этого на основном сервере должен запуститься процесс wal_sender, а на резервном wal_receiver:

Скрытый текст

postgres 21295  0.0  0.0  23700   604 ?        Ss   13:39   0:00 postgres: logger process                  postgres 21297  0.0  0.2 170756  2312 ?      Ss   13:39   0:00 postgres: checkpointer process            postgres 21298  0.0  0.2 170784  2252 ?      Ss   13:39   0:00 postgres: writer process                  postgres 21299  0.0  0.5 170648  5148 ?      Ss   13:39   0:00 postgres: wal writer process              postgres 21300  0.0  0.1 171052  1804 ?      Ss   13:39   0:00 postgres: autovacuum launcher process     postgres 21301  0.0  0.1  25924  1060 ?       Ss   13:39   0:00 postgres: stats collector process           postgres 21323  0.0  0.2 171048  2108 ?      Ss   13:46   0:00 postgres: wal sender process replica 192.168.1.108(56673) streaming 0/4E000210   postgres 15150  0.0  0.0  23700   612 ?       Ss   13:46   0:00 postgres: logger process                  postgres 15151  0.0  0.1 170788  1496 ?     Ss   13:46   0:00 postgres: startup process   recovering 00000001000000000000004E  postgres 15152  0.0  0.0 170680   944 ?       Ss   13:46   0:00 postgres: checkpointer process            postgres 15153  0.0  0.1 170680  1204 ?      Ss   13:46   0:00 postgres: writer process                  postgres 15154  0.0  0.0  25792   648 ?        Ss   13:46   0:00 postgres: stats collector process         postgres 15155  0.6  0.1 174956  1660 ?      Ss   13:46   0:00 postgres: wal receiver process   streaming 0/4E000138 

Посмотреть состояние репликации можно через представление pg_stat_replication на основном сервере

testdb=# select * from pg_stat_replication;  -[ RECORD 1 ]----+------------------------------  pid              | 21987  usesysid         | 16384  usename          | replica  application_name | walreceiver  client_addr      | 192.168.1.108  client_hostname  |  client_port      | 56674  backend_start    | 2014-11-25 18:30:09.206434+03  backend_xmin     |  state            | streaming  sent_location    | 0/5A2D8E60  write_location   | 0/5A2D8E60  flush_location   | 0/5A2D8E60  replay_location  | 0/5A2D8E60  sync_priority    | 0  sync_state       | async  

Видно, что основной и резервный сервер синхронизированны. Теперь сгенерим еще немного тестовых данных и сразу после этого посмотрим состояние репликации.

testdb=# insert into testtable select nextval('testtable_id_seq'::regclass), md5(generate_series(1,1000000)::text);  INSERT 0 1000000  testdb=# select * from pg_stat_replication;  -[ RECORD 1 ]----+------------------------------  pid              | 21987  usesysid         | 16384  usename          | replica  application_name | walreceiver  client_addr      | 192.168.1.108  client_hostname  |  client_port      | 56674  backend_start    | 2014-11-25 18:30:09.206434+03  backend_xmin     |  state            | streaming  sent_location    | 0/63800000  write_location   | 0/63680000  flush_location   | 0/63680000  replay_location  | 0/6136E160  sync_priority    | 0  sync_state       | async 

Здесь мы наблюдаем, что резервный сервер забрал с основного все WAL-логи, но еще не успел их все применить, поэтому он отстает от основного. По умолчанию, в postgres репликация происходит асинхронно при помощи WAL-логов, это бинарные файлы фиксированного размера в 16Мб, которые находятся в директории pg_xlog. Их количество можно менять при помощи параметров checkpoint_segments и wal_keep_segments. Когда количество измененных данных в кластере превышает общий размер WAL-логов, запускается процесс checkpointer, который сбрасывает WAL-логи в дата-файлы. После этого WAL-логи пересоздаются заново. В текущей стабильной версии postgres основной сервер не учитывает состояние резервного сервера. Поэтому если резервный слишком «отстал» от основного, то на основном WAL-логи пересоздадутся до того, как их заберет резервный. Попробуем смоделировать эту ситуацию.
Временно запретим резервному серверу подключаться на порт 5432:

sudo iptables -A OUTPUT -m tcp -p tcp —dport 5432 -j DROP 

Сгенерим еще данных на основном сервере:

testdb=# insert into testtable select nextval('testtable_id_seq'::regclass), md5(generate_series(1,1000000)::text);  INSERT 0 1000000 

Сбросим правило iptables и посмотрим логи резервного сервера, в которых наблюдаем такую неприятную картину.

LOG:  started streaming WAL from primary at 0/78000000 on timeline 1  FATAL:  could not receive data from WAL stream: ERROR:  requested WAL segment 000000010000000000000078 has already been removed 

Основной сервер удалил WAL-логи до того, как их успел забрать резервный. Теперь придется заново делать резервную копию основного сервера. Проблема в том, что основной сервер не учитывает состояние резервного. Поэтому если есть проблемы с сетью или просто медленный канал между серверами, то при интенсивной загрузке и/или изменении данных на основном сервере, возникает риск поломки репликации. Частичным решением является увеличение значения параметра wal_keep_segments, и включение WAL archiving. Но в версии 9.4 появятся replication slots. Рассмотрим как это работает:
На основном сервере создадим репликационный слот:

testdb=# SELECT pg_create_physical_replication_slot('standby_slot');  -[ RECORD 1 ]-----------------------+----------------  pg_create_physical_replication_slot | (standby_slot,)  

testdb=# select * from pg_replication_slots;  -[ RECORD 1 ]+-------------  slot_name    | standby_slot  plugin       |  slot_type    | physical  datoid       |  database     |  active       | f  xmin         |  catalog_xmin |  restart_lsn  |  

На резервном добавим к существующему содержимому файла recovery.conf строку
primary_slot_name = ‘standby_slot’

После перезапуска резервного сервера снова отключим его от основного и сгенерим на основном тестовые данных, которые превышают объем WAL-логов:

testdb=# insert into testtable select nextval('testtable_id_seq'::regclass), md5(generate_series(1,10000000)::text);  

Посмотрим параметры WAL-логов в системе, а потом реальное количество журнальных файлов в каталоге pg_xlog:

testdb=# show checkpoint_segments;  -[ RECORD 1 ]-------+--  checkpoint_segments | 3  

testdb=# show wal_keep_segments;  -[ RECORD 1 ]-----+--  wal_keep_segments | 0  

testdb=#\! ls /data/db/pg_xlog | wc -l  50 

Для расчета максимального количества WAL-файлов в системе используют формулу: (2 + checkpoint_completion_target) * checkpoint_segments + 1.
Однако текущее количество WAL-логов в системе значительно выше. Репликационные слоты сохраняют информацию о количестве скаченных WAL-логов каждым резервным сервером. Теперь WAL-логи будут копиться до тех пор, пока последний резервный сервер не заберет их или пока не будет удален репликационный слот. По мере скачивания WAL-логов, директория pg_xlog на основном сервере будет уменьшаться. Сбросив правило iptables на резервном сервере, в логах видим, что репликация возобновилась.

testdb=#\! tail -f /data/db/pg_log/postgresql-2014-11-27_191036.log  Is the server running on host "192.168.1.103" and accepting TCP/IP connections on port 5432? 	  LOG:  started streaming WAL from primary at 0/A0000000 on timeline 1 

Replication slots это отличный инструмент, повышающий надежность и удобство репликации в PostgreSQL.

Описание replication slots на официальном сайте PostgreSQL: www.postgresql.org/docs/9.4/static/warm-standby.html#STREAMING-REPLICATION-SLOTS

ссылка на оригинал статьи http://habrahabr.ru/post/245847/