Часы для обнаружения жестов на основе машинного обучения, ESP8266 и Arduino

Автор оригинала: Neutrino-1
  • Перевод
  • Tutorial

Мир, безусловно, становится лучше с каждым днем благодаря технологиям, основанным на жестах, потому что они интуитивно понятны, просты в применении и делают взаимодействие с гаджетами и вещами вокруг вас футуристическим и фантастическим! Итак, чтобы быть в тренде, мы возьмём самодельные спортивные часы, погрузимся в Machine Learning и посмотрим, сможем ли мы с его помощью определить, какой жест выполняем, и, возможно, мы сможем использовать это в последующих проектах, например, реализовать отправку e-mail взмахом руки. Далее под катом — настоящее гик-порно с кучей картинок, приготовьтесь.




Шаг 1. Рассказываю!


Так как я убрал ряд изначально планировавшихся мной функций часов (таких как мониторинг пульса и микро-USB для зарядки), то решил уделить больше времени доведению до ума программной части. Я подумал о том, чтобы добавить в проект немного машинного обучения; это должно быть легко по сравнению с электроникой: я буду иметь дело с простым набором кода – копипастой со StackOverflow. По крайней мере, я так думал.

Но я ошибался: реализовав обнаружение жестов на основе машинного обучения, я просто сошёл с ума. Я ненавидел всё это. Не потому, что это было сложно, просто было очень неприятно собирать данные и обучать модель.

Если вы хотите узнать больше о внедрении машинного обучения во встраиваемую систему, ознакомьтесь с двумя ссылками: TinyML и  определение жестов. Первая объясняет, как использовать TensorFlow в TinyML с Arduino, а вторая – как использовать базовые алгоритмы ML на Arduino. Я много раз упоминал последнюю ссылку, потому что материал просто понять, а также это работает с микроконтроллерами с очень небольшим количеством памяти, такими как Arduino NANO и UNO.

Шаг 2. Сборка печатной платы










В этот раз сборка должна быть очень простой и быстрой благодаря печатным платам, и за это я благодарю PCBWay за спонсирование этой великолепной чёрной печатной платы для этого проекта.

Я собрал все SMD-компоненты для проекта, а затем расположил их таким образом, чтобы можно было легко, без возни получить к ним доступ. Остальное я потом просто паял!

Просто следуйте принципиальной схеме и соответствующим образом припаяйте компоненты на печатной плате. Чтобы упростить пайку, переходите от пайки небольших SMD-компонентов [резистор, конденсатор, регулятор] к более крупным компонентам со сквозными отверстиями [MPU6050, OLED]. Во время пайки я также с помощью ленты 3M закрепил батарею Lipo между платой и OLED-дисплеем.

Мне сложно найти подходящий регулятор для проектов, поэтому в своих прошлых проектах я просто использовал AMS1117: он дешёвый и его легко найти. На плате я дал два варианта, вы можете воспользоваться MCP1700 или LSD3985. В моём случае я использую LSD3985 и игнорирую MCP1700, а вы можете использовать любой вариант. Если вам нужна точная схема, посмотрите здесь.

Шаг 3. Программирование часов






Чтобы упростить программирование, я выделил немного места на печатной плате, так что вы можете просто подключить модуль FTDI, чтобы начать программировать. Для программирования платы необходимо сначала перевести esp8266 в мигающий режим, поэтому при подключении к ПК просто удерживайте кнопку, которая подключена к GPIO-0 esp12E.

Чтобы проверить, работает ли плата, просто загрузите код Github и проверьте, работают ли все функции, такие как время NTP, пробуждение по щелчку и изменение работы экрана. Если всё работает нормально, то вы закончили с аппаратной частью.

Шаг 4. Машинное обучение? Часть 1




Машинное обучение звучит причудливо и сложно, но поверьте мне, некоторые алгоритмы в ML более интуитивно понятны, чем некоторые другие алгоритмы, не основанные на ML. Просмотрите эту ссылку, если хотите узнать больше.

В большинстве случаев, когда алгоритму нужно найти ответ на вопрос, ему нужно знать последовательность процессов, которые он должен выполнить, чтобы получить конечный результат. Простой пример – умножение.

Если вы хотите найти ответ на задачу умножения (скажем, 2 умножить на 5), то можно просто сказать компьютеру выполнить несколько сложений, чтобы получить ответ. Как видите, мы говорим компьютеру, что делать, чтобы получить ответ.

Шаг 5. Машинное обучение? Часть 2




ML работает немного иначе: мы просто задаём компьютеру кучу вопросов и соответствующих ответов и просим его выяснить способ или найти процесс, чтобы он мог ответить на любой новый вопрос без программирования вручную.

Возьмём, к примеру, поиск яблока на фотографии, это очень легко сделать человеку, но довольно сложно написать алгоритм и заставить компьютер понимать все функции, которые есть у яблока; это возможно, но крайне утомительно и сложно. Вместо этого, если бы мы могли написать алгоритм, который может обучаться сам по себе, просто глядя на тысячи изображений яблок, и учиться самостоятельно, разве такое не было бы здорово? Есть ещё один положительный момент использования алгоритма машинного обучения: они могут придумать новый способ поиска яблок на фотографии, о котором мы даже не думали. Итак, ML – довольно интересная область, чтобы её исследовать.

Примечание! Я не самый подходящий человек, чтобы объяснить машинное обучение и искусственный интеллект, я просто пишу то, что узнал.

Шаг 6. Классификация






В машинном обучении много способов и техник, чтобы решить задачу, и в нашем случае, чтобы обнаружить жесты, я воспользуюсь одним из методов под названием классификация. Зачем нужна классификация? Смотрите на картинку выше, чтобы увидеть данные акселерометра и гироскопа на последовательном плоттере. Данные кажутся предсказуемыми, с точки зрения человека, как только понять, что движение долго повторяется. Теперь, если я сделаю то же движение за пределами экрана, вы всё равно сможете угадать, что это за движение, просто взглянув на график, а самое приятное – то, что вы можете сделать это даже для других жестов и движений. Так происходит потому, что наш мозг даёт разные названия разным паттернам.

Точно так же, если мы можем показать этот паттерн данных алгоритму ML несколько раз, он попытается понять эти данные и распределит их по разным группам. Или, как сейчас модно, вы можете сказать, что алгоритм классифицирует выборку данных по различным классам. Итак, в следующий раз, когда алгоритм ML увидит похожую закономерность в данных, он выяснит, что это за движение или жест. По этой причине нам нужно сделать классификацию. Я выбрал алгоритм случайного леса для этой задачи классификации.

Шаг 7. Сбор данных для обучения модели с датчиков







Поскольку теперь у нас есть базовое представление о машинном обучении, мы можем начать со сбора данных, которыми воспользуемся, чтобы обучить наш алгоритм ML. В руководстве, которому я следовал, сбор данных был неуклюжим: через монитор порта. Мне было бы очень сложно сделать то же самое, потому что пришлось бы носить устройство на запястье во время жеста. Чтобы решить эту проблему, я сделал сбор данных беспроводным. Я воспользовался встроенной флеш-памятью esp8266 и, чтобы было удобнее, отображал статус сбора и сохранения данных на OLED-дисплее. Если вы хотите сделать то же самое, скомпилируйте и загрузите файл Data_collection.ino на свои часы.

После того как вы загрузили код, чтобы проверить его, держите руку неподвижно, как только устройство запускается; оно сначала калибрует акселерометр и гироскоп. Как только калибровка закончится, вы можете начать сбор данных! Просто нажмите кнопку, к которой подключён GPIO-0, и устройство создаст новы признак, а затем просто двигайте руками, чтобы записать движение. Попытки сделать сбор данных беспроводным определённо того стоили! Стал намного проще сбор каждого движения (примерно 25–30 раз), он не доставил проблем. Чем больше у вас будет выборок, тем лучше будет работать алгоритм.

Шаг 8. Обработка данных







Теперь вы можете сбросить собранные данные на монитор порта: просто выключите схему, подключите FTDI и снова нажмите кнопку программы, пока монитор открыт на вашем ПК. Действия сбрасывают все данные на монитор. Затем просто скопируйте и вставьте их в текстовый файл. Каждое движение будет отделено фразой «New feature», чтобы вы знали, какие данные с каким движением связаны.

Затем разделите текстовый файл на 3 файла CSV, используя Excel, на жест свайпа влево, жест свайпа вправо и хлопка. Мы закончили сбор данных.

Эти данные не должны использоваться напрямую; их необходимо обработать: удалить шум, чтобы алгоритм прогнозировал точнее. Но я не делаю ничего такого, что усложняет весь проект, поэтому просто пропускаю всё это и сразу перехожу к обучению алгоритма.

Шаг 9. Обучение модели







Это часть, в которой вы обучаете свой алгоритм машинного обучения распознавать жест.

Для обучения я использую скрипт python, который обучает модель и конвертирует её в файл C, а этот файл, в свою очередь, мы можем использовать с IDE arduino. Вы можете скачать этот файл из моего репозитория на github  и открыть файл Classifier.py внутри папки Python training code. В этом коде мы прочитаем файлы csv и обучим модель изучению жестов. мы записывали раньше. Если у вас другие имена файлов, просто измените список Python, который называется fileName, чтобы он обучал модель на основе собранных вами данных.

Этот код создаст файл model.h. Он содержит обученную модель, которая определяет три зафиксированных нами жеста. Если вы хотите просто протестировать модель, вставьте файл model.h в папку «Testing gesture detection» и откройте файл arduino в этой папке. Затем просто скомпилируйте и загрузите код на часы.

Testing_Gesture_Detection.ino

Шаг 10. Выводы модели






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

После успешной загрузки кода выполните любой жест. Жест, который вы выполняете, должен быть указан на OLED-дисплее. В моём случае модель работала в 95 % случаев, иногда затрудняясь обнаружить свайп вправо. Возможно, данные, которые я собрал, были зашумлены, или, может быть, когда собирал данные, я делал жесты неправильно.

Как бы то ни было, для меня 95 % – это хорошо, с таким распознанием можно многое сделать!

Шаг 11. Заключительные мысли






Есть так много вещей, которые вы могли бы улучшить, если хотите реализовать это для проекта более высокого уровня. Например, можно увеличить частоту дискретизации во время сбора данных, увеличить количество образцов, которые вы собираете, очистить данные после их сбора, использовать обработку сигналов, чтобы удалить шум и т. д. Но с точки зрения начинающего любителя, даже такая реализация модели машинного обучения в микроконтроллере имеет большое значение! Хотите научиться использовать машинное обучение — приходите учиться, а промокод HABR, дающий 10 % дополнительно к скидке на баннере, вам в этом поможет.



image
SkillFactory
Школа Computer Science. Скидка 10% по коду HABR

Комментарии 13

    –3
    Чьи это руки на фотографиях?
      +3
      Батарейка 105ма*час + AMS1117 который даже без нагрузки разрядит её за несколько часов ну и ESP8266 с OLED и прочее до кучи. Думаю эта конструкция на одном заряде и часа не протянет.
        +4
        «Мужской разъём USB» как подарок на 23 февраля, или трудности перевода)
          +1
          Уподобился своему аватару и поправил. Спасибо.
          0
          Так происходит потому, что наш мозг даёт разные названия разным паттернам.

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

            +2
            Тема интересна, но качество перевода… Мужской разъем, свинец для пайки, режим мигания и т. д. Не пробовали перечитать после гугл переводчика?
              0

              С помощью этой технологии можно сделать много невообразимых штук и получить столько же возможностей, а если объединить с AR, то это всё будет иметь ещё и видимую часть. "Интерактивная" реальность всего в шаге от нас. Спасибо за столь подробную и интересную статью!

                0
                Знатный винегрет. Можно было бы под сами чипы развести. Было бы компактнее. Собираюсь делать похожий девайс, Не развел гироскоп
                Идея хорошая. Плюсую
                  0
                  «Тактильный мотор» — это трудности перевода?
                    0
                    Непохоже. Если перейти по ссылкам — там никакого tactile не встречается. По обеим ссылкам — Vibration Motors / Vibrating Motor.
                    Так что скорее какая-то посторонняя ассоциация в голове переводчика.
                      0
                      по работе делали браслет с вибриком внутри. в ТЗ писали " наличие тактильного воздействия", в уточнении писали что нужен вибрик. Так что, мотор для тактильного воздействия = тактильный мотор ))
                    +1
                    Сейчас для таких экспериментов, можно готовое устройство из Китая заказать: Lilygo T-Watch или Lilygo T-Wristband, на борту esp32 и все необходимые сенсоры, а также достойный внешний вид.
                      0
                      Тут немного не понятно
                      Просто нажмите кнопку, к которой подключён GPIO-0, и устройство создаст новы признак, а затем просто двигайте руками, чтобы записать движение.

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

                      Самое читаемое