Около полугода назад ко мне пришла идея создания открытого фреймворка для нейроинтерфейсов.


На данном видео захват ЭМГ сигнала мышц происходит с помощью восьмиканального ЭМГ датчика на предплечье. Таким образом, мы через кожу снимаем нерасшифрованную, усиленную мышцами картину активации двигательных нейронов.

Сырой сигнал с датчика через Bluetooth поступает в Android/Android Things приложение.

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

Пример архитектуры сети на Keras:

model = Sequential()
# 8 каналов ЭМГ записаны по 8 раз каждый
model.add(Dense(36, activation='relu', input_dim=64))
model.add(Dense(20, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(16, activation='relu'))
# 5 записанных жестов
model.add(Dense(5, activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

https://www.kaggle.com/kyr7plus/naive-classifier

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

Использовать полученные классификаторы можно при помощи TFLite либо TF Serving

Код системы находится тут

В дальнейших планах:

  • Cоздание опен сорс многоканального датчика ЭМГ, работающего по USB
  • Эксперименты с машинным обучением для повышения надежности управления


Мой друг garastard рассказывает о наших Андроид приключениях с нейроинтерфейсами в этой статье.

Комментарии (14)


  1. Tramantor
    29.01.2019 13:02

    Это безумно круто! Обучение сети валидно для других людей? Сеть воспринимает общую активность нейронов? Т.е. Это какой-то конкретный паттерн для определенного действия?


    1. kirillskiy Автор
      29.01.2019 13:25

      Сеть нужно переобучать, так как особенности строения у каждого свои. Приведенная тут сеть собьется, если как-то иначе установить электроды на ту же руку. Паттерн должен быть таким, чтобы пользователь мог его максимально точно воспроизводить. Поэтому жесты удобны — видно что делаешь. Благо, переобучать сеть легко, через приложение. Вообще еще можно много чего попробовать с классификаторами. Одна из характеристик системы — простота применения новых классификаторов на TensorFlow.


      1. Tramantor
        29.01.2019 16:39

        Сколько занимает переобучение сети? Насколько общо( размыто) можно выставить паттерн? «как-то иначе» это смещение по точке установки? На какое расстояние можно смещать электрод, чтобы не потерять точку?
        *Блин операторам надо татухи бить в виде точет подключения)))*


        1. kirillskiy Автор
          29.01.2019 16:55

          Время обучения — от нескольких секунд до нескольких минут, в зависимости от сложности классификатора. Вот тут можно посмотреть некоторые классификаторы https://www.kaggle.com/kyr7plus/emg-4/kernels.

          В плане конкретных ТТХ и юзабилити пока рано говорить, нужно проделать больше работы с машинным обучением. Пока только могу сказать, что у меня получалось использовать систему без перекалибровки между двумя установками датчиков. Жесты стараюсь делать одинаково, датчики ставить — откуда снял.


          1. Tramantor
            29.01.2019 18:17

            на сколько сильно разнятся паттерны разных жестов? можно ли использовать группу жестов? Язык глухонемых?


            1. kirillskiy Автор
              29.01.2019 21:05

              Главное — количество жестов, которые можно использовать. Я использовал пять. Но это далеко не предел для подобных систем https://youtu.be/xKUn0-Bhb7U.


          1. Tramantor
            29.01.2019 18:18

            А покажите фотки железяк)?


            1. kirillskiy Автор
              29.01.2019 21:07

              Наше железо ещё не готово. На видео использовали Myo Armband в качестве датчика. Она фигурирует на видео в ответе на комментарий о жестах.


          1. Tramantor
            29.01.2019 18:19

            Вы не боитесь что вас засекретят)?


            1. kirillskiy Автор
              29.01.2019 21:10

              Нет)


  1. iva2000
    29.01.2019 13:24

    Всегда интересовало, может быть вы ответите: какая реально величина напряжения снимается на миограмме, кардиограмме и электроэнцефалограмме в вольтах? Можно ли этот сигнал снять вольтметром или осциллографом?


    1. kirillskiy Автор
      29.01.2019 13:46
      +1

      От микровольт до милливольт. Можно снять и записать, например, с помощью такого усилителя http://www.ti.com/product/ADS1299.
      Подручными средствами сам не пробовал.


  1. Sasha95
    29.01.2019 21:06

    Опишите, пожалуйста, ваш электромиограф: марка, скрины, ссылка где можно купить.


    1. kirillskiy Автор
      29.01.2019 21:10

      Пока используем Thalmic Labs Myo. Он сейчас снят с производства. Наше железо ещё не готово. Посмотрите OpenBCI.