Испытание платформы машинного обучения Edge Impulse на плате XIAO BLE Sense


Мы видели платформу разработки Edge Impulse для машинного обучения на периферийных устройствах, используемую несколькими платами, но пока у нас не было возможности опробовать ее. Поэтому, когда представители компании Seeed Studio спросили нас, интересно ли нам протестировать плату XIAO BLE Sense на базе nRF52840 , мы подумали, что было бы неплохо протестировать ее с помощью Edge Impulse, поскольку мы видели демонстрацию распознавания движения/жестов на плате.

Это было не просто, так как нам потребовалось четыре месяца, чтобы завершить обзор с того момента, как Seeed Studio впервые связалась с нами, в основном из-за плохой работы DHL, из-за которой первые платы застряли на таможни, а затем тратить время на не самые лучшие инструкции, которые нам приходилось видеть (теперь исправлены), и другие моменты. Но нам удалось заставить его работать (вроде), так что давайте посмотрим.

Распаковка XIAO BLE (Sense) и OLED-дисплея

Поскольку в демонстрации распознавания жестов использовался OLED-дисплей, мы также попросили его и получили плату XIAO BLE (без датчика), плату XIAO BLE Sense и OLED-дисплей Grove 0,66″ .

Обе платы очень маленькие и абсолютно одинаковые, за исключением того, что в XIAO BLE отсутствует встроенный 6-осевой IMU LSM6DS3TR (внизу слева).

Xiao BLE Sense (вверху) против Xiao BLE (внизу)

Необходимость пайки…

Перед загрузкой прошивки на плату пришлось припаять дисплей к плате. Мы просто перерезали кабель Grove и припаяли черный и красный провода к питанию, а белый и желтый к I2C.

У нас нет 3D-принтера (так же застрял на таможне), поэтому вместо этого мы использовали несколько слоев двустороннего скотча, чтобы соединить две платы вместе, но это необязательно.

Эскизы Arduino для OLED-дисплея и акселерометра XIAO BLE Sense

Нам потребовалось некоторое время, чтобы найти инструкции для демонстрации распознавания жестов, так как они не были указаны в описании видео, и нам не удалось ничего найти об этом в вики Seeed Studio. В конце концов нам дали ссылку на инструкции, и компания изменила веб-сайт, чтобы его было легче найти.

Прежде чем испробовать Edge Impulse, мы запустим два скетча Arduino, чтобы проверить, как работает OLED-дисплей и акселерометр.

Первым шагом является добавление URL-адреса диспетчера плат Seeed Studio: https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json.

Теперь мы можем установить пакет для поддержки плат Seeed nRF52…

… и как только это будет сделано, давайте подключим плату кабелем USB-C к нашему компьютеру и выберем плату Seeed XIAO BLE Sense — nRF52840 с настройками по умолчанию.

Давайте попробуем программу «Hello World», чтобы убедиться, что наша плата работает и соединение с OLED-дисплеем в порядке.

Но устройство работало не так как ожидалось, и во время компиляции мы получили ошибку:

Ответ на сайте Adafruit, где мы узнаем две важные детали:

  • Для nRF52 требуется Arduino 1.8.15 или выше, поэтому вам, возможно, придется обновиться до последней версии.
  • Linux требует установки adafruit-nrfutil

Поскольку мы используем Ubuntu 20.04, нам пришлось запустить:

Обратите внимание, что это НЕ требуется, если вы используете Arduino IDE в Windows или MacOS. Утилита была установлена ​​в $HOME/.local/bin, поэтому вам нужно добавить ее в свой путь и перезапустить Arduino IDE. Это можно временно сделать в командной строке:

Или вы можете изменить файл /etc/environment или ~/.bashrc, чтобы навсегда добавить папку в свой PATH. На удалось создать скетч и двоичный файл был записан на плату без проблем.

Но на дисплее ничего не отображалось. Мы добавили отладочное сообщение serial.println в основной цикл, чтобы убедиться, что он действительно работает, дважды проверили соединения с помощью мультиметра и не смогли найти очевидного решения. Представители Seeed Studio посоветовали нам перейти на версию 1.0.0 пакета плат Seeed nRF52.

И это действительно помогло!

Обратите внимание, что вам больше не нужно переходить на версию 1.0.0 в остальной части обзора, и рекомендуется использовать 2.6.1 и выше. Новый образец «Hello World» выглядит так:

Пора переходить к тестированию демо акселерометра. Во-первых, нам нужно установить библиотеку LSM6DS3 Arduino от Seeed Studio.

Обратите внимание, что существует также официальный Arduino_LSM6DS3, который вам может потребоваться удалить, чтобы избежать конфликтов. Вот код:

Обратите внимание, что когда мы использовали платы Seeed nRF52 v1.0.0 с этим образцом, мы получали сообщения «ошибка декодирования», которые исчезли с версией 2.6.1. Нам нужно открыть последовательный монитор, чтобы проверить, отображаются ли значения X, Y, Z.

Важно: для следующего шага нам все равно потребуется запустить демо-версию ускорителя. Поэтому, если вы сначала играете с другими примерами, убедитесь, что демо-версия accelerator запущена, прежде чем переключаться на Edge Impulse.

Edge Impulse на XIAO BLE Sense

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

Мы выберем данные акселерометра.

Нам также потребуется установить Edge Impulse CLI в Linux (Ubuntu 20.04 для этого обзора). Для этого сначала требуется установить NodeJS 14.x:

Каталог по умолчанию будет находиться в /usr, доступном для root, давайте изменим его на каталог пользователя, который мы также добавим в наш путь:

Теперь мы можем установить Edge Impulse CLI:

Возможно, вам придется выйти из терминала и перезапустить его, чтобы применить новый PATH. Теперь мы можем запустить edge-impulse-data-forwarder, используемый для плат, официально не поддерживаемых Edge Impulse (например, XIAO BLE Sense):

При первом запуске команды вам потребуется ввести имя пользователя и пароль (не показано выше). Утилита сканирует последовательные устройства, подключается к граничному импульсу, пытается обнаружить данные из последовательного порта и после этого просит нас назвать поля данных (Ax, Ay, Az), устройство (XIAO BLE SENSE) и автоматически подключит его в проект, который мы только что создали. Если в Edge Impulse несколько проектов, вам будет предложено сначала выбрать проект. Это означает, что он в основном не зависит от аппаратного обеспечения, и пока ваша плата выводит данные акселерометра на последовательный интерфейс, он должен работать.

Вернёмся к Edge Impulse, нажмём на Сбор данных, и мы увидим наше устройство вместе с параметрами датчика и настройками частоты данных.

Давайте установим размер выборки на 20 000 мс, определим метку, нажмем «Начать выборку» и переместим плату вверх и вниз примерно на 1 секунду в течение 20 секунд, чтобы получить данные.

Затем нам нужно разделить данные, щелкнув три точки в необработанном разделе и выбрав «Разделить выборку». Нажмите «+Добавить сегмент», чтобы добавить дополнительный раздел. Мы должны повторять это, пока не получим около 20 сегментов, представляющих движение вверх и вниз. Если вы двигались медленнее или быстрее, чем 1 с, отрегулируйте время в «Установить длину сегмента (мс)».

Мы используем Firefox, и у нас была ошибка, из-за которой мы могли добавить сегмент, но когда мы выбирали его для перемещения, он смещался вправо, иногда за пределы экрана. Но если бы мы продолжали нажимать кнопку мыши и двигать ее влево, это могло бы вернуть ее в поле зрения. Это было не совсем удобно, и мы не можем слишком сильно увеличивать масштаб, иначе коробка слишком сильно выйдет за пределы дисплея. Использование Chrome или Microsoft Edge с Edge Impulse может быть лучше.

Как только мы нажмем «Разделить», мы увидим выбранную нами 1-секундную выборку данных.

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

На этом этапе вы можете увидеть проблему:

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

Чтобы исправить это, вы можете либо собирать тестовые данные в течение более короткого периода (например, 2 секунды), либо повторно сбалансировать набор данных, щелкнув «Панель инструментов» в левом меню и прокрутив вниз, чтобы найти кнопку «Выполнить обучение/тестовое разделение».

Теперь мы готовы создать импульс. Нажмите «Создать импульс» -> «Добавить блок обработки» -> «Спектральный анализ» -> «Добавить блок обучения» -> «Выбрать классификацию (Keras)» -> «Сохранить импульс».

Щелкните Спектральные объекты в Спектральном анализе , затем Сохранить параметры и Создать объекты .

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

Нажмите «Классификатор NN», затем «Начать обучение», что займет около одной минуты. Затем мы можем выбрать Неоптимизированный (float32)

Точность действительно низкая, и модель практически непригодна для использования, поскольку правильно определяется только образец «против часовой стрелки».

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

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

Пройдемся по «Тестированию модели» в левом меню.

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

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

Вернемся к среде разработки Arduino. Загрузите образец Arduino, предоставленный Seeed Studio, который претерпел множество изменений за последние несколько месяцев. Измените заголовок файла Edge Impulse (строка 24 в примере ниже), чтобы он соответствовал вашему собственному, и нам также пришлось закомментировать строку с библиотекой U8X8lib.h. Мы также немного модифицировали код, так как не тренировался на «холостом ходу», как в их демо:

Нам нужно добавить библиотеку ZIP, которую мы загрузили из Edge Impulse, в библиотеку Arduino, и теперь мы можем собрать и записать код на плату. Это займет около 5 минут в первый раз и около 2 минут для последующих сборок.

Вот вывод из последовательной консоли.

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

Вот как это выглядит на видео.

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

Нам хотелось бы поблагодарить Seeed Studio за отправку плат XIAO BLE (Sense) и OLED-дисплея Grove для тестирования Edge Impulse. Нам просто хотелось бы, чтобы документация была правильной с первого раза. Если вы заинтересованы в воспроизведении приведенной выше демонстрации, плата XIAO BLE Sense продается за 15,99 долларов США, а OLED-дисплей — за 5,50 долларов США, и это необязательно, мы можем увидеть результаты в последовательном терминале.

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

Оригинал статьи вы можете прочитать здесь.

0 0 vote
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Inline Feedbacks
View all comments