Распознавание речи AI с помощью TensorFlow Lite для микроконтроллеров и SparkFun Edge

1. Введение

Что ты построишь

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

bf256d403a1821af.gif

Машинное обучение на микроконтроллерах

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

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

1360b61fbfa33657.jpeg

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

TensorFlow Lite для микроконтроллеров (программное обеспечение)

358ffdb9eb758b90.png

TensorFlow — это платформа машинного обучения Google с открытым исходным кодом для обучения и запуска моделей. TensorFlow Lite — это программная платформа, оптимизированная версия TensorFlow, предназначенная для запуска моделей TensorFlow на небольших, относительно маломощных устройствах, таких как мобильные телефоны.

TensorFlow Lite для микроконтроллеров — это программная платформа, оптимизированная версия TensorFlow, предназначенная для запуска моделей тензорного потока на крошечном маломощном оборудовании, таком как микроконтроллеры. Он соответствует ограничениям, необходимым для этих встроенных сред, т. е. имеет небольшой двоичный размер, не требует поддержки операционной системы, каких-либо стандартных библиотек C или C++, динамического выделения памяти и т. д.

SparkFun Edge (Аппаратное обеспечение)

SparkFun Edge — это платформа на базе микроконтроллера: крошечный компьютер на одной плате. Он имеет процессор, память и аппаратное обеспечение ввода-вывода, которое позволяет ему отправлять и получать цифровые сигналы на другие устройства. Он оснащен четырьмя управляемыми программным обеспечением светодиодами ваших любимых цветов Google.

аа4493835a2338c6.png

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

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

Что вы узнаете

  • Скомпилируйте пример программы для SparkFun Edge на своем компьютере.
  • Разверните программу на свое устройство
  • Внесите изменения в программу и разверните ее снова

Что вам понадобится

Вам понадобится следующее оборудование:

Вам понадобится следующее программное обеспечение:

  • Git (проверьте, установлен ли он, запустив git в командной строке)
  • Python 3 (проверьте, установлен ли он, запустив python3 или python --version в командной строке)
  • Pip для Python 3 ( полезный ответ StackOverflow )
  • Сделайте 4.2.1 или выше (проверьте, установлена ​​ли она, запустив make --version в командной строке)
  • Драйверы SparkFun Serial Basic

2. Настройте свое оборудование

Микроконтроллер SparkFun Edge поставляется с предустановленным двоичным файлом, который может запускать речевую модель. Прежде чем перезаписать это нашей собственной версией, давайте сначала запустим эту модель.

Включите свою доску:

  1. Вставка батарейки типа «таблетка» в разъем для батареи на задней стороне платы (стороной «+» батареи вверх. Если ваша плата поставляется с уже вставленной батареей, вытащите пластиковый язычок и нажмите на батарею, чтобы убедиться, что она он полностью вставлен)

25a6cc6b208e8a4e.png

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

b140822f0019f92a.png

После того, как вы включили плату, вставив батарею или подключив USB-программатор, плата выйдет из режима сна и начнет слушать через свои микрофоны. Синий свет должен начать мигать.

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

Результат обнаружения

Цвет светодиода

"Да"

Желтый

"Нет"

Красный

Неизвестная речь

Зеленый

Речь не обнаружена

Ни один светодиод не горит

Попробуйте

Поднесите доску ко рту и несколько раз скажите «да». Вы увидите вспышку желтого светодиода. Если ничего не происходит, когда вы говорите «да», вот что можно попробовать:

  • Держите доску на расстоянии около 10 дюймов ото рта.
  • Избегайте чрезмерного фонового шума
  • Повторите «да» несколько раз подряд (попробуйте сказать «да, да, да»).

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.

Чтобы подключить это устройство к плате, выполните следующие действия:

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

b140822f0019f92a.png

Подключите программатор к компьютеру

Мы будем подключать плату к вашему компьютеру через 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. Прошить бинарный файл

Запустите скрипт для прошивки вашей платы

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

Давайте познакомимся со следующими кнопками на плате:

64c620570b9d2f83.png

Выполните следующие шаги для сброса и прошивки платы:

  1. Убедитесь, что ваша плата подключена к программатору, а вся установка подключена к вашему компьютеру через USB.
  2. Начните удерживать кнопку, отмеченную цифрой 14 на доске. Продолжайте удерживать его до шага 6.
  3. Продолжая удерживать кнопку с пометкой 14 , чтобы вернуть плату в состояние загрузчика, нажмите кнопку с пометкой RST , чтобы перезагрузить плату.
  4. Все еще удерживая кнопку с пометкой 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
  1. Продолжая удерживать кнопку с цифрой 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...]
  1. Перестаньте удерживать кнопку с цифрой 14 на доске после того, как увидите Sending Data Packet of length 8180 (но ничего страшного, если вы продолжите ее удерживать). Программа продолжит печатать строки на терминале. В конечном итоге это будет выглядеть примерно так:
[...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 , чтобы перезагрузить плату и запустить программу. Если синий светодиод начнет мигать, мигание прошло успешно. Если нет, прокрутите вниз до пункта « Что, если не сработает?» раздел ниже.

bf256d403a1821af.gif

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

Результат обнаружения

Цвет светодиода

"Да"

Желтый

"Нет"

Красный

Неизвестная речь

Зеленый

Речь не обнаружена

Ни один светодиод не горит

Попробуйте

Поднесите доску ко рту и несколько раз скажите «да». Вы увидите вспышку желтого светодиода. Если ничего не происходит, когда вы говорите «да», вот что можно попробовать:

  • Держите доску на расстоянии около 10 дюймов ото рта.
  • Избегайте чрезмерного фонового шума
  • Повторите «да» несколько раз подряд (попробуйте сказать «да, да, да»).

Что, если это не сработало?

Вот некоторые возможные проблемы и способы их устранения:

Проблема: после мигания ни один из светодиодов не загорается.

Решение: попробуйте нажать кнопку 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, если он поддерживается.
  • Обратитесь к книге О'Рейли TinyML: Machine Learning with TensorFlow on Arduino и Ultra-Low Power Micro-Controllers , в которой рассказывается о машинном обучении на крошечных устройствах и рассказывается о нескольких интересных проектах. Эта кодовая лаборатория основана на главах 7 и 8 книги.

26699b18f2b199f.png

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