*https://www.youtube.com/watch?v=IH22K1WFqjU
**https://300.ya.ru/v_xiHNMJ72
таймкоды
00:00:00 Введение
- Объяснение цели видео: обучение микроконтроллера USB32 распознаванию голосовых команд с помощью нейронных сетей.
- Упоминание о доступности кода проекта на GitHub.
00:00:25 Демонстрация
- Демонстрация работы микроконтроллера с четырьмя командами: «ноль», «один», «два», «три».
- Использование голосовых команд для управления светодиодами.
00:01:40 Источники вдохновения
- Рекомендация проекта пользователя «Атомик14» на YouTube.
00:02:09 Сбор датасета
- Использование скетча 01_iNEP441_collegedataset из репозитория на GitHub.
- Подключение микрофона MP441 по схеме.
00:03:21 Настройка скетча
- Загрузка скетча на микроконтроллер и настройка данных домашней Wi-Fi сети.
- Получение IP-адреса микроконтроллера и доступ к веб-интерфейсу.
00:04:32 Запись команд
- Запись команд через веб-интерфейс и построение спектрограмм.
- Пример записи команды «один» и её спектрограммы.
00:08:44 Подготовка датасета на GitHub
- Загрузка аудиофайлов в папку «датасет» на GitHub.
- Подготовка данных для обучения нейросети.
00:10:21 Преобразование аудио в спектрограммы
- Преобразование аудиофайлов в спектрограммы с помощью преобразования Фурье.
- Объяснение процесса преобразования и его важности для обучения нейросети.
00:17:37 Аугментация данных
- Метод аугментации для увеличения обучающей выборки.
- Примеры аугментации: сдвиг по времени, добавление белого шума, рандомное усиление, тайм-маскирование.
00:21:00 Обучение нейросети
- Разбивка датасета на тренировочную и тестовую выборки.
- Запуск процесса обучения сверточной нейронной сети.
- Оценка точности предсказаний модели.
00:21:55 Анализ результатов
- Визуализация процесса обучения по эпохам.
- Анализ confusion matrix для тестовой выборки.
- Рекомендации по улучшению датасета на основе анализа ошибок.
00:23:52 Конвертация модели
- Конвертация модели в облегчённый формат для загрузки в USB32.
- Появление облегчённой модели в папке «python_iNEP441».
00:24:14 Подготовка модели для микроконтроллера
- Модель будет загружена в микроконтроллер через USB 3.2.
- Модель определяет команды, захваченные микрофоном.
- После квантования модель стала легче и точнее.
00:25:15 Точность модели после квантования
- После квантования точность модели составила 97,5%.
- Модель стала достаточно лёгкой для передачи на микроконтроллер.
00:25:32 Копирование структуры модели
- Структура модели и её веса должны быть скопированы в файл tensorflow_lite_module.a.
- Содержимое файла tensorflow_lite_module.a нужно заменить на содержимое файла module.ccc после обучения модели.
00:26:26 Завершение работы
- После замены содержимого файлов можно загрузить скетч 02mp441tfl_cnn на микроконтроллер.
- Ожидается демонстрация работы модели, как в начале ролика.
- Благодарность за внимание и прощание.
Расшифровка видео
Поиск в расшифровке
0:00
0 секунд
Здравствуйте. В этом видео разберёмся, как обучить микроконтроллер ESP32
0:08
8 секунд
различать разные голосовые команды при помощи нейронных сетей.
0:14
14 секунд
Ээ весь код данного проекта вы сможете найти у меня на гитхабе, вот по этой ссылочке.
0:25
25 секунд
Ну, а сейчас давайте перейдём к демонстрации.
0:30
30 секунд
Объясню, что я обучил USP 32 определять четыре команды, четыре цифры
0:39
39 секунд
0 1 2 3. И
0:46
46 секунд
с помощью этих голосовых команд я буду поджигать светодиоды.
0:56
56 секунд
2 0 3 1
1:04
1 минута 4 секунды
3 0 2 3
1:11
1 минута 11 секунд
1 0 3 1
1:19
1 минута 19 секунд
1 0 2
1:27
1 минута 27 секунд
0 3 2 1
1:35
1 минута 35 секунд
ноль Как же это у меня получилось.
1:40
1 минута 40 секунд
Но для начала многое я позаимствовал из проекта
1:47
1 минута 47 секунд
пользователя на Ютубе Atomic 14 Build your own voice controlled robot with
1:54
1 минута 54 секунды
ESP2 and sensor flow light. Да, ну рекомендую, если захотите
2:02
2 минуты 2 секунды
разобраться в этой теме, чуть-чуть глубже, посмотреть на разные реализации с разных сторон. Так. Ну а нам же для начала потребуется собрать датасет.
2:14
2 минуты 14 секунд
Для этого у меня в репозитории на гитхабе есть скетч 01P 441 collect dataset.
2:27
2 минуты 27 секунд
Ээ данный скетч необходимо загрузить
2:34
2 минуты 34 секунды
на микроконтроллер USP32.
2:40
2 минуты 40 секунд
К тому же забыл упомянуть, что захват звука происходит за счёт микрофона
2:51
2 минуты 51 секунда
441, который я приобрёл на AliExpress.
2:56
2 минуты 56 секунд
Подключить данный микрофон можно по вот этой вот схеме. Получается 3,3 ВН.
3:04
3 минуты 4 секунды
ГНД, ээ, шестнадцатый пин на VS,
3:12
3 минуты 12 секунд
восьмой пин на SD и девятый пин на СК.
3:21
3 минуты 21 секунда
Так, ну ладно, вернёмся к скетчу.
3:24
3 минуты 24 секунды
Значит, необходимо скачать вот этот ноль первый скетч.
3:31
3 минуты 31 секунда
Тут прописать м данные своей домашней Wi-Fi сети.
3:42
3 минуты 42 секунды
И далее, далее загрузить его на микроконтроллер.
3:56
3 минуты 56 секунд
После того, как вы загрузите данный скетч у себя на микроконтроллер,
4:04
4 минуты 4 секунды
ээ данному ESP32, вашей домашней локальной Wi-Fi сети будет присвоен IP-адрес.
4:18
4 минуты 18 секунд
И перейдя по этому IP-адресу, вы попадёте на веб-интерфейс.
4:27
4 минуты 27 секунд
который крутится на вашем ESP.
4:33
4 минуты 33 секунды
При помощи данного интерфейса вы сможете подготовить ряд команд,
4:40
4 минуты 40 секунд
на которых будете обучать нейронную сеть для распознавания этих команд,
4:48
4 минуты 48 секунд
чтобы в дальнейшем уже обученную нейросеть залить на ESP32.
4:55
4 минуты 55 секунд
Смотрите, как это, значит, работает.
4:58
4 минуты 58 секунд
Я кликну по кнопочке dataset и сразу произнесу команду, после чего она
5:06
5 минут 6 секунд
скачается, ну, как обычный файл из интернета.
5:11
5 минут 11 секунд
А также тут будет выведена спектрограмма, ээ, да, ну, конкретно вот данной
5:19
5 минут 19 секунд
команды, которую я произнесу для данного аудиофрагмента.
5:25
5 минут 25 секунд
Что такое спектрограмма, разберёмся чуть позже. А сейчас же давайте попробуем записать первую команду.
5:36
5 минут 36 секунд
Один.
5:38
5 минут 38 секунд
Так. И вот, видите, скачалась. Давайте её послушаем. Один.
5:46
5 минут 46 секунд
Один.
5:48
5 минут 48 секунд
Так. И смотрите, конкретно единицы вот соответствует вот
5:55
5 минут 55 секунд
такая спектрограмма. Попробуйте запомнить данную картинку. Я сейчас произнесу
6:04
6 минут 4 секунды
команду один ещё раз. И уже для нового аудио будет построена спектрограмма один.
6:14
6 минут 14 секунд
Видите, она немного другая, но в целом в целом что-то общее есть. Смотрите, сейчас я,
6:23
6 минут 23 секунды
допустим, назову другую команду, и увидите, что они будут различаться.
6:37
6 минут 37 секунд
Три.
6:41
6 минут 41 секунда
Ну, как бы сложно уловить. Давайте я, допустим, вообще что-нибудь звук какой-нибудь, допустим, у
6:51
6 минут 51 секунда
вот видите, что вот для разных звуков, ну, команд, как бы для для разных аудиофрагментов строятся разные спектрограммы.
6:59
6 минут 59 секунд
И вот как раз-таки на основе данных спектрограмм в дальнейшем нейросеть и будет различать разные аудиокоманды.
7:13
7 минут 13 секунд
В общем, для каждой команды я записал по 50
7:23
7 минут 23 секунды
аудиопримеров, то есть для нуля, для единицы, для двойки, для тройки по 50 экземпляров.
7:30
7 минут 30 секунд
Но на на что хочу обратить внимание, что это достаточно малое. Вообще, как бы, чем больше данных, тем лучше.
7:43
7 минут 43 секунды
И также, ну, не надо однотонно повторять как бы
7:51
7 минут 51 секунда
команду один о 1 один. Как бы в идеале вообще, чтобы разные люди записывали.
7:59
7 минут 59 секунд
Ну а если некого попросить, то хотя бы использовать разные интонации, допустим,
8:06
8 минут 6 секунд
один, один один. Ну и вот как-то так с разными интонациями.
8:12
8 минут 12 секунд
подальше, поближе, чтоб как бы вот эти аудиофрагменты
8:19
8 минут 19 секунд
между собой хоть немного отличались и при обучении нейросеть смогла
8:26
8 минут 26 секунд
уловить какие-то паттерны, шаблоны, м, а не ну как бы общие,
8:35
8 минут 35 секунд
ну, как бы больше абстракции смогла увидеть, как бы что-то более общее.
8:43
8 минут 43 секунды
Ну, как так? Надеюсь, поняли. Так, ну и далее вернёмся на GitHub.
8:51
8 минут 51 секунда
Тут, значит, репозиторий.
8:57
8 минут 57 секунд
И в этом репозитории переходим в папочку Python INP 441.
9:06
9 минут 6 секунд
Внутри папочка dataset.
9:10
9 минут 10 секунд
внутри папочки dataset четыре папочки 0 two 3 и сюда как раз-таки и надо
9:19
9 минут 19 секунд
складывать аудио, которые записали при помощи данного веб-интерфейса.
9:26
9 минут 26 секунд
Как я уже сказал, я для каждой команды записывал примерно по 50 образцов.
9:34
9 минут 34 секунды
Ну, как бы на GHUB загрузил только по пять, так как это довольно-таки муторное занятие загружать файлы на GitHub.
9:45
9 минут 45 секунд
Так. И далее, как бы, когда уже всё, папочку datasсеet подготовили, для
9:51
9 минут 51 секунда
каждой команды по 50 образцов аудио загрузили, можно будет перейти к Юпитер ноутбуку.
10:04
10 минут 4 секунды
открываем его.
10:08
10 минут 8 секунд
И тут уже при помощи Пайтона будем
10:16
10 минут 16 секунд
обучать, создавать, обучать нейросеть.
10:21
10 минут 21 секунда
Так, ну и давайте быстренько пробежимся по тетради.
10:26
10 минут 26 секунд
Первым делом необходимо будет подгрузить все файлы, которые были помещены в папочку dataset для каждой из команд.
10:36
10 минут 36 секунд
Для этого выполняется данный блок кода, после чего
10:45
10 минут 45 секунд
необходимо каждый аудиофайл преобразовать в спектрограмму.
10:57
10 минут 57 секунд
На самом деле это не просто,
11:04
11 минут 4 секунды
ээ, чтобы понять этот процесс,
11:11
11 минут 11 секунд
следует изучить такую тему, как преобразование фурье.
11:19
11 минут 19 секунд
Как то я тут сильно в подробности вдаваться не буду. Потому что это достаточно
11:26
11 минут 26 секунд
сложная тема. Там за всем этим стоит сложная математика достаточно.
11:32
11 минут 32 секунды
И потребую, если вы не знакомы ещё с преобразованием фурье, то познакомьтесь.
11:39
11 минут 39 секунд
Ну а во-вторых, как бы на это придётся потратить немало времени.
11:45
11 минут 45 секунд
Но если вкратце, то у нас есть аудиосигнал,
11:53
11 минут 53 секунды
который мы записали, наш аудиофайл, наш голос, наша команда, там 0 1 2 3. Мы
12:01
12 минут 1 секунда
разбиваем данный аудиосигнал на равные промежутки времени
12:09
12 минут 9 секунд
и проходим окном по этому аудиосигналу.
12:15
12 минут 15 секунд
который захватывает два временных промежутка и прохо, ну, и это окно проходит по
12:24
12 минут 24 секунды
всему аудиосигналу шагом как бы в один временной промежуток. Значит, сначала захватим
12:32
12 минут 32 секунды
этот участок, потом вот этот вот, дальше вот этот и так далее.
12:42
12 минут 42 секунды
Каждый участок, который мы захватили этим окном,
12:48
12 минут 48 секунд
мы преобразуем при помощи алгоритма быстрого преобразования фурье в амплитудную частотную характеристику.
13:01
13 минут 1 секунда
Смотрите, любой сложный сигнал временной
13:09
13 минут 9 секунд
можно представить как сумму разных гармоник.
13:19
13 минут 19 секунд
Гормоники — это, по сути, э синусоиды с разной частотой.
13:26
13 минут 26 секунд
И в общем, сложив синусоиды с разной частотой, мы можем получить сигнал любой сложности.
13:38
13 минут 38 секунд
Но благодаря преобразованию фурье, имея уже сложный сигнал, мы можем получить амплитудно-частотную
13:48
13 минут 48 секунд
характеристику, которая покажет нам, какие
13:56
13 минут 56 секунд
частоты и с какой амплитудой ээ задействованы в этом сигнале.
14:05
14 минут 5 секунд
И то есть, смотрите, мы разбиваем наш аудиосигнал на
14:13
14 минут 13 секунд
разные отрезки, которые перекрывают друг друга.
14:19
14 минут 19 секунд
И каждый вот такой вот отрезок мы передаём в преобразование фурье.
14:26
14 минут 26 секунд
Получаем амплитудно-частотную характеристику.
14:31
14 минут 31 секунда
Вот такой вот вектор множителей. для разных частот. Допустим,
14:38
14 минут 38 секунд
смотрите, вот для этой частоты будет самый большой множитель. Для следующей, которая за ним идёт, множитель будет ноль.
14:50
14 минут 50 секунд
Далее множитель будет чуть меньше, чем для этой. То есть получается такой вектор значений.
14:59
14 минут 59 секунд
И, значит, данный вектор значений мы переносим на спектрограмму. И вот это будет первый столбик спектрограммы.
15:09
15 минут 9 секунд
Далее мы двинемся по аудиосигналу.
15:13
15 минут 13 секунд
И уже вот этот вот участочек мы преобразовали.
15:19
15 минут 19 секунд
Далее будем работать с вот этим. Значит, его опять передаём на вход.
15:28
15 минут 28 секунд
Преобразование фурье получаем ещё один вектор значений. И это уже
15:37
15 минут 37 секунд
будет как второй столбик для нашей спектрограммы.
15:43
15 минут 43 секунды
Итак, пройдя вот этим вот окном по всему аудиосигналу, преобразуя
15:52
15 минут 52 секунды
его из временной области частотную, мы и вот получим такое изображение
15:59
15 минут 59 секунд
спектрограммы, которая будет в дальнейшем передаваться на вход нейросети.
16:11
16 минут 11 секунд
Так, ну и давайте пойдём дальше.
16:16
16 минут 16 секунд
Что тут, собственно, и реализована функция, которая будет преобразовывать аудио спектрограмму.
16:25
16 минут 25 секунд
Далее отобразим аудиодорожки для нашего датасета и соответствующие им спектрограммы.
16:34
16 минут 34 секунды
Вот тут вот вы можете увидеть две аудиодорожки и две спектрограммы.
16:41
16 минут 41 секунда
для двух аудиозаписей команды ноль.
16:48
16 минут 48 секунд
Далее единичка. И вот видите, что как бы ноль с нулём между собой похожее,
16:57
16 минут 57 секунд
а вот единичка вот тут уже, ну, ну, тоже похожая, но вот тут, допустим, вот появился вот такой вот пропуск. И как
17:04
17 минут 4 секунды
бы, ну, можно уже найти какую-то разницу.
17:10
17 минут 10 секунд
чуть-чуть больше разницы меж чем между вот этими двумя изображениями.
17:16
17 минут 16 секунд
И именно вот эту вот разницу и будет улавливать нейросеть. На чём она будет строить свой вывод о том, что как
17:25
17 минут 25 секунд
что какая из команд была подана на её вход?
17:37
17 минут 37 секунд
Ну вот так далее.
17:40
17 минут 40 секунд
потребуется аугментировать данные. Я уже сказал, что на самом деле
17:47
17 минут 47 секунд
вот для каждой команды хоть и записано по 50 аудиодорожек, но этих данных
17:54
17 минут 54 секунды
маловато ещё, что они записаны одним человеком, мной. А как бы то тоже такое себе.
18:04
18 минут 4 секунды
данных маловато, хоть я и пытался там с с разными интонациями со всем вот изощряться при записи,
18:12
18 минут 12 секунд
что маловато, маловато данных. И для этого, чтоб как-то поправить положение,
18:19
18 минут 19 секунд
существует такая техника, как аугментация.
18:24
18 минут 24 секунды
Аугументация — это метод искусственного увеличения обучающей выборки за счёт
18:31
18 минут 31 секунда
создания новых немного изменённых копий существующих данных.
18:38
18 минут 38 секунд
И вот тут вот реализован ряд функций, которые будут
18:45
18 минут 45 секунд
немного изменять аудиоданные,
18:50
18 минут 50 секунд
сдвиг по времени, добавить белого шума, рандомные усиление,
18:59
18 минут 59 секунд
как бы ээ тайм маскинг, маскировка участков различных.
19:08
19 минут 8 секунд
И, значит, смотрите, как это работает. Вот это оригинальное аудио.
19:18
19 минут 18 секунд
Вот это его первая аугментированная копия.
19:22
19 минут 22 секунды
То есть какое первое отличие мы видим, что
19:29
19 минут 29 секунд
этого от этого, что вот это немного сдвинуто по времени вправо, а также посередине вдруг сигнал обнулился.
19:42
19 минут 42 секунды
Вот это вот называется тайм маскинг, типа маскирование. маскирование, так скажем.
19:50
19 минут 50 секунд
Что далее? Смотрите, вот это оригинал, а вот это его вторая аугментированная
19:56
19 минут 56 секунд
копия. Тоже данная копия сдвинута немного влево по вре по времени.
20:05
20 минут 5 секунд
И также применён тайм маскинг, маскирование.
20:12
20 минут 12 секунд
Ну и третий случай, тут можно увидеть, что добавлено
20:20
20 минут 20 секунд
много шума, что как бы и на аудиодорожке, и на спектрограмме можно увидеть много шума.
20:28
20 минут 28 секунд
И вот таким образом можно сильно увеличить датасет и помочь модели лучше обучиться.
20:41
20 минут 41 секунда
Так, ну, после чего уже разбиваем датасет на тренировочную эволюционные выборки.
20:51
20 минут 51 секунда
Так, аугментируем и переходим к построению нейросети.
21:00
21 минута
Так, подгружаем все необходимые библиотеки, прописываем архитектуру свёрточной нейронной сети.
21:10
21 минута 10 секунд
и запускаем процесс обучения.
21:15
21 минута 15 секунд
И вот тут вот можно посмотреть, шестая эпоха, как бы я поставил 30 эпох обучения.
21:25
21 минута 25 секунд
И по окончанию видим, что модель
21:33
21 минута 33 секунды
точность предсказания модели для тестовой выборки 97,5%.
21:43
21 минута 43 секунды
Так, далее посмо, ну, визуализируем процесс обучения по эпохам, как модель обучалась.
21:55
21 минута 55 секунд
Ээ, так, глянем на confusion matrix. Что мы тут увидим?
22:03
22 минуты 3 секунды
Смотрите, для тестовой выборки была построена вот такая вот матрица.
22:10
22 минуты 10 секунд
Значит, тут наши команды 0 1 2 3.
22:16
22 минуты 16 секунд
И когда на вход модели подавались
22:24
22 минуты 24 секунды
данные для команды ноль из тестовой выборки, то модель всегда
22:31
22 минуты 31 секунда
точно била в цель и всегда, если ей на ход подают ноль, она говорит: «Это ноль».
22:37
22 минуты 37 секунд
Когда подавали единицу, то в 89% случаев модель угадывала, что это единица.
22:47
22 минуты 47 секунд
И в 11% она говорила, что это три. Ну и с двойкой, и с тройкой она тоже всегда била в цель.
22:58
22 минуты 58 секунд
И благодаря вот такой вот табличке можно сделать разные выбо выводы, почему так,
23:08
23 минуты 8 секунд
что, ну, как бы что не так, как бы где какая ошибка, что конкретно, допустим, почему
23:18
23 минуты 18 секунд
один и три 1 буква и может из-за этого может
23:25
23 минуты 25 секунд
качество аудиода данных не совсем хорошие. Ну, в общем, это такая таблица для подумать,
23:33
23 минуты 33 секунды
ээ, что что как можно улучшить датасет.
23:38
23 минуты 38 секунд
Ну и далее конвертируем модель в облегчённый формат для того, чтобы её можно было
23:47
23 минуты 47 секунд
загрузить в ESP32.
23:52
23 минуты 52 секунды
Так вот.
23:58
23 минуты 58 секунд
После выполнения вот этой команды вот в папочке
24:05
24 минуты 5 секунд
Python INMP41 появится облегченная модель.
24:15
24 минуты 15 секунд
что вот как раз-таки эту модель потребуется уже вот этот файлик, ну, точнее его
24:23
24 минуты 23 секунды
содержимое загружать ээ в ESP32, что это уже и есть модель,
24:32
24 минуты 32 секунды
которая которая будет крутиться внутри микроконтроллера и определять
24:40
24 минуты 40 секунд
какие команды были захвачены микрофоном.
24:47
24 минуты 47 секунд
Ну давайте тут закончим с Юпитер ноутбуком немного.
24:54
24 минуты 54 секунды
Посмотрим ещё, что тут до конца. Тут, ну, в общем, всё уже модель готовая.
25:01
25 минут 1 секунда
Готова, облегчённая.
25:03
25 минут 3 секунды
Тут мы проверяем, насколько упала или повысилась её точность после квантования.
25:15
25 минут 15 секунд
И видим, что после квантования, после того, как модель сделали более лёгкой,
25:22
25 минут 22 секунды
уменьшили её размер для того, чтобы её можно было передать на микроконтроллер.
25:26
25 минут 26 секунд
После этого её точность составляет 97,5%.
25:33
25 минут 33 секунды
Так. И далее давайте перейдём в этот файлик model.cc.
25:43
25 минут 43 секунды
И вот эта вот структура модели, неё веса, всё её содержимое потребуется
25:51
25 минут 51 секунда
скопировать и загрузить файлик flowlmodel.hh.
26:03
26 минут 3 секунды
Вот.
26:05
26 минут 5 секунд
То есть, когда вы уже будете обучать свою модель, получите свои веса, то вам
26:12
26 минут 12 секунд
надо будет заменить содержимое вот этого файлика Torerflow model.h на содержимое файла model.c.
26:26
26 минут 26 секунд
Так, ну и в принципе всё. После этого можно будет
26:36
26 минут 36 секунд
загрузить данный скетч 02MP
26:44
26 минут 44 секунды
441 TFL CNN на микроконтроллер
26:51
26 минут 51 секунда
и уже увидеть то, что мы с вами видели в начале данного ролика.
27:00
27 минут
Спасибо за внимание. До свидания.

