Машинное обучение на Arduino

Ардуино можно использовать не только для того, чтобы помигать лампочкой. Новый проект команды TensorFlow Lite - TensorFlow Lite Micro для Arduino Nano 33 BLE Sense показывает, что ее можно использовать, в том числе и для машинного обучения. В статье будет рассказано, как установить и запустить примеры TensorFlow Lite Micro, которые теперь доступны в Arduino Library Manager
7859
В избранное

Ардуино можно использовать не только для того, чтобы помигать лампочкой. Новый проект команды TensorFlow Lite - TensorFlow Lite Micro для Arduino Nano 33 BLE Sense показывает, что ее можно использовать, в том числе и для машинного обучения. В статье будет рассказано, как установить и запустить примеры TensorFlow Lite Micro, которые теперь доступны в Arduino Library Manager.

Что будет в этой статье? Для начала установим нейронную сеть на плату Arduino для распознавания простых голосовых команд.

Запуск предварительно обученного примера вывода micro_speech

Пример 1. Запуск предварительно обученного примера вывода micro_speech

Далее расскажем, как обучить свою собственную модель распознавания жестов для Arduino с использованием TensorFlow в Colab. Этот материал основан на практическом семинаре, проведенном Sandeep Mistry и Don Coleman, обновленная версия которого теперь доступна онлайн.

Обучение вашей собственной модели классификации жестов

Пример 2. Обучение вашей собственной модели классификации жестов

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

Итак, начнем!

Примечание: примеры в этой статье основаны на TensorFlow Lite Micro для микроконтроллеров. Хотя в статье и говорится о применении фреймворка в среде Ардуино, вы можете использовать TensorFlow Lite Micro и в других решениях, не связанных с этой экосистемой. По сути, фреймворк представляет собой библиотеку, написанную на С с очень небольшими требованиями по памяти, и она может быть использована на значительном числе 32-х разрядных микроконтроллеров.

Микроконтроллеры и TinyML

Микроконтроллеры, в том числе и те, что установлены на платах Arduino, представляют собой недорогие, однокристальные, автономные компьютерные системы. Эти миниатюрные компьютеры встроены в миллиарды гаджетов, таких как носимые устройства, беспилотные аппараты, 3D-принтеры, игрушки, пароварки, умные розетки, электронные скутеры, стиральные машины. Тенденция к подключению этих устройств к глобальной сети является частью того, что называют Интернетом вещей.

Arduino - это платформа с открытым исходным кодом и сообщество, ориентированное на то, чтобы сделать разработку приложений для микроконтроллеров доступной для всех. Используемая в примерах плата оснащена микроконтроллером Arm Cortex-M4 с тактовой частотой 64 МГц, 1 МБ флэш-памяти и 256 КБ ОЗУ. Это совсем не много, если сравнивать с облаком, ПК или ноутбуком, но,с другой стороны, это средний по возможностям микроконтроллер.

 Arduino Nano 33 BLE Sense -размер платы меньше, чем упаковка жевательной резинки

Рис. 1. Arduino Nano 33 BLE Sense -размер платы меньше, чем упаковка жевательной резинки

Есть несколько причин, по которым вы можете захотеть реализовать ML на микроконтроллере:

  • Разработка интеллектуального устройства с возможностью работы независимо от Интернета.
  • Снижение стоимости изделия.
  • Конфиденциальность - нежелание выпускать данные датчиков в Интернет.
  • Эффективность - миниатюрный форм-фактор устройства, низкое потребление и более длительное время автономной работы.

Кроме того, есть конечная цель, к которой мы стремимся, это очень важно:

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

С точки зрения машинного обучения существуют методы, которые можно использовать, чтобы приспособить модели нейронных сетей к устройствам с ограниченным объемом памяти, таким как микроконтроллеры. Одним из ключевых методов является квантование весов с плавающей запятой до 8-разрядных целых чисел. Это также приводит к ускорению инференций и возможности применения моделей нейронный сетей на устройствах с более низкой тактовой частотой.

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

Что нужно для начала

  • Отладочная плата Arduino Nano 33 BLE Sense
  • Кабель Micro USB для подключения платы Arduino к настольному компьютеру
  • Для программирования своей платы вы можете использовать Arduino Web Editor или установить Arduino IDE. Далее будет рассказано, как их настроить.

Arduino Nano 33 BLE Sense имеет множество встроенных датчиков, что расширяет потенциал разработки приложений Tiny ML:

  • Звук - цифровой микрофон;
  • Движение - 9-осевой датчик положения (акселерометр, гироскоп, магнитометр);
  • Окружающая среда - температура, влажность и давление;
  • Свет - яркость, цвет и приближение объекта.

В отличие от классического Arduino Uno, плата сочетает в себе микроконтроллер со встроенными датчиками, что означает, что вы можете решать многие задачи без дополнительного оборудования и проводов. Плата при этом достаточно мала, и ее можно использовать в носимых решениях. Как следует из названия, он имеет интерфейс Bluetooth LE, поэтому вы можете отправлять данные (или результаты вывода) на ноутбук, мобильное приложение или другие платы BLE и периферийные устройства.

Примеры TensorFlow Lite для микроконтроллеров

Примеры для TensorFlow Lite для микроконтроллеров доступны через менеджер библиотеки Arduino, что позволяет включать и запускать их на Arduino в несколько кликов. В этом разделе мы покажем, как их запустить. Библиотека включает сейчас следующие примеры:

  • micro_speech - распознавание речи с помощью встроенного микрофона;
  • magic_wand - распознавание жестов с использованием встроенного IMU;
  • person_detection - обнаружение человека с помощью внешней камеры ArduCam.

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

Как запустить примеры с помощью веб-редактора Arduino Create

Подключив Arduino Nano 33 BLE Sense к настольному компьютеру с помощью USB-кабеля, вы сможете скомпилировать и запустить примеры TensorFlow на отладочной плате с помощью веб-редактора Arduino Create.

Компиляция примера из библиотеки Arduino_TensorFlowLite

Рис. 2. Компиляция примера из библиотеки Arduino_TensorFlowLite

Распознавание речи: micro_speech

Большинство тех, кто только начинает знакомиться с Arduino, первым делом запускает пример blink - мигание светодиода. Мы тоже запустим аналогичный пример, но сделаем это с изюминкой, используя TensorFlow Lite Micro для распознавания голосовых ключевых слов. Контроллер будет работать с простым словарем - «Yes» и «No». Помните, что эта модель работает локально на микроконтроллере с оперативной памятью всего 256 КБ, поэтому не ожидайте точности распознавания уровня коммерческого «голосового ассистента», у нее нет подключения к Интернету и примерно в 2000 раз меньше доступной локальной памяти.

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

Выполнение примера micro_speech

Рис. 3. Выполнение примера micro_speech

Как запустить примеры с помощью Arduino IDE

Кроме того, вы можете использовать те же примеры вывода, используя приложение Arduino IDE.

Для  настройки сначала следуйте инструкциям в расположенном ниже разделе Настройка Arduino IDE.

Выберите пример через меню Файл > Примеры > Arduino_TensorFlowLite. Чтобы скомпилировать, загрузить и запустить примеры на отладочной плате, нажмите на значок стрелки:

Arduino_2.jpg (7 KB)

Для опытных пользователей, которые предпочитают командную строку, есть также arduino-cli.

Обучение модели TensorFlow Lite Micro для Arduino

Классификация жестов на Arduino BLE 33 Nano Sense, результат выводится как Emojis

Рис. 4. Классификация жестов на Arduino BLE 33 Nano Sense, результат выводится как Emojis

Далее мы будем использовать машинное обучение, чтобы дать возможность плате Arduino распознавать жесты. Мы загрузим данные движения из платы Arduino Nano 33 BLE Sense, импортируем их в TensorFlow для обучения модели и развернем получившийся классификатор на плате.

Идея этого урока была основана на потрясающей статье Play Street Fighter with body movements using Arduino and Tensorflow.js Charlie Gerard о контроле движения тела с использованием Arduino и Tensorflow.js. В этой статье плата передавала все данные датчика на компьютер, который и выполнял классификацию жестов в Tensorflow.js. Сейчас мы разовьем предложенное решение и с помощью «TinyML» выполним классификацию жестов на самой плате Arduino. В нашем случае это станет проще, поскольку используемая нами плата Arduino Nano 33 BLE Sense имеет более мощный процессор Arm Cortex-M4 и встроенный IMU.

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

Настройка Arduino IDE

Следуя приведенным ниже инструкциям, настройте среду разработки Arduino IDE, которая будет использоваться для загрузки моделей в плату и выгрузки данных обучения из нее. Это потребует несколько больше шагов, чем при использование веб-редактора Arduino Create, потому что нам потребуется загрузить и установить плату из библиотеки в Arduino IDE.

Arduino_3.jpg (36 KB)

  • Загрузите и установите Arduino IDE со страницы https://arduino.cc/downloads
  • Запустите установленное приложение Arduino
  • В меню Arduino IDE выберите «Инструменты» > «Платы» > «Менеджер плат» …
  • Найдите плату «Nano BLE» и нажмите «Установить платы»
  • Процесс установки займет несколько минут, после окончания закройте окно Boards Manager

Arduino_4.jpg (20 KB)

  • Теперь перейдите в Управление библиотеками ...
  • Найдите и установите библиотеку Arduino_TensorFlowLite
  • Затем найдите и установите библиотеку Arduino_LSM9DS1:

Arduino_5.jpg (26 KB)

  • Наконец, подключите кабель micro USB к плате и компьютеру
  • Выберите плату Инструменты > Платы > Arduino Nano 33 BLE
  • Выберите порт Инструменты > Порт > COM5 (Arduino Nano 33 BLE) (Обратите внимание, что фактическое имя порта может отличаться на вашем компьютере)

Потоковая передача данных с платы Arduino

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

На платах Arduino запускаются небольшие приложения (также называемые скетчами), которые компилируются из исходного кода Arduino в формате .ino и загружаются в контроллер с использованием IDE Arduino или Arduino Create.

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

  • Мониторит установленные на плате акселерометр и гироскоп
  • Запускает процедуру сохранения тестовых данных при обнаружении значительного линейного ускорения платы
  • Выводит 119 отсчетов за секунду в формате CSV через USB подключение
  • Зацикливается и ждет следующих жестов

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

Для программирования платы в Arduino IDE:

  • Откройте в среде Arduino скетч IMU Capture.ino
  • Скомпилируйте и загрузите его в плату с помощью Sketch > Load

Визуализация журнала данных датчика в реальном времени с платы Arduino

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

  • В Arduino IDE откройте построитель графиков Tools > Serial Plotter
  • Если вы получили сообщение об ошибке, что плата недоступна, повторно выберите порт: Tools > Port > portname (Arduino Nano 33 BLE)
  • Возьмите плату в руку и выполните различные движения
  • Вы должны увидеть график сбора данных с датчиков (см. GIF ниже)

0_ja9oGdgoQY4YUn0U_6.gif (536 KB)

Рис.5. График показаний датчиков, установленных на плате

Когда вы закончите, обязательно закройте окно Serial Plotter - это важно, так как это окно блокирует COM порт.

Сохранение тестовых выборок

Чтобы получить данные в виде CSV для загрузки в TensorFlow, можно использовать встроенный терминал Arduino IDE > Tools > Serial Monitor для просмотра данных и их экспорта на настольный компьютер:

  • Сбросьте плату
  • Возьмите плату в одну руку (взяв ее позже, вы активируете выборку)
  • В Arduino IDE откройте Arduino IDE > Tools > Serial Monitor
  • Сделайте тестовое движение с платой в руке
  • Медленно возвращайтесь в нейтральное положение, чтобы снова не вызвать срабатывание триггера
  • Повторите движение 10 или более раз, чтобы собрать больше данных
  • Скопируйте и вставьте данные из терминала в новый текстовый файл с именем csv
  • Очистите окно терминала и повторите все шаги, описанные выше, с новым жестом, сохранив данные в файле csv

Обратите внимание на первую строку ваших двух файлов CSV, она должна содержать поля aX, aY, aZ, gX, gY,gZ

Arduino_7.png (18 KB)

Если вы работаете в Linux, вы можете перенаправить вывод датчика из Arduino прямо в файл .csv в командной строке. Для этого, при закрытых окнах Serial Plotter/ Serial Monitor, используйте команду:

$ cat /dev/cu.usbmodem[nnnnn]> sensorlog.csv

Обучение в TensorFlow

Мы будем использовать Google Colab для обучения нашей модели, используя данные, которые были собраны на плате Arduino в предыдущем разделе. Colab предоставляет блокнот Jupyter, который позволяет нам проводить обучение TensorFlow в веб-браузере.

Тренировочный Colab Arduino распознавания жестов

Рис. 6. Тренировочный Colab Arduino распознавания жестов

Colab сделает для вас следующее:

  • Настроит Python Environment
  • Загрузит, разберет и подготовит данные из csv и flex.csv
  • Построит и обучит модель
  • Конвертирует обученную модель в TensorFlow Lite
  • Закодирует модель в заголовочный файл Arduino

Последний шаг colab - создание файла model.h для загрузки и включение его в наш проект классификатора жестов IDE Arduino, как будет описано в следующем разделе:

Тренировочный Colab Arduino распознавания жестов

Просто откройте блокнот arduino_tinyml_workshop.ipynb в Colab и пройдите по описанным выше шагам.

Классификация данных IMU

Далее будем использовать файл model.h, который мы только что подготовили и скачали из Colab, как было описано в предыдущей главе.

  1. Откройте ino в Arduino IDE.
  2. Создайте новую закладку в IDE под названием h

Arduino_10s.png (10 KB)

  1. Откройте закладку model.h и вставьте код, загруженный из Colab
  2. Скомпилируйте и загрузите прошивку в плату
  3. Откройте монитор последовательного порта
  4. Возьмите плату в руки и выполните жесты
  5. Достоверность распознавания каждого жеста будет отображаться в окне терминала (0 = низкая достоверность, 1 = высокая достоверность)

Поздравляем, вы только что подготовили свое первое приложение ML для Arduino!

Arduino_11.png (11 KB)

Теперь вы можете взять, например, скетч Emoji_Button.ino, который показывает, как создать USB-клавиатуру, которая печатает эмодзи в Linux и macOS и объединить с IMU_Classifier.ino, чтобы создать управляемую жестами клавиатуру emoji.

Вывод

Реализация Tiny ML для микроконтроллеров открывает широкие возможности для использования машинного обучения в новых проектах. Мы надеемся, что эта статья дала вам некоторое представление о его потенциале и будет отправной точкой, чтобы начать применять ML в ваших собственных проектах. Ну и, конечно, использовать TensorFlow Lite Micro можно не только в проектах Arduino - эту библиотеку можно подключить к любому 32-х разрядному микроконтроллеру.

Источник: https://medium.com/tensorflow

Производитель: ARDUINO
Наименование
Производитель
Описание Корпус/
Изображение
Цена, руб. Наличие
Arduino Nano 33 BLE
Arduino Nano 33 BLE
ARDUINO
Арт.: 3410405 ИНФО
Поиск
предложений
Wireless Module - U-blox NINA B306 module powered by Nordic Semi nRF52480 Arm Cortex-M4F microcontroller @ 64MHz, 1MB Flash, 256KB RAM, Bluetooth 5.0…
Arduino Nano 33 BLE
-
Поиск
предложений

Сравнение позиций

  • ()