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

ls437thgzx2z_attjyscxxanqr0.jpeg

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

Вот список покупок, которые помогут вам сделать этот проект с лёгкостью.

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


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

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

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

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


hfoh9h_l344cypnfg5ksqaefksk.jpeg

r95fwkk8fq3sbxprgb77exfa9nc.jpeg

ins5abc_ukmlszuws6p6futgxpc.jpeg

4smrv63frva-mztof75jmk5nadq.jpeg

y2dywlnobp_dydc2lczuee7blcm.jpeg

3vmvpik8sfwybwaurxli1aozd8i.jpeg

g6gsxlskmw6fixycvqinqae59v0.jpeg

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

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

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

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

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


x3cpmsjpbwfisbupowbgi39oa0w.png

59yputqht3shyxjxojrnyhe_xka.png

ft_buvfv5hx2gfwcoqcly6smnew.png

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

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

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


6i_g3elj83khvo2qee1z2ni_udo.jpeg

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

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

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

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


si1vitlrdnh8-i2ignyf2y38cvq.jpeg

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

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

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

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


93cehu79pahsrimbe3hg9gonf_i.png

6vqaieyjrt0cajslccgrooowhd0.png

rf6xcznlryxooovd3suewb1k_4c.png

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

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

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


aseeorhtbpji-w9d1zdv9vocxny.png

8ltaohqfohwjq0bh669dih2mxwk.png

uz4bljvxhg4thbstxg4kvitdxfs.png

xl1n_rvz3frzvevaenahnpbqxj0.png

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

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

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


dvpsva_-sabvicsso2lgk-pekae.png

h4evft2cyjtlmw3ee1vc7euuplw.png

pirotoypfnluydkhpezcpfd5m9q.png

kmn19awgqudbcjgwfryvlie_0lq.png

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

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

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

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


z_vizweiv1ogqor7kzvyzyhhbmi.png

qonul_lz9pbip2j66zsbmk8zc-s.png

j181ssfwnfddxr17n4ibs1d0cbo.png

oxmdtk8kppfi8jn-ppe-4va5g04.png

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

Для обучения я использую скрипт 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. Выводы модели


zv4sq9czt_v4ohevjtmdeiwxdre.gif

frlr_dmjv2vjauxr4hriw-td6eo.gif

l5qll9qx6hfhiz3zixnc_3qwjws.gif

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

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

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

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


oaoechdwqxa63_rye2dr0r8t02w.png

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


Другие профессии и курсы
ПРОФЕССИИ

КУРСЫ

image

© Habrahabr.ru