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
GitHub: https://github.com/DenissStepanjuk/ESP32.Basic_Deep_Learning_Algorithms_for_GY-31-TCS230/tree/main/02_Decision_Trees_RGB
Решающее дерево — разбивает решение на шаги, на каждом шаге задаётся вопрос косательно параметров сущности для классификации "Этот параметр больше заранее вычесленого значения?". По сути это иерархия вопросов «да/нет», по которым алгоритм пошагово уточняет, к какому классу принадлежит объект.

Пример для задачи классификации цветов:
Значение BLUE > 14.5 ?
Значение BLUE > 17.5 ?
Значение RED> 21 ?
Значение RED> 10.5 ?
В итоге получается структура, которая напоминает «ручные правила», но построена автоматически на основе данных.
Применение к датчику
Для нашего RGB-вектора дерево быстро выделяет простые границы: например, чёрный цвет отличается низкими значениями всех каналов, белый — наоборот, высокими. А такие близкие оттенки, как Orange и Red, различаются соотношением R и G.
Плюсы и минусы
Плюсы: легко интерпретируется, код дерева сводится к вложенным «if-else», работает мгновенно.
Минусы: может ошибаться на «пограничных» случаях, особенно если датасет небольшой.
Метод К-ближайших соседей (KNN)
VK: https://vkvideo.ru/video-229753773_456239018
GitHub: https://github.com/DenissStepanjuk/ESP32.Basic_Deep_Learning_Algorithms_for_GY-31-TCS230/tree/main/03_KNN_RGB
Алгоритм KNN чтобы классифицировать новое измерение с датчика смотрит, какие примеры в обучающем наборе находятся ближе всего к нему в пространстве RGB.
Одним из простейших способов рассчитать растояние между двумя точками в едином пространстве будет посчитать Евклидово расстояние между этими точками.

Ниже приведён игрушечный пример, когда есть один неизвестный цвет и 4 известных. Посчитав Евклидово расстояние между неизвестным цветом и известными можно увидеть, что наименьшее расстояние до оранжевого, из чего можно предположить что это он и есть.

Почему это работает?
RGB-значения образуют в пространстве трёх координат облака точек для каждого цвета. Красные точки сгруппированы в одной области, синие — в другой, зелёные — в третьей. Если новый пример попадает ближе к «зелёной кучке», то и классифицируется как зелёный.
Применение к датчику
Алгоритм хорошо справляется с ситуациями, когда границы между классами сложные и нелинейные. Например, различие между Violet и Blue сложно описать правилом, но их «облака» в пространстве RGB всё равно разделены.
Плюсы и минусы
Плюсы: высокая точность даже на малых данных, простая идея.
Минусы: нужно хранить весь обучающий набор; при росте числа примеров скорость классификации падает.
Полносвязная нейросеть (TensorFlow Lite)
VK: https://vkvideo.ru/video-229753773_456239019
GitHub: https://github.com/DenissStepanjuk/ESP32.Basic_Deep_Learning_Algorithms_for_GY-31-TCS230/tree/main/04_TFL_RGB
Нейросеть — это набор слоёв, где каждый слой преобразует входные данные через взвешенные связи и нелинейные функции. Для задачи классификации цветов достаточно небольшой сети: три входа (R, G, B), пара скрытых слоёв и выход, соответствующий количеству классов (например, 8 цветов).

В отличие от дерева или k-NN, нейросеть сама строит внутренние представления. Например:
Один нейрон может научиться отличать «насыщенность красного».
Другой — «наличие синего при низком зелёном».
На выходе сеть объединяет эти признаки и выдаёт наиболее вероятный цвет.
Применение к датчику
После обучения сеть смогла безошибочно распознавать все цвета в датасете. Более того, даже если RGB немного колеблется из-за освещения или угла, сеть «обобщает» опыт и всё равно выдаёт правильный класс.
Почему нужен TensorFlow Lite?
Обычная нейросеть слишком «тяжёлая» для ESP32. Поэтому модель конвертируется в формат TFLite, а затем квантуется (параметры переводятся из float32 в int8). Это сильно уменьшает размер модели и ускоряет вычисления, при этом почти не снижая точность.
Плюсы и минусы
Плюсы: высокая точность, устойчивость к шуму, возможность масштабировать задачу.
Минусы: требуется больше подготовки (обучение модели, конвертация, квантизация), реализация сложнее, чем у дерева или k-NN.
Выводы
Даже простые алгоритмы машинного обучения отлично работают на микроконтроллере ESP32.
Решающее дерево — лучший вариант для знакомства с ML на железе.
k-NN показывает высокую точность, но требует хранения данных.
Нейросеть с TFLite — самый перспективный вариант, если вы готовы пройти путь обучения и квантизации.
Таким образом, ESP32 становится не только контроллером для IoT, но и мини-платформой для прикладного машинного обучения.
Комментарии (2)
imageman
01.10.2025 15:58Решающее дерево
Одно решающее дерево практически никогда не используют. Смотрят на лес деревьев, а лучше на бутстреп. XGBoost можно сделать модель, которая потом (с некоторыми усилиями) конвертируется в любой стандартный язык программирования (я несколько лет назад пользовался для этого m2cgen - Transform ML models into a native code [Java, C, Python, Go, JavaScript, Visual Basic, C#, R, PowerShell, PHP, Dart, Haskell, Ruby, F#, Rust] with zero dependencies)
izxshevtsov
"Но за последние годы стало ясно, что даже на таких простых устройствах можно запускать алгоритмы машинного обучения. "
Это было ясно с самого начала. Вернее было бы сказать, что за последние годы это стало легче благодаря TFL