С развитием рынка Kit-наборов по электронике стало достаточно просто изготовить силами подростковой проектной группы нейроинтерфейс для управления какой-либо моделью (например, моделью игрушечного вертолета, квадрокоптера и т. д.).
Нейроинтерфейс [4] или «интерфейс мозг — компьютер» (ИМК, англ. BCI) — это устройство, распознающее сигналы мозга и передающие их специализированным компьютерным программам.
Изготовить одноканальный ИМК можно на основе– модуля TGAM1, модуля Bluetooth BT04-A (он же SPP-C) и 3.3В DC-DC преобразователя к элементу питания 1.5В (рис. 1) или же обойтись и без преобразователя –двумя элементами питания по 1.5В. Добавим к этому батарейный отсек для двух элементов питания и три «сухих» электрода. Экранированный референтный электрод и неэкранированный GND электрод разместим на ушных клипсах; а основной экранированный для снятия энцефалографических сигналов с поверхности головы вместе с остальными составными частями собираемого устройства — на креплении от лицевого защитного щитка.
Готовое устройство (рис.2) представляет собой одноканальный электроэнцефалограф и анализ процесса снятия энцефалограммы и документации к TGAM1 приводит нас к следующему выводу. Электрод воспринимает микротоки от популяций нейронов вместе с шумами и артефактами. По экранированному проводу эти микротоки поступают на аппаратную фильтрацию в микрочип TGAT1 на используемом модуле TGAM1 и затем раскладываются согласно дискретному преобразованию Фурье на составляющие гармоники указанных в таблице 1 частот. Далее радиоволнами передаются на процессор ПК.
Таблица 1
ЭЭГ-ритмы
Название ритма |
Диапазон частот на выходе ASICTGAT1, Гц |
Стандартный диапазон частот, Гц |
Дельта (Delta) |
0,5–2,75 |
0,5–3 |
Тета (Theta) |
3,5–6,75 |
3–7 |
Альфа-низкий(Alpha 1) |
7,5–9,25 |
7–10 |
Альфа–высокий (Alpha 2) |
10–11,75 |
10–13 |
Бета-низкий (Beta 1) |
13–16,75 |
13–17 |
Бета-высокий(Beta 2) |
18–29,75 |
17–30 |
Гамма-низкий (Gamma 1) |
31–39,75 |
31–40 |
Гамма-высокий (Gamma 2) |
41–49,75 |
40–50 |
Для гармоники каждой отдельной частоты на экране монитора становится в какой-либо из бесплатных программных приложений к модулю TGAM1 NeuroSky (мы выбрали программу NeuroExperementer) доступно к наблюдению изменение амплитуды гармоники (альфа, бета, гамма, дельта) со временем (рис.5). Поскольку мозг, микрочип (т. к. нам неизвестна его конструкция), помехи и артефакты являются источниками случайности, то ни один из ээг-ритмов пользователя (альфа, бета и т. д.) не может быть выбран на роль управляющего параметра, поскольку все они являются, по сути, случайными функциями вида Ai(t), где А — амплитуда i-того ээг-ритма [1].
Значения этой случайной функции фиксируются 1 раз в секунду и доступны в каком-либо формате. В нашем случае это Rdate.txt (рисунок 6)
Рис. 1. Структурная схема одноканального ИМК
Рис. 2. ИМК в сборе и включен, о чем сигнализирует синий светодиод-индикатор на модуле блютуз BT04-A
Производителем TGAM1 рекомендуются на роль управляющих параметры, характеризующие так называемые «состояния расслабления» и «состояния концентрации» пользователя eSenseMeditation и еSenseAttention хороши как формирующие задающее воздействие на управляемую модель, но не воздействие управляющее [2].
Почему же это происходит? eSenseMeditation наиболее контролируем пользователем при закрытых глазах. В случае eSenseAttention — при очень сфокусированном взгляде. Понятно, что управлять моделью, когда вы не видите ни ее ни окружающего почти невозможно. Если же взгляд сфокусирован, то тогда вы можете хорошо видеть модель, но окружающее будет «выпадать» из поля зрения.
Кроме того, у некоторых пользователей частоты «навязанных ритмов» смещены, то есть, при случайном попадании в глаза световых вспышек на частоте, например, 6 Гц в энцефалограмме пользователя может резко измениться амплитуда не той же частоты, а 10 Гц, что не является паталогией и достаточно широко распространено [3]. Однако ритм в диапазоне Alpha2, для данного модуля TGAM1 включающий все ритмы из полосы 10–11,75 Гц — это уже основная составляющая параметра eSenseMeditation — и поэтому происходит его сбой. Управление моделью теряется, если оно «связано» с параметром eSenseMeditation. Аналогичное происходит с параметром eSenseAttention.
Какое же решение в данном случае мы предлагаем для стабилизации управления? Один из вариантов — изменить алгоритмы для eSenseMeditation и/или eSenseAttention, что невозможно, так как эти алгоритмы являются торговыми марками NeuroSky и составляют коммерческую тайну, хотя результаты их выполнения передаются в другие приложения.
Проблему предлагается решить следующим образом. В выбранной нами программе NeEx мы можем получать данные не только о восьми ээг-ритмах, регистрируемых модулем TGAM1 и двух параметрах eSenseTM, но и также (раз в секунду) значения некой простейшей комбинации ритмов, например, среднего арифметического (возможно также принять к рассмотрению любое другое среднее) ритмов гамма1 и гамма2. Для модуля TGAM1 гамма1 занимает полосу частот 31–39,75Гц, а гамма2–41–49,75Гц. Имеется также возможность получить с ИМК запись сеанса в формате Rdata (рис.3), причем такую, что первая половина ее будет характеризовать этот новый сконструированный из нескольких случайных функций Аi(t) параметр для обычного состояния пользователя, когда он ходит, ест, ведет себя естественно с одетым на голову устройством; вторая же часть записи, столь же обширная по объему, будет производиться сразу после первой, по условному знаку, и будет характеризовать то состояние пользователя, когда он пытается осознанно «удерживать» сконструированный новый параметр вблизи некоторого уровня (рис. 4)
Рис. 3. Пример файла, полученного с ИМК в формате. Rdata
Воспользуемся тем, что в языке программирования R существует множество встраиваемых пакетов, в том числе с алгоритмами искусственного интеллекта, и попробуем построить некоторый простейший классификатор, который будет отбирать по предлагаемой записи в формате Rdata те из простейших комбинаций, которые по его прогнозу могут удерживаться в окрестности некоторого значения, благодаря усилиям со стороны пользователя
Рис. 4. Шестиминутная запись с ИМК, когда пользователь пытается осознанно «удерживать» сконструированный новый параметр вида (Gamma1+Gamma2)/2 вблизи уровня Y=0.3
То есть мы получим ИМК как информационно-измерительную подсистему ЭЭГ-сигналов и подсистему искусственного интеллекта [4], который будет действовать как некий оценивающий «тренер». Пользователь через визуализацию будет тренировать свое умение поддерживать новый параметр вблизи некоторого уровня, а «тренер» будет делать выводы о том, подходит ли новая комбинация ритмов на роль управляющего параметра или нет. В целом получаем интеллектуальную систему сбора, преобразования (информационно-измерительная подсистема), обработки и анализа (подсистема искусственного интеллекта) энцефалографических сигналов (рис.5)
Программная часть системы может быть построена, например, на двух алгоритмах: алгоритм первичной обработки и визуализации данных (рисунок 5) и алгоритм прогнозирования управляющего параметра (дериватива) (рисунок 6). Первый может использоваться и самостоятельно, как программа для обычного БОС-тренинга или тренинга медитации
Рис. 5. Упрощенная схема ИМК (BCI)
Здесь отметим особо R-пакет knitr. Благодаря ему в одном документе поддерживаются разные языки программирования, а еще объединяются команды анализа данных и содержательные блоки будущего отчета, то есть ребята из квантума смогут, обучаясь, расширить проект, сами его дополнить чанками из разных языков, более красочно дооформить визуализацию [5]
Код для первого алгоритма может быть следующим
require (“knitr”) #передаем заранее установленный пакет knitr в рабочее пространство.
half < — read.table("./half.Rdata.txt», header=T, na.strings=«NA») # импорт данных в формате Rdata.txt в рабочую среду R,
сlean <- function(df) { # исключаем столбцы бесполезные для обработки
df$class<- NULL
df$Blink<-NULL
df$time <- NULL
df<- df [complete.cases(df),] # функция выдает логический вектор, где TRUE означает полностью заполненную строку, а FALSE — содержащую пропуски.
df } #выводим фрейм обработанных данных на экран
half <- clean(half){ #
totPower <- function(df) {df$Delta+df$Theta+df$Alpha1+df$Alpha2+df$Beta1+df$Beta2+df$Gamma1
+df$Gamma2}# назначаем нормализующей функцией сумму всех ээг-ритмов
normal<- function(df) {
foo<- df
sums<- totPower(df)
foo<- sqrt(df/sums)
foo$Meditation <- df$Meditation/100.0 # нормализация eSenseMeditation
foo$Attention<-df$Attention/100.0# нормализация eSenseAttention
data.frame(df=foo, sums=sums) # добавления в фрейм данных }
normHalf<-normal(half)
head(normHalf, 2) #показать 2 строки нормализованных данных
qqnorm(normHalf$df.Gamma1) # тест на нормальное распределение для значений Gamma1
qqnorm(normHalf$df.Gamma2)# тест на нормальное распределение для Gamma2
normHalf$class<-“base”# добавим переменную класса, чтобы отличить базовые наблюдения от наблюдений «удерживания параметра»
lastHalf<- 1055:nrow(normHalf)# начинаем отслеживать данные со строки 1055
normHalf [lastHalf,] $class <- “med”
normHalf$class <- as.factor(normHalf$class)
normHalf$funct <- (normHalf$df.Gamma1 + normHalf$df.Gamma2)/2 # устанавливаем формулу для дериватиа
base <- normHalf [1:1054,]# разбиваем данные на базовую часть
med <- normHalf [lastHalf,]# оставшаяся часть
head(base,2)#выводим 2 первые строки полученного фрейма данных
baseAvg <- apply(base [,1:10],2,mean) # получаем средние значения первых 10 столбцов базовых данных
medAvg <- apply(med [,1:10,2,med) # а также для столбцов данных медитации
medAvg/baseAvg # получаем их соотношение
mean(base$funct>=F) #получаем % пройденных базовых данных
mean(mеd$funct>=F) #получаем % пройденных данных медитации
boxplot(funct ~ class, outline=F, data = normHalf) #получаем диаграмму-коробку для иллюстрации производительности
Приведем предлагаемый код для второй части. В ней используется R-пакет caret [6] -универсальный интерфейс для доступа к десяткам алгоритмов машинного обучения
normHalf$sums<- NULL# исключаем ненужные столбцы
normHalf$functs<- NULL
normHalf$df.Attention<- NULL
normHalf$df.Meditation
library (caret) # загрузка пакета caret
inTrain <- createDataPartition(y=normHalf$class, p=0.75, list=FALSE)# делим данные на тренировочные и тестовые наборы
trainX <- normHalf [inTrain,]# тренироваться будем на trainX из normHalf.
testX <- normHalf [-inTrain,]# тестовый набор
model <- train(class ~., method=«rf», data=trainX) # обучаем модель случайного леса, необходимо загрузить пакет randomForest
print(model)# вывод модели
predicts <- predict(model$finalModel, testX) # запуск с тестовыми данными
confusionMatrix (predicts, testX$class)# вычисляем перекрестную таблицу тестовых и тренируемых классов со связанной статистикой
На данном этапе реализации алгоритмов разрабатываемой подростковой группой интеллектуальной системы мы остановились. Ребятам предстоит реализовать в коде условный переход, как указано в алгоритмах. И понять каким образом создать базу отобранных деривативов.
Рис. 6. Алгоритм обработки и визуализации данных
Рис. 7. Алгоритм прогнозирования управляющего параметра (дериватива)
Литература:
- Вентцель Е. С., Овчаров Л. А., Теория случайных процессов и ее инженерные приложения.-Учебное пособие для втузов. — 2-е изд.,стер. — М.:Высш.шк.,2000. — 383с.
- Основные понятия и определения теории автоматического управления // Электронный университет КГЭУ — виртуальная образовательная среда. URL: https://lms.kgeu.ru/ (дата обращения: 16.03.2020).
- Функциональные пробы ЭЭГ, Ритмическая фотостимуляция // Научная библиотека CMI. URL: (дата обращения: 16.03.2020).Остроух А. В. Интеллектуальные системы. — Красноярск: — Красноярск: Научно-инновационный центр, 2015. — 110
- Использование других языков в RStudio при помощи knitr // Биостатистика и язык R. URL: http://biostat-r.blogspot.com/2015/09/rstudio-knitr.html (дата обращения: 16.03.2020).
- Пакет caret — универсальный интерфейс для доступа к десяткам алгоритмов машинного обучения // «R:анализ и визуализация данных». URL: https://r-analytics.blogspot.com/2015/06/caret.html (дата обращения: 16.03.2020).