1. Введение
Что вы построите
В этом практическом занятии мы научимся использовать TensorFlow Lite для микроконтроллеров, чтобы запустить модель глубокого обучения на плате разработки SparkFun Edge . Мы будем работать со встроенной в плату моделью распознавания речи, которая использует сверточную нейронную сеть для обнаружения слов «да» и «нет», произносимых двумя микрофонами платы.

Машинное обучение на микроконтроллерах
Машинное обучение можно использовать для создания интеллектуальных инструментов, облегчающих жизнь пользователей, таких как Google Ассистент . Но часто для таких приложений требуются значительные вычислительные ресурсы, включая мощный облачный сервер или настольный компьютер. Однако теперь стало возможным запускать процессы машинного обучения на миниатюрном, маломощном оборудовании, например, на микроконтроллерах.
Микроконтроллеры чрезвычайно распространены, недороги, потребляют очень мало энергии и очень надежны. Они входят в состав самых разных бытовых устройств: бытовой техники, автомобилей и игрушек. Фактически, ежегодно производится около 30 миллиардов устройств, работающих на базе микроконтроллеров.

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

TensorFlow — это открытая платформа машинного обучения от Google, предназначенная для обучения и запуска моделей. TensorFlow Lite — это программная платформа, оптимизированная версия TensorFlow, разработанная для запуска моделей TensorFlow на небольших, относительно маломощных устройствах, таких как мобильные телефоны.
TensorFlow Lite For Microcontrollers — это программная платформа, оптимизированная версия TensorFlow, предназначенная для запуска моделей TensorFlow на миниатюрном, маломощном оборудовании, таком как микроконтроллеры. Она соответствует требованиям, предъявляемым к встроенным системам, а именно: имеет небольшой размер исполняемого файла, не требует поддержки операционной системы, каких-либо стандартных библиотек C или C++, динамического выделения памяти и т. д.
SparkFun Edge (оборудование)
SparkFun Edge — это платформа на базе микроконтроллера: крошечный компьютер на одной печатной плате. Он имеет процессор, память и аппаратное обеспечение ввода-вывода, позволяющее отправлять и принимать цифровые сигналы на другие устройства. Он оснащен четырьмя светодиодами с программным управлением, окрашенными в ваши любимые цвета Google.

В отличие от компьютера, микроконтроллер не работает под управлением операционной системы. Вместо этого, написанные вами программы выполняются непосредственно на аппаратном обеспечении. Вы пишете свой код на компьютере и загружаете его в микроконтроллер через устройство, называемое программатором.
Микроконтроллеры — это не мощные компьютеры. У них небольшие процессоры и мало памяти. Но поскольку они спроектированы максимально простыми, микроконтроллер может потреблять очень мало энергии. В зависимости от того, что делает ваша программа, SparkFun Edge может работать неделями от одной батарейки-таблетки!
Что вы узнаете
- Скомпилируйте пример программы для SparkFun Edge на своем компьютере.
- Разверните программу на своем устройстве.
- Внесите изменения в программу и разверните её снова.
Что вам понадобится
Вам потребуется следующее оборудование:
- Компьютер под управлением Linux или MacOS
- Доска SparkFun Edge
- Программатор SparkFun USB-C Serial Basic
- Кабель USB-C — USB-A (если у вас компьютер с разъемом USB-C, приобретите вместо него кабель USB-C — USB-C ).
- (опционально) Литиевая батарейка-таблетка 3 В 20 мм (CR2032) для запуска обработки данных без программатора и кабеля.
Вам потребуется следующее программное обеспечение:
- Git (проверьте, установлен ли он, запустив команду
gitв командной строке). - Python 3 (проверьте, установлен ли он, выполнив команду
python3илиpython --versionв командной строке). - Pip для Python 3 ( полезный ответ на StackOverflow )
- Установите Make версии 4.2.1 или выше (проверьте, установлена ли она, выполнив команду
make --versionв командной строке). - Драйверы SparkFun Serial Basic
2. Настройте оборудование.
Микроконтроллер SparkFun Edge поставляется с предустановленным исполняемым файлом, который может запускать модель распознавания речи. Прежде чем заменить его собственной версией, давайте сначала запустим эту модель.
Питание платы осуществляется следующим образом:
- Вставьте батарейку-таблетку в разъем для батарейки на задней панели платы (положительной стороной батарейки вверх. Если батарейка уже была вставлена, вытяните пластиковый язычок и вставьте батарейку, чтобы убедиться, что она полностью вставлена).

- Если у вас нет батарейки-таблетки, вы можете использовать программатор SparkFun USB-C Serial Basic для питания платы. Чтобы подключить это устройство к плате, выполните следующие действия:
- Найдите шестиконтактный разъем на боковой стороне устройства SparkFun Edge.
- Подключите SparkFun USB-C Serial Basic к этим контактам, убедившись, что контакты с маркировкой "BLK" и "GRN" на каждом устройстве правильно выровнены.
- Подключите кабель USB-C между устройством SparkFun USB-C Serial Basic и компьютером.

После включения платы путем установки батареи или подключения USB-программатора, плата активируется и начнет прослушивание с помощью микрофонов. Синий индикатор должен начать мигать.
Модель машинного обучения на плате обучена распознавать слова «да» и «нет», а также определять наличие и отсутствие речи. Результаты отображаются с помощью цветных светодиодов. В следующей таблице показано значение каждого цвета светодиода:
Результат обнаружения | цвет светодиода |
"Да" | Желтый |
"Нет" | Красный |
Неизвестная речь | Зеленый |
Речь не обнаружена | Светодиоды не горят |
Попробуйте
Поднесите доску ко рту и несколько раз скажите «да». Вы увидите, как мигает желтый светодиод. Если после слова «да» ничего не происходит, попробуйте следующее:
- Держите доску примерно в 25 см от рта.
- Избегайте чрезмерного фонового шума.
- Повторите «да» несколько раз подряд (попробуйте сказать «да да да»).
3. Настройте программное обеспечение.
Теперь мы сами загрузим, установим и запустим модель распознавания речи на микроконтроллере. Для этого сначала загрузим исходный код этой программы и необходимые зависимости для её сборки. Программа написана на C++, и перед загрузкой на плату её необходимо скомпилировать в бинарный файл . Бинарный файл — это файл, содержащий программу в формате, позволяющем запускать её непосредственно на аппаратном обеспечении SparkFun Edge.
Приведенные ниже инструкции предназначены для Linux или MacOS.
Загрузите репозиторий TensorFlow.
Код доступен в репозитории TensorFlow на GitHub по следующей ссылке:
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro
Откройте терминал на своем компьютере, перейдите в каталог, где вы обычно храните проекты по программированию, загрузите репозиторий TensorFlow и перейдите в созданный каталог, как показано ниже:
cd ~ # change into your home (or any other) directory git clone --depth 1 https://github.com/tensorflow/tensorflow.git cd tensorflow
Загрузите зависимости Python.
Для подготовки бинарного файла и его прошивки на устройство мы будем использовать Python 3. Для работы скриптов Python необходимы определенные библиотеки. Для установки этих зависимостей выполните следующую команду:
pip3 install pycrypto pyserial --user
4. Соберите и подготовьте бинарный файл.
Мы собираемся собрать бинарный файл и выполнить команды, которые подготовят его к загрузке на устройство.
Соберите бинарный файл
Чтобы загрузить все необходимые зависимости и создать исполняемый файл, выполните следующую команду:
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge micro_speech_bin
Если сборка прошла успешно, последняя строка выходных данных должна выглядеть следующим образом:
arm-none-eabi-objcopy tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin -O binary
Чтобы убедиться в успешном создании исполняемого файла, выполните следующую команду:
test -f \ tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin && \ echo "Binary was successfully created" || echo "Binary is missing"
В консоли должно отобразиться сообщение Binary was successfully created "! Если же вы видите Binary is missing , значит, возникла проблема в процессе сборки, требующая отладки.
Подготовьте двоичный файл
Для развертывания на устройстве исполняемый файл необходимо подписать криптографическими ключами. Сейчас мы выполним несколько команд, которые подпишут наш исполняемый файл, чтобы его можно было загрузить на SparkFun Edge.
Введите следующую команду, чтобы настроить несколько фиктивных криптографических ключей, которые мы сможем использовать для разработки:
cp tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info0.py tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info.py
Теперь выполните следующую команду для создания подписанного исполняемого файла:
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_image_blob.py \ --bin tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin \ --load-address 0xC000 \ --magic-num 0xCB \ -o main_nonsecure_ota \ --version 0x0
В результате будет создан файл main_nonsecure_ota.bin . Теперь выполним ещё одну команду, чтобы создать окончательную версию файла, которую можно использовать для прошивки устройства скриптом загрузчика, который мы будем использовать на следующем шаге:
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_wireupdate_blob.py \ --load-address 0x20000 \ --bin main_nonsecure_ota.bin \ -i 6 \ -o main_nonsecure_wire \ --options 0x1
Теперь в каталоге, где вы выполняли команды, должен быть файл с именем main_nonsecure_wire.bin . Именно этот файл мы будем прошивать в устройство.
5. Подготовьтесь к прошивке бинарного файла.
Что такое мигание?
Плата SparkFun Edge хранит запущенную в данный момент программу в своей флэш-памяти объемом 512 килобайт. Если мы хотим запустить новую программу, нам нужно отправить ее на плату, которая сохранит ее во флэш-памяти, перезаписав любую ранее сохраненную программу.
Этот процесс называется «прошивкой», и мы будем использовать его для отправки нашей программы на плату.
Подключите программатор к плате.
Для загрузки новых программ на плату мы будем использовать программатор последовательного порта SparkFun USB-C Serial Basic. Это устройство позволяет вашему компьютеру обмениваться данными с микроконтроллером через USB.
Для подключения этого устройства к вашей доске выполните следующие действия:
- Найдите шестиконтактный разъем на боковой стороне устройства SparkFun Edge.
- Подключите SparkFun USB-C Serial Basic к этим контактам, убедившись, что контакты с маркировкой "BLK" и "GRN" на каждом устройстве правильно выровнены.

Подключите программатор к компьютеру.
Мы подключим плату к вашему компьютеру через USB. Для программирования платы нам потребуется знать имя, которое ваш компьютер присвоил устройству. Лучший способ сделать это — составить список всех устройств компьютера до и после подключения платы и посмотреть, какое устройство является новым.
Перед подключением устройства через USB выполните следующую команду:
If you are using Linux: ls /dev/tty* If you are using MacOS: ls /dev/cu*
В результате должен появиться список подключенных устройств, который будет выглядеть примерно так:
/dev/cu.Bluetooth-Incoming-Port /dev/cu.MALS /dev/cu.SOC
Теперь подключите программатор к USB-порту компьютера. Снова введите следующую команду:
If you are using Linux: ls /dev/tty* If you are using MacOS: ls /dev/cu*
В выходных данных должен появиться дополнительный элемент, как в примере ниже. Ваш новый элемент может иметь другое имя. Этот новый элемент — это имя устройства.
/dev/cu.Bluetooth-Incoming-Port /dev/cu.MALS /dev/cu.SOC /dev/cu.wchusbserial-1450
Сначала создадим переменную среды для идентификации имени устройства:
export DEVICENAME=put your device name here
Далее мы создадим переменную среды для указания скорости передачи данных (бод-скорости), то есть скорости, с которой данные будут отправляться на устройство:
export BAUD_RATE=921600
6. Прошейте бинарный файл.
Запустите скрипт для прошивки вашей платы.
Для прошивки платы необходимо перевести её в специальное состояние «загрузчика», которое подготовит её к приёму нового бинарного файла. Затем мы запустим скрипт для отправки этого бинарного файла на плату.
Давайте ознакомимся со следующими кнопками на клавиатуре:

Для сброса и прошивки платы выполните следующие действия:
- Убедитесь, что ваша плата подключена к программатору, а вся система подключена к компьютеру через USB.
- Начните удерживать кнопку с номером
14на доске. Продолжайте удерживать ее до шага 6. - Чтобы вернуть плату в состояние загрузчика, продолжая удерживать кнопку с номером
14, нажмите кнопку с номеромRST. - Продолжая удерживать кнопку с номером
14, вставьте следующую команду в терминал и нажмите Enter, чтобы запустить её (для удобства вы можете вставить эту команду в терминал до того, как начнёте удерживать кнопку, но не нажимайте Enter, пока не дойдёте до этого шага).
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/uart_wired_update.py -b ${BAUD_RATE} ${DEVICENAME} -r 1 -f main_nonsecure_wire.bin -i 6
- Продолжая удерживать кнопку с цифрой
14, вы должны увидеть на экране примерно следующее:
Connecting with Corvette over serial port /dev/cu.usbserial-1440... Sending Hello. Received response for Hello Received Status length = 0x58 version = 0x3 Max Storage = 0x4ffa0 Status = 0x2 State = 0x7 AMInfo = 0x1 0xff2da3ff 0x55fff 0x1 0x49f40003 0xffffffff [...lots more 0xffffffff...] Sending OTA Descriptor = 0xfe000 Sending Update Command. number of updates needed = 1 Sending block of size 0x158b0 from 0x0 to 0x158b0 Sending Data Packet of length 8180 Sending Data Packet of length 8180 [...lots more Sending Data Packet of length 8180...]
- После появления
Sending Data Packet of length 8180(но ничего страшного, если вы продолжите удерживать кнопку с номером14на плате) прекратите удерживать её. Программа продолжит выводить строки в терминал. В итоге это будет выглядеть примерно так:
[...lots more Sending Data Packet of length 8180...] Sending Data Packet of length 8180 Sending Data Packet of length 6440 Sending Reset Command. Done.
Если вы видите Done , это означает, что прошивка прошла успешно . Если вывод программы завершается ошибкой, проверьте, было ли напечатано сообщение Sending Reset Command . Если да, то прошивка, вероятно, прошла успешно, несмотря на ошибку.
На машинах под управлением Linux может возникнуть NoResponse Error . Это связано с тем, что драйвер последовательного порта ch34x был установлен параллельно с уже существующим драйвером последовательного порта. Решение этой проблемы можно найти следующим образом:
Шаг 1 : Переустановите правильную версию библиотеки ch34x. Убедитесь, что устройство отключено от компьютера во время установки.
git clone https://github.com/juliagoda/CH341SER.git cd CH341SER/ make sudo insmod ch34x.ko sudo rmmod ch341
Шаг 2 : Подключите USB-кабель платы и запустите:
dmesg | grep "ch34x"
Вы должны увидеть сообщение примерно такого вида:
[ 1299.444724] ch34x_attach+0x1af/0x280 [ch34x] [ 1299.445386] usb 2-13.1: ch34x converter now attached to ttyUSB0
Если используемый драйвер не "ch34x" (например, ch341), попробуйте отключить другой драйвер, выполнив команду:
rmmod <non-ch34x driver name>
Отключите и снова подключите устройство и убедитесь, что используется драйвер "ch34x".
7. Демонстрация
Попробуйте программу
После успешной прошивки платы нажмите кнопку с соответствующей надписью.
RST , чтобы перезагрузить плату и запустить программу. Если синий светодиод начнет мигать, прошивка прошла успешно. В противном случае, прокрутите вниз до раздела « Что делать, если не получилось?» .

Модель машинного обучения на плате обучена распознавать слова «да» и «нет», а также определять наличие и отсутствие речи. Результаты отображаются с помощью цветных светодиодов. В следующей таблице показано значение каждого цвета светодиода:
Результат обнаружения | цвет светодиода |
"Да" | Желтый |
"Нет" | Красный |
Неизвестная речь | Зеленый |
Речь не обнаружена | Светодиоды не горят |
Попробуйте
Поднесите доску ко рту и несколько раз скажите «да». Вы увидите, как мигает желтый светодиод. Если после слова «да» ничего не происходит, попробуйте следующее:
- Держите доску примерно в 25 см от рта.
- Избегайте чрезмерного фонового шума.
- Повторите «да» несколько раз подряд (попробуйте сказать «да да да»).
А что, если это не сработает?
Вот некоторые возможные проблемы и способы их устранения:
Проблема: После мигания ни один из светодиодов не загорается.
Решение: Попробуйте нажать кнопку RST или отключить и снова подключить плату к программатору. Если ничего из этого не поможет, попробуйте перепрошить плату еще раз.
Проблема: Синий светодиод загорается, но очень тускло.
Решение: Замените батарею, так как она разряжается. В качестве альтернативы, плату можно запитать от компьютера, используя программатор и кабель.
8. Прочтите отладочный вывод (необязательно)
Если у вас возникли проблемы и вам необходимо детально отладить код, ознакомьтесь с этим разделом . Чтобы понять, что происходит в микроконтроллере во время выполнения вашего кода, вы можете выводить отладочную информацию через последовательное соединение платы. Вы используете свой компьютер для подключения к плате и отображения данных, которые плата отправляет.
Откройте последовательное соединение
По умолчанию наш пример кода SparkFun Edge записывает в лог все произнесенные команды, а также уровень их уверенности. Чтобы увидеть вывод платы, выполните следующую команду:
screen ${DEVICENAME} 115200
Первоначально вы можете увидеть вывод, похожий на следующий: (Это появляется только после перезагрузки платы после подключения; в противном случае вы можете начать видеть отладочную информацию).
Apollo3 Burst Mode is Available
Apollo3 operating in Burst Mode (96MHz)
Попробуйте ввести несколько команд, набрав «да» или «нет». После этого плата должна вывести отладочную информацию для каждой команды:
Heard yes (202) @65536ms
В приведенном выше логе yes означает команду. Число 202 указывает на уровень уверенности в том, что команда была услышана (200 — минимальное значение). Наконец, 65536ms обозначает время, прошедшее с момента последнего сброса микроконтроллера.
Чтобы остановить отображение отладочной информации, нажмите Ctrl+A , сразу же нажмите клавишу K , а затем клавишу Y
Записать отладочные логи
Вы можете увидеть код, который записывает эту информацию в файл command_responder.cc, с которым вы только что работали:
tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc
Для записи данных в лог можно вызвать метод error_reporter->Report() . Он поддерживает стандартные токены printf для интерполяции строк, которые можно использовать для включения важной информации в ваши логи:
error_reporter->Report("Heard %s (%d) @%dms", found_command, score, current_time);
Этот метод пригодится вам при внесении собственных изменений в код в следующем разделе.
9. Расширьте код (необязательно)
Теперь, когда вы знаете, как собрать и прошить свой SparkFun Edge, вы можете начать экспериментировать с кодом и развернуть его на своем устройстве, чтобы увидеть результаты.
Прочитайте код
Хорошим местом для начала изучения кода является следующий файл: command_responder.cc.
tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc
Вы можете посмотреть файл на GitHub здесь .
Метод RespondToCommand в этом файле вызывается при обнаружении голосовой команды. Существующий код включает разные светодиоды в зависимости от того, была ли услышана команда «да», «нет» или неизвестная команда. Следующий фрагмент кода демонстрирует, как это работает:
if (found_command[0] == 'y') {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_YELLOW);
}
if (found_command[0] == 'n') {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_RED);
}
if (found_command[0] == 'u') {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_GREEN);
}
Аргумент found_command содержит имя обнаруженной команды. Проверяя первый символ, этот набор операторов if определяет, какой светодиод следует зажечь.
Метод RespondToCommand вызывается с несколькими аргументами:
void RespondToCommand(tflite::ErrorReporter* error_reporter,
int32_t current_time, const char* found_command,
uint8_t score, bool is_new_command) {
error_reporterиспользуется для записи отладочной информации (подробнее об этом позже).-
current_timeобозначает время обнаружения команды. -
found_commandуказывает, какая команда была обнаружена. -
scoreотражает степень нашей уверенности в том, что мы обнаружили команду. -
is_new_commandпозволяет узнать, слышите ли вы эту команду впервые.
score представляет собой целое число от 0 до 255, обозначающее вероятность обнаружения команды. В примере кода команда считается допустимой только в том случае, если оценка превышает 200. По результатам наших тестов, большинство допустимых команд находятся в диапазоне 200-210.
Измените код
Плата SparkFun Edge имеет четыре светодиода. В данный момент мигает синий светодиод, указывая на то, что происходит распознавание. Это можно увидеть в файле command_responder.cc :
static int count = 0;
// Toggle the blue LED every time an inference is performed.
++count;
if (count & 1) {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_BLUE);
} else {
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
}
Поскольку у нас есть блок из четырех светодиодов, давайте изменим программу, чтобы использовать их в качестве визуального индикатора score заданной команды. Низкий балл приведет к загоранию одного светодиода, а высокий — к загоранию нескольких.
Чтобы убедиться, что программа запущена, мы заставим красный светодиод мигать постоянно, а не синий. Соседние синий, зеленый и желтый светодиоды будут использоваться для отображения результата нашего последнего score . Для простоты мы будем зажигать эти светодиоды только в том случае, если будет произнесено слово «да». Если будет обнаружено другое слово, светодиоды погаснут.
Чтобы внести это изменение, замените весь код в файле command_responder.cc следующим фрагментом:
#include "tensorflow/lite/micro/examples/micro_speech/command_responder.h"
#include "am_bsp.h"
// This implementation will light up the LEDs on the board in response to different commands.
void RespondToCommand(tflite::ErrorReporter* error_reporter,
int32_t current_time, const char* found_command,
uint8_t score, bool is_new_command) {
static bool is_initialized = false;
if (!is_initialized) {
// Setup LEDs as outputs
am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_RED, g_AM_HAL_GPIO_OUTPUT_12);
am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_BLUE, g_AM_HAL_GPIO_OUTPUT_12);
am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_GREEN, g_AM_HAL_GPIO_OUTPUT_12);
am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_YELLOW, g_AM_HAL_GPIO_OUTPUT_12);
// Ensure all pins are cleared
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_RED);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_GREEN);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_YELLOW);
is_initialized = true;
}
static int count = 0;
// Toggle the red LED every time an inference is performed.
++count;
if (count & 1) {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_RED);
} else {
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_RED);
}
if (is_new_command) {
// Clear the last three LEDs
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_GREEN);
am_hal_gpio_output_clear(AM_BSP_GPIO_LED_YELLOW);
error_reporter->Report("Heard %s (%d) @%dms", found_command, score,
current_time);
// Only indicate a 'yes'
if (found_command[0] == 'y') {
// Always light the blue LED
am_hal_gpio_output_set(AM_BSP_GPIO_LED_BLUE);
// Light the other LEDs depending on score
if (score >= 205) {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_GREEN);
}
if(score >= 210) {
am_hal_gpio_output_set(AM_BSP_GPIO_LED_YELLOW);
}
}
}
}
Если обнаружена новая команда, is_new_command будет равно true. Мы очистим синий, зеленый и желтый светодиоды, а затем снова включим их в зависимости от значений found_command и score .
Пересоберите и прошейте
После внесения изменений в код протестируйте его, выполнив все шаги из раздела «Сборка» и «Подготовка бинарного файла».
10. Дальнейшие шаги
Поздравляем, вы успешно создали свой первый детектор речи на микроконтроллере!
Надеемся, вам понравилось это краткое введение в разработку с использованием TensorFlow Lite для микроконтроллеров. Идея глубокого обучения на микроконтроллерах нова и интересна, и мы призываем вас экспериментировать!
Справочная документация
- Теперь, когда у вас есть опыт работы с базовой программой, обучите свою собственную модель понимать различные команды. Примечание: обучение займет несколько часов!
- Узнайте больше о TensorFlow Lite для микроконтроллеров ( веб-сайт , GitHub ).
- Попробуйте другие примеры и запустите их на SparkFun Edge, если он поддерживается.
- Обратитесь к книге издательства O'Reilly «TinyML: Machine Learning with TensorFlow on Arduino and Ultra-Low Power Micro-Controllers» , которая знакомит с машинным обучением на миниатюрных устройствах и описывает несколько интересных проектов. Данная практическая работа основана на главах 7 и 8 этой книги.

Спасибо, и приятного строительства!