Пример «Волшебная палочка» (Magic Wand) для Pico4ML с поддержкой BLE
1. Сбор данных для собственного проекта волшебной палочки
В этой части вы запишете собственные жесты, на которых потом обучите свой проект волшебной палочки.
Шаг 1
Откройте в браузере веб-страницу записи жестов (размещена на сайте OAK China).
a. Если появится предупреждение:
Error: This browser doesn't support Web Bluetooth. Try using Chrome.
Если вы работаете не в Chrome, перейдите на Chrome.
experimental web platform features). По опыту авторов, этот шаг нужен в старых версиях Chrome и в Linux.Если проблема не исчезает, проверьте, что страница открыта по https://.
По какой-то причине без защищённого протокола Web Bluetooth не работает.
b. После этого откроется страница примерно такого вида.
Шаг 2
Теперь подключите устройство по Bluetooth. Нажмите синюю кнопку Bluetooth — появится всплывающее окно с запросом на сопряжение. Выберите своё BLE-устройство — оно должно называться примерно BT16 — и нажмите кнопку сопряжения.
Авторы курса заметили, что иногда этот шаг приходится повторять дважды. После подключения кнопка Bluetooth станет зелёной.
Шаг 3
После сопряжения с Pico можно записывать жесты. Каждый раз, когда вы двигаете Pico и останавливаете её, записывается новый жест.
Дело в том, что жесты автоматически разделяются моментами, когда палочку держат неподвижно. Эти паузы — как пробелы между словами: закончив жест, остановите палочку, чтобы он чётко завершился.
Нарисованные жесты начнут выводиться в списке справа.
По отображаемым там фигурам видно, чётко ли получились жесты. Хорошее эмпирическое правило: если по фигуре нельзя понять, что это за жест, модели тоже будет трудно его распознать.
Чтобы удалить запись, нажмите значок корзины в правом верхнем углу записи жеста. Возможно, придётся удалить много лишних записей, которые возникли, пока вы переносили Pico в исходное положение между жестами.
Кроме того, обязательно задайте метки всем жестам для обучения.
Чтобы задать метку, нажмите вопросительный знак в левом верхнем углу жеста и введите метку. Например, на скриншоте ниже жесту в виде буквы Z, записанному авторами курса, присвоена метка Z.
По опыту авторов курса, около 20 примеров для каждого из 2–3 разных жестов часто достаточно, чтобы обучить вполне приличное приложение волшебной палочки (то есть у вас оно будет часто срабатывать, но может не обобщаться на других пользователей).
Чтобы было проще следить за числом записанных жестов, в правом верхнем углу экрана показан счётчик (например, число 1 на рисунке ниже). По опыту авторов, хорошо работают жесты вроде круга (O) или знака Зорро (Z).
Наконец, в скрипт обучения можно загрузить несколько файлов JSON, так что записывать все жесты за один раз не обязательно.
Шаг 4
Собрав все данные, нажмите синюю кнопку Download Data — автоматически скачается файл JSON со всеми жестами.
В следующем разделе этот файл понадобится в Colab для обучения вашей модели.
Download Data.2. Обучение и развёртывание собственного проекта волшебной палочки
В этой части вы обучите собственную модель волшебной палочки на только что записанных жестах и развернёте её на плате.
2.1. Обучение модели волшебной палочки
Сначала загрузите набор данных с жестами в Colab и обучите новую модель волшебной палочки.
Затем в том же блокноте Colab модель нужно преобразовать сначала в квантованный файл .tflite, а затем в файл .cc для Arduino IDE.
Понадобится итоговый файл .cc, поэтому обязательно скачайте его или не закрывайте вкладку с выводом.
Блокнот для Colab — 4-8-11-CustomMagicWand.ipynb из репозитория tinyMLx/colabs на GitHub.
2.2. Развёртывание обученной модели
Шаг 1
Подключите Arducam Pico4ML к компьютеру кабелем USB.
Шаг 2
Скачайте последнюю версию библиотеки Pico4ML_TensorFlowLite (раздел Releases репозитория Arducam-team/arduino-library на GitHub) и импортируйте её через меню Sketch → Include Library → Add .ZIP library....
Шаг 3
Откройте скетч magic_wand_lab.ino через меню: File → Examples → Pico4ML_TensorFlowLite → magic_wand_lab.
Шаг 4
Откройте файл magic_wand_model_data.cpp и обновите модель.
- Скопируйте содержимое двоичной модели из файла
magic_wand.ccв файлmagic_wand_model_data.cpp. Как обычно, копируйте только двоичные данные внутри { }: тип переменной в скачанном или выведенном файлеmagic_wand.ccдругой. - Затем прокрутите файл до конца и замените длину модели. Учтите: в файле
.cppпеременная должна иметь типconst int, а в файле.ccуказанunsigned int. Поэтому и здесь проще скопировать только числовое значение.
Шаг 5
Затем внесите в файл magic_wand.ino два изменения — укажите число жестов и их метки. Изменения вносятся в строки 48–52, которые сейчас выглядят так:
constexpr int label_count = 10;
const char* labels[label_count] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
- Измените
label_countна число жестов в вашем наборе данных. - Измените список
labelsна ваши жесты. Порядок важен: он должен совпадать с алфавитно-цифровым порядком, указанным в скрипте обучения.
Шаг 6
При сохранении будет предложено сохранить копию. Удобно создать внутри папки Arduino отдельную папку, например TinyML.
Основная папка Arduino находится в папке «Документы» или в домашней папке. Сохраните скетч туда под понятным именем, например magic_wand_custom.
Впрочем, сохранить скетч можно где угодно и под любым именем.
Шаг 7
Как обычно, выберите в меню Tools нужные порт и плату.
- Выберите плату Arducam Pico4ML:
Tools → Board: → Raspberry Pi RP2040 Boards → Raspberry Pi Pico. В разных ОС точное название платы может отличаться, но в нём должно быть хотя бы слово Pico. - Затем выберите USB-порт платы. В Windows, macOS и Linux он выглядит по-разному, но, скорее всего, в скобках будет указано «Arducam Pico4ML». Порт выбирается в меню
Tools → Port: → (Arducam Pico4ML). Название порта, скорее всего, будет одним из перечисленных ниже, где<#>— некоторое целое число:
- Windows →
COM<#> - macOS →
/dev/cu.usbmodem<#> - Linux →
ttyUSB<#>илиttyACM<#>
Шаг 8
Нажмите кнопку со стрелкой вправо, чтобы загрузить (прошить) код. Не пугайтесь, если в консоли появится ряд оранжевых предупреждений.
Это ожидаемо: код совсем свежий, экспериментальный.
Загрузка завершена, когда в консоли внизу IDE появится сообщение о загрузке кода на 100 % и строка вроде Done in <#.#> seconds.
Если произойдёт ошибка, появится оранжевая полоса ошибки, а в консоли — красное сообщение. Не волнуйтесь: у этого может быть много распространённых причин.
Шаг 9
Откройте монитор порта и проверьте свою модель.
Напомним: монитор порта сначала выводит ASCII-рисунок только что выполненного жеста, а под ним — наиболее подходящую метку и оценку уверенности от 0 до 100.
Оценка уверенности показывает, насколько модель уверена, что вы выполнили именно этот жест.
................................
.........####...................
.......##....##.................
......#........#................
......#........#................
......#.........#...............
.....#...........#..............
.....#............#.............
.....#.............#............
....#...........................
....#..............#............
....#...............#...........
....#...............#...........
...#................#...........
...#.................#..........
...#..................##........
...#.................###........
...#.................##.........
...#................##..........
...##...............#...........
....#..............##...........
....#...........####............
.....#.........#.##.............
......###...###.................
........####....................
................................
................................
................................
................................
................................
................................
................................
Found 0 (67%)