- PVSM.RU - https://www.pvsm.ru -
ESP32 давно зарекомендовал себя как универсальный микроконтроллер для IoT: он умеет работать с Wi-Fi и Bluetooth, управлять сенсорами и исполнительными устройствами. Но за последние годы стало ясно, что даже на таких простых устройствах можно запускать алгоритмы машинного обучения.
В этой статье рассмотрим, как на ESP32 можно реализовать три базовых алгоритма классификации — дерево решений, метод К-ближайших соседей (KNN) и полносвязную нейросеть на TensorFlow Lite.
Для эксперимента использовался датчик цвета GY-31 (TCS230). Он преобразует отражённый от поверхности на которую направлен свет в три значения — красный, зелёный и синий (R, G, B). Задача: по этим трём числам определить, какой цвет «видит» сенсор: красный, оранжевый, жёлтый, зелёный, синий, фиолетовый, белый или чёрный.
Мы измеряем значения RGB с датчика.
Каждый набор значений — это вектор признаков.
Нужно отнести этот вектор к одному из классов (цветов).
Для обучения был собран небольшой датасет: 80 примеров, по ~10 для каждого цвета. Каждый пример из датасета состоит из трёх цветовых компонент («Red», «Green», «Blue») и соответствующего им цвета. Так как данные по сути это 3 параметра и соответствующая им категория, то их можно визуализировать в пространстве.
VK: https://vkvideo.ru/video-229753773_456239017 [1]
GitHub: https://github.com/DenissStepanjuk/ESP32.Basic_Deep_Learning_Algorithms_for_GY-31-TCS230/tree/main/02_Decision_Trees_RGB [2]
Решающее дерево — разбивает решение на шаги, на каждом шаге задаётся вопрос косательно параметров сущности для классификации "Этот параметр больше заранее вычесленого значения?". По сути это иерархия вопросов «да/нет», по которым алгоритм пошагово уточняет, к какому классу принадлежит объект.
Пример для задачи классификации цветов:
Значение BLUE > 14.5 ?
Значение BLUE > 17.5 ?
Значение RED> 21 ?
Значение RED> 10.5 ?
В итоге получается структура, которая напоминает «ручные правила», но построена автоматически на основе данных.
Для нашего RGB-вектора дерево быстро выделяет простые границы: например, чёрный цвет отличается низкими значениями всех каналов, белый — наоборот, высокими. А такие близкие оттенки, как Orange и Red, различаются соотношением R и G.
Плюсы: легко интерпретируется, код дерева сводится к вложенным «if-else», работает мгновенно.
Минусы: может ошибаться на «пограничных» случаях, особенно если датасет небольшой.
VK: https://vkvideo.ru/video-229753773_456239018 [3]
GitHub: https://github.com/DenissStepanjuk/ESP32.Basic_Deep_Learning_Algorithms_for_GY-31-TCS230/tree/main/03_KNN_RGB [4]
Алгоритм KNN чтобы классифицировать новое измерение с датчика смотрит, какие примеры в обучающем наборе находятся ближе всего к нему в пространстве RGB.
Одним из простейших способов рассчитать растояние между двумя точками в едином пространстве будет посчитать Евклидово расстояние между этими точками.
Ниже приведён игрушечный пример, когда есть один неизвестный цвет и 4 известных. Посчитав Евклидово расстояние между неизвестным цветом и известными можно увидеть, что наименьшее расстояние до оранжевого, из чего можно предположить что это он и есть.
RGB-значения образуют в пространстве трёх координат облака точек для каждого цвета. Красные точки сгруппированы в одной области, синие — в другой, зелёные — в третьей. Если новый пример попадает ближе к «зелёной кучке», то и классифицируется как зелёный.
Алгоритм хорошо справляется с ситуациями, когда границы между классами сложные и нелинейные. Например, различие между Violet и Blue сложно описать правилом, но их «облака» в пространстве RGB всё равно разделены.
Плюсы: высокая точность даже на малых данных, простая идея.
Минусы: нужно хранить весь обучающий набор; при росте числа примеров скорость классификации падает.
VK: https://vkvideo.ru/video-229753773_456239019 [5]
GitHub: https://github.com/DenissStepanjuk/ESP32.Basic_Deep_Learning_Algorithms_for_GY-31-TCS230/tree/main/04_TFL_RGB [6]
Нейросеть — это набор слоёв, где каждый слой преобразует входные данные через взвешенные связи и нелинейные функции. Для задачи классификации цветов достаточно небольшой сети: три входа (R, G, B), пара скрытых слоёв и выход, соответствующий количеству классов (например, 8 цветов).
В отличие от дерева или k-NN, нейросеть сама строит внутренние представления. Например:
Один нейрон может научиться отличать «насыщенность красного».
Другой — «наличие синего при низком зелёном».
На выходе сеть объединяет эти признаки и выдаёт наиболее вероятный цвет.
После обучения сеть смогла безошибочно распознавать все цвета в датасете. Более того, даже если RGB немного колеблется из-за освещения или угла, сеть «обобщает» опыт и всё равно выдаёт правильный класс.
Обычная нейросеть слишком «тяжёлая» для ESP32. Поэтому модель конвертируется в формат TFLite, а затем квантуется (параметры переводятся из float32 в int8). Это сильно уменьшает размер модели и ускоряет вычисления, при этом почти не снижая точность.
Плюсы: высокая точность, устойчивость к шуму, возможность масштабировать задачу.
Минусы: требуется больше подготовки (обучение модели, конвертация, квантизация), реализация сложнее, чем у дерева или k-NN.
Даже простые алгоритмы машинного обучения отлично работают на микроконтроллере ESP32.
Решающее дерево — лучший вариант для знакомства с ML на железе.
k-NN показывает высокую точность, но требует хранения данных.
Нейросеть с TFLite — самый перспективный вариант, если вы готовы пройти путь обучения и квантизации.
Таким образом, ESP32 становится не только контроллером для IoT, но и мини-платформой для прикладного машинного обучения.
Автор: dsb42
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/avtomatizatsiya/432300
Ссылки в тексте:
[1] https://vkvideo.ru/video-229753773_456239017: https://vkvideo.ru/video-229753773_456239017
[2] https://github.com/DenissStepanjuk/ESP32.Basic_Deep_Learning_Algorithms_for_GY-31-TCS230/tree/main/02_Decision_Trees_RGB: https://github.com/DenissStepanjuk/ESP32.Basic_Deep_Learning_Algorithms_for_GY-31-TCS230/tree/main/02_Decision_Trees_RGB
[3] https://vkvideo.ru/video-229753773_456239018: https://vkvideo.ru/video-229753773_456239018
[4] https://github.com/DenissStepanjuk/ESP32.Basic_Deep_Learning_Algorithms_for_GY-31-TCS230/tree/main/03_KNN_RGB: https://github.com/DenissStepanjuk/ESP32.Basic_Deep_Learning_Algorithms_for_GY-31-TCS230/tree/main/03_KNN_RGB
[5] https://vkvideo.ru/video-229753773_456239019: https://vkvideo.ru/video-229753773_456239019
[6] https://github.com/DenissStepanjuk/ESP32.Basic_Deep_Learning_Algorithms_for_GY-31-TCS230/tree/main/04_TFL_RGB: https://github.com/DenissStepanjuk/ESP32.Basic_Deep_Learning_Algorithms_for_GY-31-TCS230/tree/main/04_TFL_RGB
[7] Источник: https://habr.com/ru/articles/952518/?utm_campaign=952518&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.