
Сегодня я хочу показать и рассказать вам, как, подключив к ESP32-S3 тепловизионную матрицу MLX90640, можно запустить веб-сервер для стриминга теплового изображения с определением в реальном времени того, какие сущности попали в поле зрения тепловизора.
В моём случае была обучена свёрточная нейронная сеть для классификации трёх сущностей в инфракрасном спектре: кошки, человека или же отсутствия двух предыдущих.
Данная система является полностью автономной, и инференс TensorFlow Lite-модели происходит прямо на борту микроконтроллера.
Демонстрация работы + исходный код:
?VK: https://vkvideo.ru/video-229753773_456239024
?GitHub: https://github.com/DenissStepanjuk/ESP32.MLX90640.Classification_with_TensorFlowLite
Сбор датасета
Первый этап - собрать набор данных, на котором будет обучена нейросеть для классификации сущностей. Тепловизионная матрица MLX90640 представляет собой матрицу 24×32 пикселя из 768 инфракрасных датчиков. Каждый из датчиков измеряет температуру в своей точке поля зрения, благодаря чему два раза в секунду от MLX90640 по интерфейсу I2C можно получить полноценное тепловое изоброжение окружающего пространства.
В репозитории на GitHUB реализован скетч "01_MLX90640_collect_dataset", который реализует стриминг теплового изображения с матрицы MLX90640, благодаря чему тепловизор можно корректно навести на интересующий обьект и прозвести захват изображения.
Для обучения свёрточной нейросети потребуется собрать как минимум около 50 снимков на каждую категорию: человек, кошка и пустота.
Обучение свёртончной нейронной сети

В репозитории на GitHUB есть ноутбук "MLX90640-CNN-TFL.ipynb", в котором полностью реализован процесс обучения нейросети средствами библиотеки глубокого обучения TensorFlow, тут же давайте разберём ключевые этапы.
1) Загрузка данных
На этом шаге происходит базовая подготовка данных:
Загрузка тепловых матриц из папок dataset/cat, dataset/person, dataset/empty, преобразование файлов в массивы NumPy и формирование единого набора данных и соответствующих меток классов.
2) Масштабирование данных
Тепловизор MLX90640 возвращает тепловые матрицы размерности 24×32, где каждый элемент матрицы это температуры в градусах Цельсия, то есть float значение.
Для нейросети, которая будет залита на ESP32, такой диапазон значений не подходит - модель должна работать с нормализованными входами в формате int8.
Каждое значение нормализуется в диапазон от –128 до +127.
3) Визуализация данных
Перед обучением важно убедиться, что данные корректны. Поэтому в ноутбуке выполняется визуализация тепловыз изображений 24×32. Отобразив нескольких образцов для каждой категории (кошка, человек, пустота), можно убедиться, что данные читаемы и различимы.
Этот этап помогает выявить ошибки: неправильный формат данных, перепутанные метки или некорректное чтение файлов.
4) Прописать структуру модели средствами TensorFlow
Далее создаётся архитектура свёрточной нейросети - это особый тип реализации искусственного интеллекта, который использует специальную математическую операцию, называемую свёрткой, для обработки данных из изображений. Свёртка выполняется путём перемножения двух матриц и получения третьей, меньшей матрицы.
Сеть принимает входное изображение и использует фильтр (ядро) для создания карты признаков, описывающей изображение.
5) Обучение модели
После определения архитектуры нейросети начинается этап обучения, в котором модель подбирает оптимальные параметры (веса) для распознавания тепловых паттернов. Обучение проводится в несколько последовательных шагов, каждый из которых важен для корректной сходимости модели.
Квантование модели
Квантование - это процесс преобразования весов модели из формата float32 в формат int8. Это уменьшает размер модели и ускоряет инференс модели в десятки раз. Такой формат значительно экономит память, что критично для микроконтроллеров. В итоге получается лёгкая и быстрая модель, пригодная для запуска прямо на ESP32.
После квантования модель сохраняется в формате TensorFlow Lite, а затем конвертируется в C-массив, который в свою очередь можно загрузить в память ESP32 и после компиляции и загрузки прошивки получить полностью автономную систему для стриминга теплового изображения с определением в реальном времени того, какие сущности попали в поле зрения тепловизора. Данный скетч можно найти в репозитории на GitHUB "02_MLX90640_CNN_TFL".
Комментарии (24)

monah_tuk
26.11.2025 16:16А можно отличить двух котов? Насущный вопрос)

DarkWolf13
26.11.2025 16:16очень просто, свой знает пароль для входа и может его сказать , чужой будет невнятно мяукать....

monah_tuk
26.11.2025 16:16Да оба своих.
Просто один молодой и жирный, а второй стройный, огненно-рыжий красавец, но старый (14 лет), да ещё и интеллигент (что не мешает ему гонять и бить собак, ловить бурундуков на деревьях и кошмарить мышей на даче). Молодой объёдает старого, хотя если старый его застанет, то отвешивает звонкого леща. В общем, нужно детектить молодого и жирного и пульверизатором его отгонять на автоматической основе от тарелки старого. Старый просто ест часто, но чуть чуть, а этот как помойка заглатывает всё, что видит.

JBFW
26.11.2025 16:16Как можно их НЕ различать? )
Они же все разные! От цветов и рисунка шерсти до взгляда и выражения лица..

Zara6502
26.11.2025 16:16у кошек нет лица, так уж получилось, с этим ничего не поделать. Но чтобы различать кошек нужно чтобы у вас в голове были записаны отличительные признаки. Если кошка мне незнакомая, то я буду смотреть только на базовые признаки и под них все кошки будут одинаковые. Собственно с людьми точно так же.
Цвет - это базовый признак, а вот рисунок - нет, как и взгляд и мимика. Поэтому нет ничего удивительного в том что 5 рыжих котов на заборе все будут одинаковыми для постороннего зрителя (как и для камеры).

JBFW
26.11.2025 16:16Лица нет, а выражение лица есть )
Впрочем да, многие не могут отличить даже кошку от кота. Причем ни с какой стороны...

Zara6502
26.11.2025 16:16У животных - морда. Так что у них и выражения лица нет.
Ну я слабо себе представляю полезность навыка различения полов кошачьих, это нужно почти никому, а учитывая что "любовь к кошкам" переоценена в целом, то какая разница кто там орёт - кот или кошка.

DYNAMIT-75
26.11.2025 16:16Не проще готовый прибор обнаружения присутствия купить? Я когда рассматривал обычные датчики движения с подключением через вайфай , то встречал обучаемые приборы , да порядком подороже , но вполне интересные промышленные . Например BITFRAME 24ггц. Обнаруживает даже сердцебиение и видит неподвижные тела. На озоне 1600 руб

Yrninibg
26.11.2025 16:16Проще, но тогда и весь смысл DIY теряется, потому что ты делаешь сам и именно так, как тебе нужно)

MadFisherman
26.11.2025 16:16Добрый день! А у меня такой вопрос, так как тоже собрался делать подобную сборку, но пока думаю. Собственно в чем вопрос: насколько тонкую нить перед собой он сможет распознать перед собой (предполагается что расстояние до нити будет не более чем 2 см. от матрицы)? Т.е. на чёрном матовом фоне будет проходить нить с температурой отличающейся от окружающей температуры и какой минимальный диаметр нити в таком случае сможет распознать?
Поясню: нити планируются из термопластичных полимеров (pa, pp, pla) от 0.06-0.1 мм. до 2.5 мм. и нужно поймать точку в которой температура максимально близка к температуре начала кристаллизации.

UFO_01
26.11.2025 16:16Обычная геометрическая задачка. Известно расстояние до точки (2см), известен угол (угол обзора камеры), получаете два прямоугольных треугольника. Известен один катет (2см) и прилежащий угол (обычно такие камеры имеют 70-110 градусов обзора, берём половину), надо найти другой катет. Полученное значение разделить на количество пикселей камеры (тут сказано). Получите примерный размер пикселя, для распознавания надо 2-3 пикселя. Умножаем и получаем диаметр проволоки.
Вроде нормально объяснил, я бы сразу ответ сказал, да записать негде :)

MadFisherman
26.11.2025 16:16В целом спасибо, я понимаю. Можно и меньше, снизить расстряние до 5 мм. Речь идёт о исполнении MLX90640ESF-BAB-000-TU (у автора, если картинки верные похоже baa исполнение), с углом обзора 55 и 35 градусов. Хотя прошу автора попробовать в живую проверить хоть на рыболовной леске, если есть возможность. Так как не все упирается в размеры пикселей, а добавляется шум и усреднение...

Yrninibg
26.11.2025 16:16Можно было бы улучшить проект добавив пробуждение по обычному PIR-датчику движения. Тепловизор и ESP32 потребляют довольно много, а так, система могла бы большую часть времени спать, и только при срабатывании PIR-датчика просыпаться, делать снимок и классифицировать объект

ArtyomOchkin
26.11.2025 16:16Задумка хорошая, но больше тянет на пост. Хотелось бы более подробного "раскрытия карт" - более подробного рассказа. А ещё интересно, можно ли в реальном времени прикрутить дообучалку, условно попадает человек в поле зрения датчика и сохраняется лог, что это человек => ок, сохраняем, подтверждая, что это так. Если же обнаруживается некорректное распознавание, то отмечаем это с занесением в соответствующий массив (или подмассив, в котором будут хранится данные дообучения). От этого конечно пострадает оптимизация... Но всё же, интересно, можно ли так сделать?
Спасибо за ссылку на
телеграммГитхаб, приятно, когда вместо болтовни сразу есть исходники для экспериментов.

Psychosynthesis
26.11.2025 16:16Тема интересная, материала очень мало...
Что в итоге-то получилось? Как шить, итоговый код? Как всё это запускать?

Dark_Purple
26.11.2025 16:16какие сущности попали в поле зрения тепловизора.
В виде гномика определит?)))
JBFW
Тема интересная, но здорово напоминает известный анекдот:
-- Сегодня - мастер-класс по рисованию совы: берем лист бумаги, карандаш, аккуратно кладем лист на стол, берем карандаш в правую руку, и рисуем сначала один кружочек, а потом другой.
А потом рисуем остальную сову.
Я-то уже собрался поучиться, как приделать распознавание кошек под дверью, дабы отделить своих от гостевых...
AndrDD
А по каким признакам вы собирались кошек отличать? Ваша кошка более тёплая?)
monah_tuk
Вот было интересно узнать) у одного жира больше и шуба теплее...
JBFW
Конкретно в данном случае интересовала возможность прикрутить обычную камеру и распознавание по лицу. Серьезно, кошки ведь достаточно разные, более разные чем люди.
ZloyRabadaber
Поддерживаю. Статья на тему - Смотрите как я могу, но вам не скажу.
Yrninibg
Мяса не хватает, согласен
Было бы здорово, если бы чуть подробнее расписали именно инженерные решения: как автор боролся с шумами матрицы MLX90640, как аугментировал данные для обучения, почему выбрал именно такую архитектуру сети