ESP32 + MLX90640
ESP32 + MLX90640

Сегодня я хочу показать и рассказать вам, как, подключив к 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)


  1. JBFW
    26.11.2025 16:16

    Тема интересная, но здорово напоминает известный анекдот:

    -- Сегодня - мастер-класс по рисованию совы: берем лист бумаги, карандаш, аккуратно кладем лист на стол, берем карандаш в правую руку, и рисуем сначала один кружочек, а потом другой.
    А потом рисуем остальную сову.

    Я-то уже собрался поучиться, как приделать распознавание кошек под дверью, дабы отделить своих от гостевых...


    1. AndrDD
      26.11.2025 16:16

      А по каким признакам вы собирались кошек отличать? Ваша кошка более тёплая?)


      1. monah_tuk
        26.11.2025 16:16

        Вот было интересно узнать) у одного жира больше и шуба теплее...


      1. JBFW
        26.11.2025 16:16

        Конкретно в данном случае интересовала возможность прикрутить обычную камеру и распознавание по лицу. Серьезно, кошки ведь достаточно разные, более разные чем люди.


    1. ZloyRabadaber
      26.11.2025 16:16

      Поддерживаю. Статья на тему - Смотрите как я могу, но вам не скажу.


    1. Yrninibg
      26.11.2025 16:16

      Мяса не хватает, согласен

      Было бы здорово, если бы чуть подробнее расписали именно инженерные решения: как автор боролся с шумами матрицы MLX90640, как аугментировал данные для обучения, почему выбрал именно такую архитектуру сети


  1. monah_tuk
    26.11.2025 16:16

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


    1. miksoft
      26.11.2025 16:16

      "Теперь у меня два одинаковых кота" :)


    1. DarkWolf13
      26.11.2025 16:16

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


      1. monah_tuk
        26.11.2025 16:16

        Да оба своих.

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


    1. JBFW
      26.11.2025 16:16

      Как можно их НЕ различать? )

      Они же все разные! От цветов и рисунка шерсти до взгляда и выражения лица..


      1. Zara6502
        26.11.2025 16:16

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

        Цвет - это базовый признак, а вот рисунок - нет, как и взгляд и мимика. Поэтому нет ничего удивительного в том что 5 рыжих котов на заборе все будут одинаковыми для постороннего зрителя (как и для камеры).


        1. JBFW
          26.11.2025 16:16

          Лица нет, а выражение лица есть )

          Впрочем да, многие не могут отличить даже кошку от кота. Причем ни с какой стороны...


          1. Zara6502
            26.11.2025 16:16

            У животных - морда. Так что у них и выражения лица нет.

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


  1. DYNAMIT-75
    26.11.2025 16:16

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


    1. JBFW
      26.11.2025 16:16

      Про неподвижные тела прямо интересно стало...


    1. Yrninibg
      26.11.2025 16:16

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


  1. MadFisherman
    26.11.2025 16:16

    Добрый день! А у меня такой вопрос, так как тоже собрался делать подобную сборку, но пока думаю. Собственно в чем вопрос: насколько тонкую нить перед собой он сможет распознать перед собой (предполагается что расстояние до нити будет не более чем 2 см. от матрицы)? Т.е. на чёрном матовом фоне будет проходить нить с температурой отличающейся от окружающей температуры и какой минимальный диаметр нити в таком случае сможет распознать?

    Поясню: нити планируются из термопластичных полимеров (pa, pp, pla) от 0.06-0.1 мм. до 2.5 мм. и нужно поймать точку в которой температура максимально близка к температуре начала кристаллизации.


    1. UFO_01
      26.11.2025 16:16

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

      Вроде нормально объяснил, я бы сразу ответ сказал, да записать негде :)


      1. MadFisherman
        26.11.2025 16:16

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


  1. Yrninibg
    26.11.2025 16:16

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


  1. ArtyomOchkin
    26.11.2025 16:16

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

    Спасибо за ссылку на телеграмм Гитхаб, приятно, когда вместо болтовни сразу есть исходники для экспериментов.


  1. Psychosynthesis
    26.11.2025 16:16

    Тема интересная, материала очень мало...

    Что в итоге-то получилось? Как шить, итоговый код? Как всё это запускать?


  1. Dark_Purple
    26.11.2025 16:16

    какие сущности попали в поле зрения тепловизора.

    В виде гномика определит?)))