ESP32 давно зарекомендовал себя как универсальный микроконтроллер для IoT: он умеет работать с Wi-Fi и Bluetooth, управлять сенсорами и исполнительными устройствами. Но за последние годы стало ясно, что даже на таких простых устройствах можно запускать алгоритмы машинного обучения.

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

Для эксперимента использовался датчик цвета GY-31 (TCS230). Он преобразует отражённый от поверхности на которую направлен свет в три значения — красный, зелёный и синий (R, G, B). Задача: по этим трём числам определить, какой цвет «видит» сенсор: красный, оранжевый, жёлтый, зелёный, синий, фиолетовый, белый или чёрный.

Постановка задачи

  1. Мы измеряем значения RGB с датчика.

  2. Каждый набор значений — это вектор признаков.

  3. Нужно отнести этот вектор к одному из классов (цветов).

Для обучения был собран небольшой датасет: 80 примеров, по ~10 для каждого цвета. Каждый пример из датасета состоит из трёх цветовых компонент («Red», «Green», «Blue») и соответствующего им цвета. Так как данные по сути это 3 параметра и соответствующая им категория, то их можно визуализировать в пространстве.

RGB 3D Scatter Plot
RGB 3D Scatter Plot

Решающее дерево

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 известных. Посчитав Евклидово расстояние между неизвестным цветом и известными можно увидеть, что наименьшее расстояние до оранжевого, из чего можно предположить что это он и есть.

KNN
KNN

Почему это работает?

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)


  1. izxshevtsov
    01.10.2025 15:58

    "Но за последние годы стало ясно, что даже на таких простых устройствах можно запускать алгоритмы машинного обучения. "

    Это было ясно с самого начала. Вернее было бы сказать, что за последние годы это стало легче благодаря TFL


  1. 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)