

Микроконтроллеры давно перестали быть простыми устройствами для управления датчиками и исполнительными механизмами. Сегодня, благодаря библиотекам вроде TensorFlow Lite, даже компактный ESP32 способен выполнять инференс нейросетей в реальном времени. В этой статье я расскажу о серии экспериментов по классификации движений человека с помощью сверхширокополосного радарного датчика LD2410 и различных базовых архитектур машинного обучения, таких как полносвязная, свёрточная, рекуррентная нейронные сети и трансформер (механизм внимания).
Каждый из подходов я реализовал и проверил на практике. В итоге получилась серия видеоуроков и репозиториев с кодом, но здесь я соберу все в одну статью, чтобы показать эволюцию решений и сравнить их эффективность.
Постановка задачи
LD2410 выдаёт каждую секунду вектор из 18 значений. Для классификации используется окно в 10 секунд (10 последовательных векторов), что формирует матрицу 10×18. Цель — по этим данным распознать, что происходит в поле зрения радара: человек стоит, бежит, прыгает, приседает, или никого нет.
Для обучения сначала нужно собрать датасет. Я использовал веб-интерфейс на ESP32 (реализован в отдельном скетче), где можно выбрать категорию движения, запустить запись и скачать файл с данными. После этого данные передаются в ноутбуки на Python, где выполняется предобработка, обучение и конвертация моделей.
Полносвязная нейронная сеть
? VK: https://vkvideo.ru/video-229753773_456239020
? GitHub: https://github.com/DenissStepanjuk/ESP32.LD2410.movements-classification-with-Neural-Networks/tree/main/02_LD2410_TFL_Linear

Самый простой способ применить нейросеть - использовать полносвязную сеть. Так как окно наблюдения 10 секунд, а каждая секунда даёт 18 чисел от радара, то следует «развернуть» окно данных в вектор длины 180 (10×18) и подать его на вход полносвязной сети, где каждый слой преобразует входные данные через взвешенные связи и нелинейные функции, но не видит ни порядок во времени, ни локальные связи между фичами. По сути, это «статическая» модель, которая смотрит на весь 10-секундный кусок сразу.
Точность: ~93.5%
Простая реализация.
Легко конвертируется в TFLite и запускается на ESP32.
Сверточная нейронная сеть
? VK: https://vkvideo.ru/video-229753773_456239021
? GitHub:https://github.com/DenissStepanjuk/ESP32.LD2410.movements-classification-with-Neural-Networks/tree/main/03_LD2410_TFL_CNN

Свёрточная нейронная сеть - это особый тип реализации искусственного интеллекта, который использует специальную математическую операцию, называемую свёрткой, для обработки данных из изображений. Свёртка выполняется путём перемножения двух матриц и получения третьей, меньшей матрицы. Сеть принимает входное изображение и использует фильтр (ядро) для создания карты признаков, описывающей изображение. В операции свёртки фильтр (обычно матрица 2x2 или 3x3) скользит по матрице изображения. Соответствующие числа в обеих матрицах перемножаются и складываются, образуя одно число, описывающее данный участок изображения. Этот процесс повторяется для всего изображения.

Так как на вход свёрточной сети необходимо подать изображение, то потребуется сформировать из данных «псевдоизображение» 10×18. Если просто посмотреть на эти «псевдоизображения», то видно, что изображения внутри каждой категории похожи между собой, но если сравнить изображения из разных категорий, то они будут сильно отличаться друг от друга.
Точность: ~95.5%
CNN лучше улавливает различия между движениями.
Легко интегрируется в ESP32 через TFLite.
Производительность лучше, чем у полносвязной модели.
Рекуррентная нейронная сеть
? VK: https://vkvideo.ru/video-229753773_456239022
? GitHub: https://github.com/DenissStepanjuk/ESP32.LD2410.movements-classification-with-Neural-Networks/tree/main/04_LD2410_TFL_RNN

Рекуррентная нейронная сеть - это особый тип нейросети, которая предназначена для работы с последовательными данными, такими как текст, речь или временные ряды. В отличие от обычных сетей, RNN учитывает не только текущий вход, но и контекст из предыдущих шагов. На каждом шагу сеть принимает входные данные и скрытое состояние, содержащее информацию о предыдущих шагах. Сеть обновляет скрытое состояние, что позволяет ей запоминать последовательность событий. Это делает RNN особенно полезными для задач обработки естественного языка, распознавания речи и анализа временных рядов. Главная особенность рекуррентных сетей — наличие “памяти”, которая хранит информацию о прошлых шагах и помогает точнее интерпретировать текущие данные.
Данные с LD2410 собранные за 10 секунд - это временные последовательности, которые необходимо передавать шаг за шагом на вход RNN, на каждом шаге обновляется скрытое состояние с учётом информации о предыдущих шагах. Таким образом передав на вход сети 10 векторов по 18 значений в каждом получим предсказание.
SimpleRNN: ~94.5%.
GRU: ~93%.
LSTM: до 98.5% (лучший результат на PC).
Проблема заключается в том, что TFLite Micro не поддерживает RNN для ESP32. Поэтому пришлось реализовать ручной инференс SimpleRNN. Для чего веса выгружаются в weights.h
, а скрытое состояние обновляется через матричные операции в Arduino-скетче.
Трансформер и механизм внимания
? VK: https://vkvideo.ru/video-229753773_456239023
? GitHub: https://github.com/DenissStepanjuk/ESP32.LD2410.movements-classification-with-Neural-Networks/tree/main/05_LD2410_TFL_Attention_and_Transformers

Трансформер применяется для анализа последовательностей. В отличие от RNN, которые обрабатывают данные пошагово и хранят скрытое состояние, Transformer использует механизм Self-Attention, где каждый вектор «смотрит» на все остальные, чтобы извлечь более полное представление. Это особенно важно для временных рядов, где нужно учитывать взаимосвязи между всеми моментами времени.
С LD2410 каждую секунду мы получаем вектор из 18 признаков. Для одного предсказания формируем окно из 10 последовательных векторов → матрица 10×18. Именно эта матрица подаётся на вход модели Transformer.
Вектора Queries, Keys и Values это вектора входной последовательности пропущенные через три разных полносвязных слоя чтобы выделить из них разную информацию.
Queries - запрос
Вектор Q - вектор входной последовательности пропущенный через полносвязный слой Queries от лица которого идёт обращение ко всем векторам входной последовательности пропущеным через полносвязный слой Keys, чтобы получить информацию о том как вектор Q связан со всеми векторами входной последовательности.
Keys - ключ
Вектор K - вектор входной последовательности пропущенный через полносвязный слой Keys к которому обращается вектор Q чтобы выявить какую информацию вектор K может отдать о том как они связаны.
QK^T - скалярное произведение вектора Q на вектор K, числовое значение (коэфицент) отражающие как сильно связаны между собой вектор Q с вектором K.
Values - значения
Вектор V - вектор входной последовательности пропущенный через полносвязный слой Values чтобы выделить из него полезную информацию. В дальнейшем каждый вектор V будет умножен на соответствующий коэфицент QK^T, после чего все отмаштабированные вектора V будут сложены между собой чтобы сформировать новый вектор содержащий обобщённую информацию обо всех векторах. Данный вектор встанет на место вектора Q.
В простейшей реализации все новые вектора усредняются (mean aggregation) и передаются в полносвязный классификатор → на выходе softmax выдаёт предсказание движения (Empty, Stand, Run, Jump, Squat).
Однослойный Transformer: ~84.5% точность.
Трёхслойный Transformer: ~78% точность
Заключение
Линейная модель — отличный старт, легко запускать на ESP32.
CNN — оптимальный выбор: высокая точность, простая интеграция.
RNN — показывает лучшие результаты на PC (особенно LSTM), но сложная реализация для ESP32.
Transformer — перспективное направление, но требует больше данных и мощностей.
Эти эксперименты показывают, что даже простой ESP32 в связке с дешёвым LD2410 способны решать задачи классификации движений с помощью нейросетей. Главное — правильно выбрать архитектуру и учитывать ограничения микроконтроллера.
Мы рассмотрели базовые подходы к машинному обучению на ESP32 с датчиком LD2410. От простых полносвязных сетей до современных трансформеров — каждый метод имеет свои плюсы и минусы. Если вы хотите повторить эксперименты или попробовать улучшить результаты, все исходники доступны в репозитории.
Отдельно хочу порекомендовать исследование «UWB‑gestures, a public dataset of dynamic hand gestures acquired using impulse radar sensors», которое навело меня на мысль об этом проекте. Я подробно разобрал это исследование в своей публикации.