Как ML может помочь в езде на велосипеде

19 декабря 2021 г.

Я люблю кататься на велосипеде. На своем велосипеде я могу рассчитывать только на себя и чувствую себя по-настоящему свободным.
В настоящее время каждый велокомпьютер предлагает много информации: каденс, мощность, мгновенная скорость, набор высоты. Там есть почти все, что может захотеть знать велосипедист.
Однако я ни разу не видел информации о том, сколько времени я езжу сидя и сколько времени прыгаю на педалях (как говорят на жаргоне).
После изучения различных курсов по машинному обучению и получения некоторых специализаций я искал курс на Coursera, который мог бы познакомить меня с миром машинного обучения на встроенных устройствах, и нашел этот интересный курс https://www.coursera.org. /learn/introduction-to-embedded-machine-learning/home/welcome», предлагаемый Edge-Impulse.
Курс преподаетШон Хаймел и очень хорошо структурирован. . Каждая глава включает теоретическую вводную часть, а затем прикладную часть с примерами проектов, созданных с использованием как обычного мобильного телефона, так и устройства Arduino Nano 33 BLE.
Bingo !!! Я вспомнил, что у меня где-то был Arduino Nano 33 BLE, купленный для других целей. Пришло время использовать то, что я узнал во время курса, и создать проект машинного обучения, который позволил бы нам определить, крутит ли велосипедист сидя или стоя на педалях. В этой статье описываются различные шаги, предпринятые для реализации проекта. Пойдем.

Эдж Импульс Студия

Edge Impulse Studio — это очень мощная комплексная платформа, которая помогает специалисту по данным на всех этапах проекта: сбор данных, разделение данных, извлечение признаков, проектирование нейронной сети, тестирование модели, классификация в реальном времени, развертывание.
По этой причине я я убежден, что Edge Impulse Studio очень полезен, особенно для начинающих. В любом случае фреймворк находится в стадии разработки, и в будущем будут добавлены более сложные функции.

Я быстро расскажу о некоторых этапах установки, потому что на сайте Edge Impulse вы найдете всю информацию, необходимую для подключения встроенного устройства к платформе (не только Arduino Nano).

Если вы еще этого не сделали, создайте пограничный импульсный аккаунт. Многие инструменты Edge Impulse, которые мы собираемся использовать, требуют от пользователя входа в систему для подключения к Edge Impulse Studio.

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

Мой проект — вставай на педали с arduino-nano.

Первый шаг — подключить Arduino Nano к ПК/ноутбуку для разработки, на котором я вошел в Edge Impulse Studio.

В Ubuntu 20.04 Arduino обнаруживается на шине USB через виртуальный последовательный интерфейс (/dev/ttyACM0). Мы будем использовать этот интерфейс для сбора данных с устройства и обмена с ним другой информацией.

Процедура подробно описана на этой странице. В частности, нам нужно установить Edge Impulse CLI и Arduino CLI.

На моей Ubuntu 20.04 процедура прошла довольно гладко. Мне нужно было просто обновить Node.js до более новой версии версии по умолчанию, доступной в Ubuntu 20.04 (выпуск 10). Для некоторых инструментов Edge требуется более поздняя версия (не менее 12). Я установил релиз 16. Некоторые полезные советы по установке новой версии Node.js доступны здесь.

Для сбора данных с помощью Arduino Nano 33 BLE необходимо обновить прошивку. Прошивка Arduino, подходящая для этой области, доступна здесь.

Zip-файл включает в себя двоичный файл для прошивки на устройстве (arduino-nano-33-ble-sense.ino.bin) и три скрипта для Windows (flash_windows.bat), Linux (flash_linux.sh) и Mac соответственно (flash_mac. команда). Конечно, в моем случае я использовал сценарий Linux.

Теперь устройство готово к управлению Edge Impulse Studio для сбора данных. Нам нужно просто запустить «демон Edge-Impulse» на ПК/ноутбуке, к которому Arduino подключен через USB-кабель, и подключить устройство к удаленной стороне.

fabio@fabio-Aspire-7750G:~/Projects/Arduino/$ edge-impulse-daemon
Серийный демон Edge Impulse v1.14.0
Конечные точки:
Websocket: wss://remote-mgmt .edgeimpulse.com
API: https://studio.edgeimpulse.com/v1
Ingestion: https://ingestion.edgeimpulse.com

[SER] Подключение к /dev/ttyACM0
[SER] Последовательный порт подключен, попытка чтения конфигурации…
[SER] Полученная конфигурация
[SER] Устройство выполняет AT-команду версии 1.6.0

? К какому проекту вы хотите подключить это устройство? fabio antonini / get-on-pedals-with-arduino-nano
[SER] Устройство не подключено к API удаленного управления, будет использоваться демон
[WS ] Подключение к wss://remote-mgmt. edgeimpulse.com
[WS ] Подключено к wss://remote-mgmt.edgeimpulse.com
? Какое имя вы хотите дать этому устройству? 1B:EC:54:F8:6F:8C
[WS ] Устройство 1B:EC:54:F8:6F:8C теперь подключено к проекту вставай-на-педали-с-arduino-nano
[WS ] Перейдите на https://studio.edgeimpulse.com/studio/67041/acquisition/training, чтобы создать свою модель машинного обучения!

Если у вас есть несколько проектов в Edge Impulse Studio, вам будет предложено выбрать, к какому проекту вы хотите подключиться. Это не применяется, если это ваш первый проект Edge Impulse.

Вы можете убедиться, что устройство успешно подключено к Edge Impulse Studio на странице «Устройства».

Первое устройство — это мой Arduino Nano. Вторая запись для моего смартфона, не подключенного в данный момент.

Теперь все становится интереснее. Мы успешно подключили наше встроенное устройство к студии Edge Impulse и готовы собирать данные в реальном времени. Двигаться вперед.

Сбор данных

Каждый специалист по данным должен иметь глубокое понимание данных, которые ему необходимо обрабатывать. По моему опыту, данные, собранные для обучения модели, должны «покрывать» всю область возможных значений. Несоблюдение этого требования приведет к серьезным проблемам, когда модель будет запущена в производство.

В этом случае задача проста. Нам нужно понять, сидит ли всадник

или прыгает на педалях.

Мы ожидаем другие значения для некоторых данных акселерометра. Задача, которую мы хотим решить, — это обычная задача контролируемой классификации. Модель должна быть достаточно прочной в любых условиях: сидеть на равнине или сидеть, но в гору, прыгать на педалях во время подъема, а также толкаться на спринте в равнине. Две метки будут называться «равнина» и «в гору».

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

Крытый велосипед

«Скоро зима…» — сказал кто-то. Здесь, в центре Италии, зима холодная и в этот период не рекомендуется выезжать на велосипеде из-за температуры, гололедицы на дороге и сильного дождя. Я открыл для себя катание на велосипеде в помещении несколько лет назад и провел много часов, тренируясь зимой на своем крытом тренажере. Здесь ниже моя тренировочная установка.

Конечно, мне нужно было использовать ноутбук для подключения Arduino и сбора данных.

Во время сбора данных Arduino Nano был помещен в прозрачную сумку для смартфона, прикрепленную к руке.

В Edge Impulse Studio щелкните значок «Сбор данных» на левой боковой панели. Вы должны увидеть что-то подобное здесь ниже.

На этой странице вам нужно просто выбрать устройство, с которого вы хотите собирать данные, написать метку, которая будет использоваться для данных, длину выборки (в моем случае 10 секунд) и нажать кнопку «Начать выборку».

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

Вот пара образцов для двух классов.

Все данные будут доступны в разделе «Данные для обучения», но позже некоторые из этих данных будут перемещены в тестовый набор данных, используемый для проверки модели перед ее развертыванием в полевых условиях. Edge Impulse Studio может разделить данные между «Обучение» и «Тест» в «Панель управления», см. рисунок ниже (Выполнение разделения обучения/тестирования).

Edge Impulse Studio автоматически разделит данные в соответствии с разумным процентом. Результат показан ниже.

Теперь мы готовы разработать «Импульс».

Импульсный дизайн

В терминологии Edge Impulse «импульс» берет необработанные данные, использует обработку сигналов для извлечения функций, а затем использует блок обучения для классификации новых данных. «Импульс» можно создать, нажав «Создать импульс» на боковой панели слева на главной странице.

В интерфейсе «Импульс» пользователь может выбрать «блок обработки» для процедуры извлечения признаков (спектральный анализ в моем случае для акселерометра) и «блок обучения» (классификатор нейронной сети) для классификации. Рекомендую проанализировать все доступные настройки как блока «обработка», так и блока «обучение». Хочу заметить, что можно выбрать не один блок «обработки» или «обучения». Например, для «блока обучения» можно добавить блок «обнаружения аномалий», чтобы найти выбросы в новых данных. Это полезно для распознавания неизвестных состояний и для дополнения классификаторов.

Сохраните свой импульс, нажав на правую кнопку справа, и перейдите к следующему разделу, Извлечение признаков.

Извлечение признаков

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

В конце обработки вы можете взглянуть на «Обозреватель функций» справа. Среднеквадратичное значение (среднеквадратичное значение) было оценено для данных в обучающем наборе и для каждой оси. График можно вращать, чтобы лучше понять, хорошо ли разделены два класса или нет. В нашем случае классы кажутся достаточно разделенными, поэтому мы уверены в процессе обучения, который будет описан в следующем разделе.

Классификатор нейронной сети

Мы не далеко от цели. Теперь нам нужно спроектировать модель нейронной сети, которая будет обучаться с использованием данных, доступных в обучающем наборе. Нажмите «NN Classifier» на левой боковой панели, и вы перейдете в окно ниже.

Рисование модели нейронной сети — это не пятиминутное дело, поэтому я не буду вдаваться в подробности. Однако могу сказать, что Edge Impulse Studio предлагает интересный графический интерфейс, который значительно упрощает разработку. Код Keras автоматически генерируется для модели. Конфигурация по умолчанию уже выглядит неплохо (всего пара плотных слоев и вывод). В качестве первой попытки я предпочел ничего не менять и посмотреть на результат обучения. Тренировку можно начать, нажав на зеленую кнопку «Начать тренировку». Это займет немного времени (по умолчанию 30 эпох). По окончании 30 прогонов результаты кажутся многообещающими.

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

Результаты достаточно хорошие. Оценка F1 хорошая, и по этой причине нам не нужно изменять модель.

Нам нужно просто проверить модель на тестовом наборе (данные, которые модель еще не «видела»). Это показано в следующем разделе.

Тестирование

Набор тестовых данных был перемещен в конце сбора данных. Таким образом, модель не обучалась на этих данных. Чтобы выполнить вывод по этим данным, щелкните элемент «Тестирование модели» на левой боковой панели и перейдите в область «Тестирование модели». В разделе «Тестовые данные» вы можете увидеть некоторые образцы тестового набора данных.

Чтобы выполнить вывод по этим данным, нажмите зеленую кнопку «Классифицировать все».

Результат показан ниже.

Общая точность лишь немного меньше, чем общая точность набора обучающих данных, но это нормально, поскольку модель не обучалась на этих данных. Путаница с матрицами довольно многообещающая, мы недалеки от совершенства. Оценка F1 удовлетворительная.

Вывод такой: модель вроде неплохая. Теперь мы можем перейти к последним шагам, живой проверке и развертыванию. Это будет реальной валидацией разработанной модели.

Версии

Прежде чем перейти к последним шагам, я хочу упомянуть об интересной функции фреймворка Edge Impulse Studio — управлении версиями.

Вы наверняка знаете, что при разработке модели машинного обучения необходимо делать множество тестов, изменяя гиперпараметры нейронной сети, изменяя структуру нейронной сети, добавляя больше данных, чтобы лучше покрыть всю область возможных значений. По этой причине Edge Impulse Studio позволяет вам версионировать созданную модель, сохраняя все настройки, которые привели к определенной (более или менее удовлетворительной) производительности.

Для этого нажмите на пункт «Версии» на левой боковой панели. Окно должно быть самоочевидным. Пользователь может добавить комментарий для описания модели, гиперпараметров и так далее.

Живая проверка

Перед развертыванием модели на устройстве полезно проверить модель на соответствие реальным данным, полученным с устройства. Для этого еще раз запустите «edge-impulse-daemon» с вашего ПК/ноутбука для разработки, чтобы подключить Arduino Nano к Edge Impulse Studio, и нажмите «Живой классификатор» в Edge Impulse Studio.

Затем нажмите зеленую кнопку «Начать выборку», чтобы получить реальные данные с устройства и передать их модели для вывода. Выборка занимает 10 секунд (по умолчанию). Затем полученные данные обрабатываются для выполнения спектрального анализа и получения функций, которые будут переданы в модель. Менее чем через секунду результат будет доступен в том же окне, что и на картинке ниже (в тот момент я прыгал на педалях своего велосипеда).

На рисунке ниже показан результат вывода, когда я сидел на своем велосипеде (без прыжков).

Результаты Live-классификации кажутся многообещающими. Последним шагом является развертывание модели на устройстве и попытка ее использования без передачи данных в среду Edge Impulse Studio.

Развертывание

Вы можете развернуть свой импульс на любом устройстве. Это позволяет модели работать без подключения к Интернету, сводит к минимуму задержку и работает с минимальным энергопотреблением. Конечно, Arduino Nano 33 BLE полностью поддерживается.

Пользователь может создать библиотеку для самостоятельной сборки модели из Arduino IDE или может попросить Edge Impulse Studio собрать прошивку и получить zip-файл с готовой прошивкой для развертывания на устройстве.

В первом случае (Создать библиотеку) результатом является zip-файл (ei-get-on-pedals-with-arduino-nano-arduino-1.0.3.zip), который можно импортировать в Arduino IDE.

Из Arduino IDE пользователь может просмотреть исходный код и добавить свои фрагменты кода для реализации некоторых дополнительных функций. Артефакт сборки может быть развернут Arduino IDE на устройстве.

Во втором случае на выходе получается zip-файл, содержащий встроенную прошивку и скрипт, который можно использовать для прошивки прошивки на устройство (Arduino Nano 33 BLE).

fabio@fabio-Aspire-7750G:~/Projects/Arduino/ML-on-bike$ ls-на-педали-с-arduino-nano-nano-33-ble-sense-v2
firmware-arduino- nano-33-ble-sense.ino.bin прошивка-arduino-nano-33-ble-sense.ino.with_bootloader.bin flash_linux.sh flash_mac.command flash_windows.bat

На той же странице, чуть ниже, есть сводка построенной модели, в которой сообщается о некоторых интересных параметрах: использование ОЗУ, задержка, использование флэш-памяти, точность как для квантованной (int8), так и для неоптимизированной (float32) моделей.

Оптимизированная (квантованная) модель показывает лучшее поведение, чем неоптимизированная модель, с более высокой точностью и меньшим использованием ОЗУ и флэш-памяти. Задержка вывода одинакова для обоих из них.

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

В моем случае я решил пойти по первому пути и импортировать библиотеку в Arduino IDE.

Я добавил фрагмент кода для обработки трех светодиодов, чтобы сделать видимым результат вывода. В частности, синий светодиод будет гореть, когда модель определит «простую» метку (велосипедист лежит на седле велосипеда). Зеленый светодиод будет гореть, когда гонщик будет прыгать на педалях (в гору или спринт на равнине). Наконец, я использовал третий КРАСНЫЙ светодиод, который включается, когда модель имеет «неопределенный» результат.

Светодиоды нужно настроить. Здесь ниже краткий фрагмент измененного исходного кода.

Ведущая декларация

/* Объявление светодиодов */
const int ledUncertain = 23; // RED
const int ledPlain = 22; // СИНИЙ
const int ledUphill = 24; // ЗЕЛЕНЫЙ
const int ledPwr = 25; //

Инициализация светодиода в функции setup()

pinMode(ledPlain, OUTPUT);
pinMode(ledUphill, OUTPUT);
pinMode(ledUncertain, OUTPUT);
pinMode(ledPwr, OUTPUT);

Обработка светодиодов во время выполнения в функции loop()

if (!strcmp(prediction, «plain»)) {
digitalWrite(ledPlain, HIGH);
digitalWrite(ledUncertain, LOW);
digitalWrite(ledUphill, LOW);
} else if (!strcmp(прогноз, «в гору»)) {
digitalWrite(ledPlain, LOW);
digitalWrite(ledUncertain, LOW);
digitalWrite(ledUphill, HIGH);
} else if (!strcmp(прогноз, «неопределенно»)) {
digitalWrite(ledPlain, LOW);
digitalWrite(ledUncertain, HIGH);
digitalWrite(ledUphill, LOW);
} else {
digitalWrite(ledPlain, LOW);
digitalWrite(ledUncertain, LOW);
digitalWrite(ledUphill, LOW);
}

Затем из Arduino IDE я просто скомпилировал и загрузил модель на устройство. Я запустил последовательный монитор, чтобы собрать некоторые трассировки в дополнение к информации, отображаемой цветом светодиода.

Модель работает, как и ожидалось, и правильно выводит метки, соответствующие состоянию байкера. Светодиоды правильно включаются и выключаются. Как бы то ни было, я заметил, что при переходе из одного состояния в другое (от сидения к прыжку) выводится ярлык «неопределенно». Это правильно, потому что это переходный процесс, во время которого собранные данные смешиваются. Таким образом, модель не может вывести четкое состояние. Ниже приведены трассировки, собранные во время транзиента.

…………………..
(DSP: 18 мс., Классификация: 1 мс., Аномалия: 0 мс.): обычный [ 10, 0, 0, 0, ]
(DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс): обычный [ 10, 0, 0, 0, ]
(DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс): обычный [ 9, 1, 0, 0, ]
(DSP: 18 мс, классификация: 1 мс ., Аномалия: 0 мс.): обычный [ 8, 2, 0, 0, ]
(DSP: 18 мс, Классификация: 1 мс, Аномалия: 0 мс.) : обычный [ 7, 3, 0, 0, ]
(DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс): обычный [ 7, 3, 0, 0, ]
(DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс): обычный [ 7, 3, 0, 0, ]
(DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс): обычный [ 7, 3, 0, 0, ]
( DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс): неопределенно [ 6, 3, 1, 0, ]
(DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс): неопределенно [ 5, 4, 1, 0, ]
(DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс .): неопределенно [ 4, 5, 1, 0, ]
(DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс): неопределенно [ 3, 6, 1, 0, ]
(DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс): неопределенно [ 3, 6, 1, 0, ]
(DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс): неопределенно [ 3, 6, 1, 0, ]
(DSP: 18 мс, Классификация: 0 мс, Аномалия: 0 мс): неопределенно [ 3, 6, 1, 0, ]
(DSP: 18 мс, Классификация: 0 мс, аномалия: 0 мс): в гору [ 2, 7, 1, 0, ]
(DSP: 18 мс, классификация: 0 мс, аномалия: 0 мс): в гору [ 1, 8, 1, 0, ]
(DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс): в гору [ 0, 9, 1, 0, ]
(DSP: 18 мс, классификация: 0 мс, аномалия: 0 мс): в гору [ 0, 10, 0, 0, ]
(DSP: 18 мс, классификация: 0 мс, аномалия: 0 мс): в гору [ 0, 10, 0, 0, ]< br /> (DSP: 18 мс, классификация: 1 мс, аномалия: 0 мс): в гору [ 0, 10, 0, 0, ]
(DSP: 18 мс ., Классификация: 1 мс., Аномалия: 0 мс.): в гору [ 0, 10, 0, 0, ]
…………………..

Краткое содержание

В этом проекте я разработал модель машинного обучения, чтобы предсказать, крутит ли велосипедист сидя или стоя на педалях. Модель была разработана для Arduino Nano 33 BLE. Сбор данных, моделирование модели, проверка модели проводились с использованием фреймворка Edge Impulse Studio. Та же структура использовалась для создания библиотеки, которая была импортирована в IDE Arduino, из которой был скомпилирован двоичный файл и загружен на устройство Arduino Nano 33 BLE.

Вот ссылка на полный проект, доступный в репозитории Edge-Impulse-Studio.

https://studio.edgeimpulse.com/public/67041/latest

Цель проекта состояла в том, чтобы проиллюстрировать весь процесс реализации модели машинного обучения для встраиваемой системы. Для этого платформа Edge Impulse Studio оказалась действительно полезной и очень мощной. Я рекомендую его использовать всем, кто впервые входит в увлекательный мир машинного обучения. Приятного обучения!