Архив за месяц: Декабрь 2014
В лаборатории психофизиологии МГУ: ЭЭГ как инструмент реверс-инжиниринга мозга и интерфейс мозг-компьютер
(подключаем Катю к матрице ЭЭГ 32 канала с активными электродами)
Как «пакмэны жрут несуществующий квадрат», какая часть мозга генерирует иллюзии, какого цвета цифры, как психофизиологи обрабатывают многомерные сигналы и может ли это привести к реверс-инжинирингу мозга.
Под катом поверхностное описание аппарата, немного про обработку сигнала и про те исследования, которые проводят молодые ученые психо- нейрофизиологи и какие вызовы есть для программистов, которые хотят изучать мозг и/или работать в проекте по изучению мозга.
Удобно расположитесь в кресле, откиньтесь на спинку и сделайте глубокий вдох
ЭЭГ-шлем с системой ActiChamp от Brainproducts™ оснащен активными биосенсорами (до 128 каналов), которые улавливают мельчайшие изменения электрических сигналов от мозга человека с экстремально высокими скоростями дискретизации – до 100 КГц!
256 каналов
Активные, в противоположность пассивным, электроды оснащены встроенными в них микрочипами – предусилителями, которые оцифровывают аналоговый сигнал и передают его с наименьшими искажениями.
Электроды устанавливаются над всеми важными для анализа областями мозга и синхронно передают сигнал на блоки усилителей либо с помощью шлейфа, либо по wi-fi – по 32 канала на блок с пропускной полосой в 1000 Гц и частотой дискретизации до 5000 Гц в противоположность 500 Гц некоторых медицинских ЭЭГ, не говоря о нейрогарнитурах).
Wi-fi модуль
После того, как сигналы поступают на блоки усилителей (уровень шума ≤ 2 μVpp), их путь не оканчивается. Дальше они передаются по двойному оптоволоконному кабелю на USB-адаптер, в который также поступают и внешние сигналы (триггеры) для синхронизации с внешними устройствами, например EyeTracker’ом (о нем в след. раз). USB-адаптер служит коннектором с ПК.
Основная задача всех элементов-посредников в минимизации искажений и задержек в сигнале, мощность которого измеряется лишь десятками микровольт
Дополнительные блоки для регистрации т.н. периферических показателей, которые отражают вегетативные процессы, такие как: кардиоритм, тонус сосудов, дыхание, температура, движения, активность мышц и т.п., всего до 128 каналов дополнительно.
Датчики
Сопротивление кожи, термодатчик, акселерометр, пульсометр оптический
Вот на ком делают измерения, когда нет студентов
Софт и обработка сигнала
Софт для обработки и анализа ЭЭГ обладает широким функционалом с возможностью интегрировать данные МРТ для локализации электрических сигналов учитывая индивидуальную конституцию мозга конкретного человека. Собственно система сама располагает модулем, который называется «томографией низкого разрешения» (LORETA) (*речь идет не о технической реализации – магнитная или позитронно эмиссионная, а о принципе визуализации и картирования мозга).
Одна из основных проблем для точности – это артефакты. Под этим термином понимаются искажения сигнала внешними или внутренними факторами, будь то движения глаз или наводка в 100 Гц от ламп дневного света.
Несмотря на кажущееся совершенство технологии регистрации ЭЭГ, недостатки все же присутствуют. Пожалуй, основной из них — необходимость использования электропроводной пасты или геля для снижения сопротивления между скальпом и электродами. Технология в целом также не является самодостаточной, и тенденция последнего времени сходится к комбинации различных методов. Уже сейчас используются электроды, которые работают в магнитном поле томографа (порядка 10 Тесла).
Пунктир — это внешний стимул. Фагмент ЭЭГ-сигнала (слева), попытки локализовать источник в трехмерном пространстве (посередине) и в проекции на скальп (справа)
Фрагмент записанной ЭЭГ
Вот такими кривульками наш мозг видит мир. Ну а если серьезно, то это ПСС (потенциалы, связанные с событиями), которые отражают чистый (специально записанный и отфильтрованный) отклик групп нейронов на тот или иной стимул. Тут они всем скопом по всем отведениям. Потенциальная и пока (а может и вообще) неразрешимая задача состоит в обратном: восстановить, что же видел/слышал/представлял/трогал человек в этот момент?
Снизу — ПСС, но не всем скопом, а по тому, как они были зарегистрированы в разных отведениях.
Карта подэлектродной локализации активности, посекундно — от картинки к картинке
3d-вид
Фурье-преобразование сигнала, зарегистрированного под разными электродами.
Непрерывное вейвлет-преобразование ЭЭГ. (Первое правило психофизиологов — никому не говорить про вейвлет. Шутка.) Вейвлет нам нужен для того, чтобы посмотреть частотную составляющую ЭЭГ (разные ритмы состоят из разных частот и отражают разные состояния человека) и рассмотреть это все во временной перспективе.
Люди
Внимание
Вячеслав Лебедев, сотрудник и аспирант кафедры психофизиологии МГУ им. М.В. Ломоносова, со-основатель проекта NeuroFuture, психофизиолог:
«Суть моей научной работы — исследование роли внимания в процессах кросс-модальной интеграции.
Расшифровка: Информация, поступающая из внешней среды, как правило, состоит из сигналов разных модальностей (слуховой, зрительной и т.д.). Обработка этой мультисенсорной информации требует синхронной совместной работы структур мозга, задействованных в обрабтке сигналов определенной модальности. Современные исследования на уровне отдельных нейронов показывают существование нейронов в различных областях и уровнях головного мозга, функцией которых является обработка именно мультисенсорной информации. Но открытым остается вопрос системного объединения этих разноуровневых структур в процессе обработки потока мультисенсорной информации, а также о роли произвольного (инициируемого самим человеком) и непроизвольного (вызванного внешними событиями) внимания в этом процессе. ЭЭГ — один из самых информативных методов исследования этого процесса в динамике.»
(Найдите собачку)
Иллюзии
Илья Захаров, аспирант кафедры психофизиологии МГУ им. М.В. Ломоносова, со-основатель проекта NeuroFuture, психофизиолог:
«Психофизиология пытается связать идеальное (психологию и „душу“, если она есть) и материальное (то, что можно исследовать естественно-научными методами). Получается с переменным успехом, но это интересно
Есть такие штуки — иллюзии. Что же происходит в мозге, когда мы их видим? Существует ли универсальный паттерн мозговой активности, одинаковый для всех людей, характерный только для тех моментов, когда мы видим зрительную иллюзию? А что делать, если мы смотрим на любимого человека и у нас вдруг возникает этот паттерн?
Посредством записи различных паттернов на ЭЭГ можно объективно зарегистрировать у человека восприятие нового для него типа иллюзии (например, нового варианта иллюзии субъективного контура). Для этого используется метод связанных с событием потенциалов: выделение из общего сигнала ЭЭГ того компонента, который появляется при предъявлении иллюзии.
Черный график — просто стимул, красный — иллюзия, пунктир — момент предъявления стимула
Справа — ответ мозга на предъявление классического типа иллюзий по сравнению со стимулом, когда мозгу ничего не надо достраивать
Слева — ответ на предъявление нового типа, опять же, по сравнению с тем, когда не надо достраивать
Мы видим, что в одном и том же месте (компонент N170) амплитуда сигнала в ответ на иллюзию больше. Этот ответ — объективная мера нашего восприятия иллюзии. Если мы видим и прямые, и волнистые иллюзорные контуры на одинаковом психофизиологическом уровне, вероятно, в обоих случаях мы используем одинаковые механизмы формирования образа.»
Программирование и обработка многомерных сигналов
Костя Славнов, программист
— Какой внутренний мотив сподвиг математика пойти работать над нейросайнс-проектом?
— Интерес. Мне всегда было интересно узнать, как работает мозг человека. К тому моменту я уже достаточно много знал о возможностях метода анализа данных применительно к мозгу. Все они основываются на обработке многомерных сигналов. А у меня была именно такая тематика курсовой работы.
Как всегда большую роль сыграла случайность. я прочитал статью об Илье и решил написать ему про себя: что я — математик-программист, интересна эта тема. А ребятам как раз не хватало человека с моими навыками. И я быстро включился в работу.
Синестезия
Мария Степаненко, студентка кафедры психофизиологии МГУ им. М.В. Ломоносова, психофизиолог, исследователь синестезии
«Синестезия — это, грубо говоря, связь различных модальностей. Проявляется она в виде переживания ощущений в одной модальности во время предъявления стимулов в другой.
Можете ли вы быстро найти „цветной“ треугольник?
Вообще, синестезия — безумно интересное, но и очень малоизученное явление. Существует невероятное множество различных ее видов: некоторые синестеты „видят“ цвета определенных букв/дней недели/месяцев, кто-то из них „чувствует“ запахи при произнесении определенных слов, кто-то „ощущает“ текстуру голоса/запаха, „чувствует“ вкус имен, „слышит“ движение и так далее. Более того, у большинства синестетов проявляется связь не двух, но множества модальностей, и, таким образом, проявляются различные виды синестезии.
Существует достаточно много гипотез относительно того, каким образом возникают синестетические ощущения. В моем исследовании ставится вопрос о том, на каком уровне происходит данный процесс: только ли это перцептивные ощущения, обработка которых происходит на низших уровнях, или же это высокоуровневый, когнитивный процесс.
Акцент ставится на аудиовизуальной синестезии, а именно — на связи тонов и тембров с различными цветами. В качестве испытуемых выступают как синестеты, так и люди, не обладающие синестетическими ощущениями. В ходе эксперимента (а именно — в момент предъявления звуковых стимулов) производится запись ЭЭГ, и впоследствии — анализ данных путем сравнения ПСС, зарегистрированных у синестетов и несинестетов.
К слову об испытуемых: если вас интересует данная тема, или вдруг у вас есть знакомые синестеты, или, внезапно, вы сами обнаружили у себя наличие подходящего для данного исследования вида аудиовизуальной синестезии — смело обращайтесь ко мне, я буду рада видеть вас в числе своих испытуемых!»
Выступление на TED нейроученого
Тест на синестезию «цвет цифры» (Слева — то, как видит картинку обычный человек; справа — видение синестета: треугольник из двоек сразу выделяется другим цветом, вследствие чего синестет без труда и довольно быстро может указать на все двойки на картинке)
Обработка данных
Андрей Учаев, студент кафедры психофизиологии МГУ им. М.В. Ломоносова, психофизиолог:
«Моя позиция по получению экспериментальных данных была хорошо отражена в словах героя одной игры: „… мы просто бросаем наукой в стенку и смотрим, что прилипнет..“ Это говорит о том, что в исследовании я стараюсь получить максимум данных, которые вообще можно выжать из электрофизиологического сигнала.
Сейчас я зациклен скорее на следующем: на отработке различных методов обработки сигнала независимо от поставленной задачи. Помощь программистов тут огромна. Встречаются различные проблемы: бывает, что не все методы обработки представлены в одной программе, или же нет доступа ко всему функционалу — приходится изворачиваться, и не всегда это удается.
И есть еще одна немаловажная проблема — экономия времени. Довольно часто бывает необходимо обработать данные десяти человек, используя 10-15 различных преобразований. Тут бы не помешало написание скриптов, которые позволят автоматизировать задачу. Нажал на кнопку и пошел домой — а утром все уже обработано.»
Заключение
«Нейронаукам нужны программисты». Так говорят и русские коллеги, а зарубежные нейроученые даже обращаются к хакерам. Потому что очень скоро нам, не дай бог возможно, потребуются не только инструменты обеспечения приватности сообщений от технического перехвата, но и мыслей.
Как писал Азимов, что «для человечества осталось две загадки — глубины космоса и тайна мозга», радует, что Хабр очень приветствует космонавтику, надеюсь, что то же самое произойдет и с изучением мозга.
ссылка на оригинал статьи http://habrahabr.ru/company/neuronspace/blog/235399/
Replication slots в PostgreSQL
На сегодняшний момент доступен первый кандидат в релизы. В качестве тестового стенда выбраны 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/