Про заворушення в головах


Пару місяців тому мені захотілося поекспериментувати з нейроинтерфейсом. Ніколи цією темою не займався, але раптом стало цікаво. Ніби як 5-10 років тому обіцяли бум нейроустройств, а все що ми зараз маємо на ринку — пристрій щоб махати вухами, пристрій щоб світити камінчиком, та пристрій для левітіровать шаром. Десь на підході пристрій щоб будити вчасно. Ось тут є непогана стаття про все це справа. У той же час регулярно з'являються якісь дослідження, де розповідають, що люди можуть навчитися рухати роботическими руками-ногами або писати тексти (1, 2, 3, ось тут є добірка). Але це все дослідне, в єдиному екземплярі, з вартістю апаратури як хороше авто.

А де що посередині? Щось корисне звичайному користувачеві? Нехай навіть не скрізь, а в якихось окремих застосуваннях. Адже навіть навскидку придумується кілька речей: детектор засипання для водія, підвищення працездатності (наприклад через вибір музики, або управління перервами!). Можна вибрати щось специфічне. Наприклад дивитися і аналізувати свій стан в кіберспорті. Для цього ж навіть трекери зіниць випускають і використовують. Чому немає таких застосувань? Це питання мучило мене. В результаті вирішив почитати куди наука рухається, а так само купити простеньку нейрогарнитуру і затестить. У статті — спроба розібратися в темі, трохи джерел і багато аналізу поточних досягнень споживчої електроніки.


Що використовував і чому

У продажу є багато різних нейрогарнитур. Ось кілька збірок на тему: 1, 2.
У Москві є далеко не всі з них. Взяти вирішив банальний MindWave NeuroSky. Він бюджетний, а головне — є непогане SDK з прикладами на декількох мовах.


Мінуси Neurosky
Відразу про мінуси. Чомусь про них мало пишуть. Але вони є:
1) Сам Mindwave чіпляється до компу як COM-порт. Додаток може чіплятися до нього безпосередньо через функції .NET обгортки. А може чіплятися через веб-сервер Neurosky, що висить на 127.0.0.1. Друге необхідно, якщо розробка йде через якийсь флеш, у якого немає прямого доступу до COM-порту. Але COM приклад прикладений до SDK недопрацьований, пристрій часто не чіпляється. По суті, єдиний спосіб працювати стабільно — через сервер. В кінці статті посилання на GitHub, я там навів приклад того, як можна працювати через COM порт (використовуючи сервер для ініціалізації).
2) Бібліотеки. Тестовий приклад не запустився. Бібліотеки, які лежать в SDK не працюють з останніми драйверами. Потрібно викопувати в установленому із драйверами софті останні версії бібліотек і використовувати їх з прикладами з SDK.
3) Як би NeuroSky не хвалився алгоритмами фільтрації перешкод, але все ж, самі низькочастотні хвилі не юзабильны (Delta і Theta). Реально використовувати від сили 1/2-1/5 даних по них. При цьому потрібно підключати свою систему фільтрації, або брати якусь готову (наприклад OpenVibe openvibe.inria.fr ).
4) Детектор моргання, якою так хвалиться NeuroSky функціональний наполовину. В інструкції сказано: «моргайте як можна більш природно». Але тоді моргання не детектуються. Якщо моргнути сильно напружуючись, то теж. Потрібно десь посередині. Ах так. COM версія протоколу їх ще некоректно передає програмі. Ось як будуть виглядати сильне/середня/слабке моргання на графіку. Трохи нижче буде приклад як виглядає на фур'є-спектрі. Відрізнити можна не завжди.


5) Зараза незручний. Так і хочеться його зірвати з голови. Причому, судячи з усього, не я один такий.

Що власне NeuroSky бачить
Але, не все так погано:
1) Низькі, високі альфа, бета, гамма хвилі видно непогано. Сплески по них є, але фільтруються. Невелика усереднення + фільтр викидів дає об'єктивну картину:

2) Є два параметри, за які всі люблять Neurosky: «Медитація» і «Увага». Вони слабо скорельовані, але ними можна управляти. Я не впевнений, що дані параметри означають саме це. Перший з них максимізується якщо щось уявити з закритими очима, другий, якщо починати згадувати і асоціювати різні фактори. Але при грі Quake | Роботі показання вельми середні, хоча обидва заняття вимагають максимального занурення і уваги. Показники при прокрастинації для «уваги» навіть вище:

З іншого боку, даними величинами можна навчитися більш-менш ефективно управляти. Вони являють собою деякі залежні від параметрів «альфа», «бета», «дельта», «гамма», «тета» величини. У «медитації» максимальна залежність від альфи:

Видно, що не завжди, але піки і похідні часто залежні.
3) Самі свідчення «Альфа-хвиль» фільтруються пристроєм. Для тесту я сам збудував повний спектр вхідного сигналу, вирахував за нього альфу і порівняв (на малюнку спектр де-то для 0-40Hz):


В принципі, після закриття очей видно, що альфа, обчислена вручну почала зростати. Для перетворення я використав вікно перетворення близько 1.5-2 секунд. Якщо звузити вікно десь до 1/3 секунди, то ефект від моргання займатиме значно менше площі.
Я провів ще кілька тестів і в цілому у мене вийшло, що альфа, яку видає прилад, досить непогано фільтрується порівняно з альфою, яку можна порахувати руками. Але, порахована руками буде, безумовно, точніше. Наприклад, якщо брати короткі вибірки без моргання, то краще все рахувати вручну. Якщо брати середнє, то покази приладу — краще, якщо не запарюватися з фільтром.

Пару слів про теорії

Існує досить розгалужена теорія про те, які генерує електричні коливання мозок у яких ситуаціях. Введення в теорію зайняло б всю цю статтю. До того ж, я явно не той, хто зможе це пояснити достатньо докладно відповівши на всі питання. Так що обмежуся посиланням на Вікіпедію і невеликим резюме:
Різні режими роботи мозку викликають електричні коливання на різних характеристичних частотах. Було виділено кілька груп таких частот і проведена їх ідентифікація з діяльністю. Наприклад глибокий сон викликає коливання на частотах нижче чотирьох герц. Розслабленість і закриті очі на частотах порядку 8-12 герц. NeuroSky виводить наступні параметри:
• Дельта хвилі: <4Hz. Зазвичай характерні для глибокого сну.
• Тета-хвилі: 4-7 Hz. Швидкий сон, або коли мозок зосереджений на одному джерелі інформації.
• Альфа хвилі: 8-15 Hz. Розслаблення, спокійне неспання.
• Бета хвилі: 16-31 Hz. Увага, напруга, розумова діяльність.
• Гамма хвилі: >=32 Hz. Рішення завдань, максимальна напруга уваги.
Дані показники є деякою усередненою метрикою. Для кожної нової голови вони можуть бути різними або зрушені. Зате вони досить стабільні + для більшості людей можуть бути репрезентативними. Наприклад відгук з альфа-хвиль для мене для різних станів:

Згідно теорії, чим більше альфа, тим більш розслаблений чоловік. Начебто сходиться. Для бета хвиль ніби як теж видно залежність, але вже не така очевидна:

Для Гамма-хвиль у мене не вийшло ніякого відмінності в залежності від діяльності. Може мозок не той, може чутливості приладу не вистачає, може 50hz наведення вбивають всякі спроби детектувати щось відчутне:

В принципі, у мене складається відчуття, що на частотах вище 30Hz якесь немислиме кількість різних коливань. Щось толкове як стабільної метрики на перший погляд там вицепіть складно (спектр десь від 0 до 80Hz):

Сам прилад встромляється в точку голови Fp1. Кажуть, що це не сама оптимальна точка, але цілком репрезентативна. Ніби як точки задньої частини голови мають більш чіткі альфи видавати.

Ну гаразд. Ніби як прилад покрутили, потестували. Спробуємо що-небудь зробити?

Щенячий захват навколо

Почав я з того, що погортав в інтернеті на тему існуючих проектів та ідей для MindWave та інших пристроїв на 1-3 електрода. І, якщо чесно, прийшов в жах.
По-перше, жахливу кількість безглуздою движухи навколо. Тисячі відео на Ютубі де людина показує свої мозкові сигнали через додаток Brainwave Visualizer або аналоги. Ще багато додатків, які за змінним «медитація» і «увага» роблять якусь просту дію: управляють вертольотом, або машинкою. Двіжуха навколо arduino і то в мільйон разів корисніше і цікавіше. Тут же все зводиться до двох величин (щааа як у нас все зведеться до них).
Ще є тема. Писати статті про як там все це круто, що нейронауки врятують світ. Навіть тут, на Хабре. Після статті обов'язково слід пропозиція або купити девайсину у відповідній конторі, або якось ще доставити вигоду письменнику статті. Основний напрям таких статей — не «зробити корисний пристрій», а «струсити з користувача денюжку».
Для пристроїв з великим числом електродів, того ж «Emotiv epoc» застосувань куди більше. В першу чергу пов'язаних з управлінням в іграх, або управлінням пристроїв. Але Emotive непогано детектує мікроміміку, на базі якої і будуються такі системи. Управління за рахунок мозкової активності практично не зустрічається.
Серйозні роботи. Так, є, але вони глибоко зариті.

Закопуємося глибше в мозок

Теми підняті мною в заголовку статті не нові. Взагалі мало що ново під місяцем в науці і техніці. Чи можна за допомогою декількох електродів визначити стан людини? Втомився він, працює, засинає, водить машину? І як це взагалі реалізувати?
Найбільш очевидним видається аналіз даних, що надходять з ЕЕГ алгоритмами аналізу даних і навчання: SVM, Random Forest, ANN, KNN і. т. д. І дійсно. Відповідний запит у гуглі видає досить багато праць на цю тему. Не всі ідеальні, є багато місць, де можна підкопатися, але їх достатньо для розуміння існуючого прогресу і можливостей. Розберемо детальніше.

По-перше, це coolworld.me/classifying-EEG-SVM. Дослідження проводилося на MindWave. Автор записав багато коротких сетів по 10 секунд з такими ментальними діями: «уявити обертання куба», «уявити мотор», «уявити аудиторію». При цьому, судячи з усього, пробував об'єднати їх з микродвижениями м'язів. По кожному сету робилося швидке фур'є-перетворення з базою в 2 секунди. Отримані 5 векторів служили для навчання. Все робилося по 3 запису кожної дії. Разом 15 векторів.
Запевняє, що вийшло класифікувати 97-100% випадків. Віриться, якщо чесно, з працею. Але, автор описав експеримент дуже погано. Можливо, використовується дуже специфічний датасет, може, крім ментальної активності використовуються мікрорухи, може, в 10 секундах запису немає моргання (або взагалі писалося з закритими очима), може поділ сетів було бінарно, і. т. д. Ось тут і тут є трохи більше статей автора.
У цілому, автор скоріше не досліджував «розрізнення ментальних станів», а способи через ЕЕГ передавати певні мітки. І на мій погляд даний спосіб реально працює. Може не в 97% випадків, але в 90% все ж і можна давати фіксовані команди. При цьому отвязанные від «медитації» і «уваги», які не завжди можна контролювати. Зайняті руки — включив мозком музику.
Дуже важливим є відмова автора від використання вбудованих величин «альфа», «бета», «дельта», «гамма», «тета» спектрів. Автор працював з швидкими процесами. У показниках MindWave ж відбувається фільтрація і накопичення, що призводить до падіння точності і латентності. Автор пояснює цей підхід тим, що чесно підрахований спектр точніше. Але я так не думаю. Як я показав вище — при моргання помилка буде вище у спектрів, які вважаються руками. Плюс у них велика схильність шумів.

По-друге, мені дуже сподобалася данная стаття. Вона про Emotiv, а не про NeuroSky. Але тут робиться саме те, що на мій погляд повинні робити такі системи. Аналізується можливість детектування різних ментальних станів. Автори записали датасеты з водінням і описали їх кількома способами, як «робота», «задоволення», «складність» і. т. д. Після чого навчили і протестували.

В роботі вони показали не тільки принципову можливість класифікації. Вони проаналізували різні класифікатори і розрахували їх точності. А так само розглянули кілька застосувань, у тому числі — аналіз ментального стану водія (власне цьому і присвячена робота).
Зроблено було практично все, що було можна. Єдиний мінус — використовувався Emotiv EPOC з 14 електродами. А у мене Mindwave з півтора.

Наступна работа. На мій погляд досить посередньо, хоча і на Neurosky. Детектировали тільки засинання. Єдине, що на мій погляд добре зробили — верифицировали базу при зборі.

Є робота такая. Вона присвячена визначенню рухів за показаннями Emotiv. Я б не став так однозначно говорити, що в ній використовують саме хвилі мозку (може статися що міміка теж причетна).

Ще є робота, де все робилося без навчання, а просто по порогах різних + з хитрою логіці. Але на мій погляд вона слабка.

Час що-небудь зробити

Якщо чесно, то я почав ще до того, як вивчив всі статті. Вирішив взяти SVM і спробувати розпізнати діяльність людини на тривалому ділянці часу. Працює людина, водить, читає, грає, і. т. д. Можливо, я ще випробую інші ідеї зі статей, але поки на це не вистачило часу.
Першим ділом я зібрав базу на кілька ситуацій:
• Сиджу і працюю (Таке найпростіше зібрати. 90% часу — прогаю)
• Прокрастинирую. В реальності складно зібрати. Намагався записувати ті момент коли проглядываю вконтакт, або читаю щось просте типу гиктаймса. Але іноді ловив себе на думці, що занадто занурююся.
• Читаю. Зараз на читалці новий роман Гібсона, а до цього був Мьевиль. Так що занурення непогане.
• Воджу машину.
• Сиджу з закритими очима, пробую заснути. Зазвичай записував ввечері, коли втомлений. Через схеми кріплення MindWave до голові сам сон записати складно.
• Бігаю на біговій доріжці. Пару сетів даних записав, але на мій погляд використовувати їх не можна. Занадто великі перешкоди.
• Граю на гітарі. Граю дуже средненько, але для тестування вистачить.
• Граю на компі. Для чистоти експерименту окремо записав Quake і пару партій в Starcraft.
Кожен процес я записував невеликими шматками десь по 10-15 хвилин. Це не дуже чесний набір бази. Читаючи, я відволікався на те, щоб перевірити, як іде запис. Працюючи я міг відволіктися на скайп. Прокрастинируя, я міг почати думати, і. т. д. Серед отриманих даних я пробував відкинути очевидно некондиційні (MindWave часто має поганий контакт). Для автомобіля і для бігу дуже часто вимірювання некондиционны.
У роботах, згаданих мною вище дуже багато уваги приділяли саме коректності бази. За цей рахунок отримали досить непогані результати. Але ж зрозуміло, що в реальних умовах така база буде некоректною. Люди моргають. Люди відволікаються. Хотілося додати саме стабільності. При цьому зрозуміло, що точність падає. Тому працювати з великим числом ситуацій та розпізнавати їх одночасно буде неможливо.
Тут я висвітлив не всі приклади, а на мій погляд найбільш цікаві. Всі зібрані бази викладені в репозиторії (посилання в кінці статті). Можна потестувати самому.

Що будемо подавати на вхід. Можливо, це помилка, а може і ні. Але я вирішив подавати на вхід не спектр DCT, а розраховані MindWave величини альфа-бета-хвиль… + параметри «Медитація» та «Концентрація». По хорошому, потрібно інше: подавати вихідний спектр фільтрування в часі, як це робиться майже у всіх статтях. Але свята закінчилися і найближчим часом я це перевірю. Як перевірю — небудь додам голову до цієї статті, або напишу ще одну.
Я зробив це з двох причин. По-перше, на той момент, як почав збирати базу, я знайшов лише одну статтю. По-друге, мені здалося, що величини MindWave кілька стабільніше. Особливо до морганию. Не хотілося робити свій алгоритм його придушення.
Розуміючи, що більше двох класів складно розрізнити, я використовував різниця тільки між двома класами. В якості вирішальної машини я використовував SVM. Судячи за всіма статтями воно непогано. Його найпростіше налаштувати. Плюс знайомий з кількома реалізаціями. Вхідний вектор був:
Тета -, Бета, Альфа1, Альфа2, Бета1, Бета2, Гамма1, Гамма2, Медитація, Концентрація
540 248 374 110 98 181 61 120 64 27
Вектор нормувався, щоб параметри лежали приблизно в одній області. Для одного класу результатом подавався +1, для другого -1.

Приклади роботи
Точної статистики приводити не буду. З-за того, як збиралася база — складно сказати щось певне. Зібрати базу на 100 прикладів кожного класу по 15 хвилин майже нереально. Тому я будую класифікатор для двох класів по вибірках Х1 і У1, а потім дивлюся, як распознались приклади X2, X3,..., Xn, Y2, Y3,...Yn.
Вектор «альфа», «бета», «гамма»,… змінюється десь раз в секунду. З-за наявності шумів, викликаних морганням, поворотами голови і не дивлячись на внутрішні фільтрації вектор вкрай нестабільний. Часто йому потрібно 2-3 секунди щоб повернутися в норму. Тому вводимо усредняющее вікно довжиною у 30 секунд. Виходить якось так:

Тест Робота-Прокрастинація

Приклад розпізнавання прокрастинації, де >80% прикладу розпізналося вірно. А ось приклад запису з роботою на 20 хвилин, де розпізналося вірно >90%:

У мене було 5 записів з роботою на 15-25 хвилин. З них одна використовувалася для навчання. 4 решти распознались вірно. Кожна більше ніж на 90% тривалості. З 6 записів прокрастинації одна використовувалася як навчання, решта як тест. Чотири распознались як прокрастинація більш ніж на 80%, як одна робота майже вся. Ймовірно недостатньо прокрастинировал:(

Тест Гітара-Читання
Не дуже корисний тест, але так як по цим двом класам я накопичив багато прикладів — тестував багато. Розрізняється дуже добре. Для читання була вибірка 9 прикладів. Для гітари 6 прикладів. По одному на тестування. Неправильно распозналась тільки одна гітара (де-то тільки на 60% визначилася як гітара, решта 40% — читання). Даний приклад:


Тест Гітара — Квака
А ось і перший погано працює тест. По Q — 4 тесту, з них 1 навчання, решта 3 распознались. Але по грі в Гітару 6 тестів, з них 2 не розпізнано коректно.

Тест Гітара — прокрастинація
Не працює практично цілком. Перенавчається в бік гри на гітарі. Майже всі записи зараховує до гри на гітарі.

Сидіння з закритими очима — водіння машини
Ось це дуже прикро, але у мене теж не працює. Все ж я майже впевнений, що причина в тому, що сидіння з закритими очима != засипання. Засинання у мене вийшло зробити лише на одному з чотирьох прикладів (високі альфа хвилі були, приклад нижче). Але як зібрати базу засипання в розумні строки, якщо чесно, не розумію. Тим більше з Mindwave в яких практично неможливо лягти це складно.

Що обнадіює — у статтях, які були наведені вище відсічення засипання при водінні дати можна. Навіть на рівні альфи. І швидше за все за правильно зібраної базі все запрацює

Підсумкові думки де працює де немає

Я б сказав, що критерій простий: чим сильніше розрізняються стану мозку, тим простіше відрізнити що відбувається. Але по суті, такий підхід зводиться до розрізнення двох, максимум трьох станів мозку. Які можна обдурити схожими активностями.

А чи справедливо?

А взагалі навіщо мені потрібні були альфа-бета-гамма хвилі? Може бути досить медитації і концентрації? Адже ці два параметри результуючі?
Така думка відвідала мене, і я перевірив її. Все ж виходить, що введення хвиль значно уточнює точність розпізнавання. Наводжу приклади для читання та гри на гітарі. Для решти класів приблизно так само. Видно, що якість покращилася, хоча загальні тренди збереглися:





В принципі, як було показано у вступних частинах, параметри Медитація і Концентрація сильно зав'язані на хвилі і непогано показують що хвилі представляють собою. Але вони не несуть в собі 100% інформації з хвиль.

Висновки

Така невеличка статейка вийшла на тему EEG. Новорічні вихідні були не дуже довгими:)
Повернемося до питань, заданим на початку. Чому не відбулося буму нейроустройств в споживчому класі? На мій погляд основна проблема — складність створення чогось універсального. Алгоритми, крім базових, будуть вимагати тюнінга під кожну людину. А зробити автоматичний тюнінг без того, щоб користувач сам вносив налаштування — дуже складно.
Друга проблема — складність експлуатації. Датчики нестабільні. Закріпити їх, щоб не було шумів нетривіально. При цьому сухий контакт можливий тільки для лобової частини. Той же Emotiv бажано кріпити з гелем.
У підсумку маємо технологію, яка сама по собі нестабільна. Вона непогана для якоїсь аналітики. Але як тільки справа стосується якогось гарантованого результату — відразу програє. Вирішити ту ж проблему з засипанням водія можна більш простими і дешевими способами. Аналітика з ЕКГ куди цікавіше, ніж ЕЕГ в загальному випадку.
Так, є ряд застосувань, куди можна пробувати розвиватися. Врешті-решт зробити детектор «працює людина» або «прокрастинує» іншими способами складно (хіба що зробити видеоаналитику зображення на моніторі). Але всі такі рішення вимагають дуже великих розробок і навряд чи будуть працювати на 100% людей.
В сухому залишку, на мій погляд, ніша бюджетних ЕЕГ пристроїв може зайняти тільки ринок іграшок і непотрібних гаджетів. Чим успішно і займається.

Коди

Жахливі і сирі исходники всього даної справи я виклав тут.
SVM взято з Accord Framework, для простоти відображення підчеплений старий EmguCV. Так само є бібліотеки Neurosky для взаємодії з MindWawe.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.