Звучит как очередной заголовок из серии «будущее уже наступило»: берём обычный Wi-Fi, несколько дешёвых ESP32 и внезапно видим на экране человека, который находится за стеной. Без камеры, без датчиков на человеке и даже без какого-нибудь браслета.

Я наткнулся на проект RuView на GitHub. Раньше он назывался WiFi-DensePose. На GitHub у проекта уже около 90 тысяч звёзд, а роликов со светящимися скелетами в интернете столько, что первая мысль была примерно такой: либо это какая-то магия, либо нас опять очень красиво обманывают.

В итоге полез смотреть, что там внутри. Репозиторий, документацию, модели, issues. Особенно issues, потому что там обычно довольно быстро заканчивается маркетинг и начинается реальная жизнь. Если коротко: проект настоящий. Но ESP32 за девять долларов пока не превращает квартиру в рентген-кабинет.

Как Wi-Fi вообще может увидеть человека

Слово «увидеть» тут не совсем правильное. Роутер постоянно гоняет по помещению радиосигнал. Волны отражаются от стен, мебели, техники, людей. Человек прошёл по комнате, повернулся, сел или даже просто дышит, и картина распространения сигнала немного изменилась.

Некоторое Wi-Fi-железо позволяет получить CSI (Channel State Information). Это уже не обычный RSSI с условными «минус 60 дБм», а гораздо более подробная информация о состоянии радиоканала: амплитуды, фазы, поднесущие и изменение всего этого во времени. Картинки при этом, естественно, никакой нет.

Интерфейс Live WiFi Sensing в RuView
Интерфейс Live WiFi Sensing в RuView

Официальный скриншот интерфейса Live WiFi Sensing: подключение ESP32, RSSI, характеристики сигнала и классификация активности. Источник: репозиторий RuView.

Если совсем по-простому, Wi-Fi человека не видит. Он замечает, как человек меняет радиоэхо помещения. По таким изменениям можно понять, что кто-то вошёл в комнату, вышел из неё или начал двигаться. Даже дыхание создаёт небольшие периодические изменения сигнала.

Со скелетом всё намного веселее. Понять, где у человека рука, где нога, куда он повернул голову и в какой позе вообще стоит, намного сложнее. Тут уже нужны обученные модели. Причём результат зависит и от помещения, и от расположения передатчиков, и от количества узлов, и от того, на каких данных модель обучалась. В общем, обнаружить человека и восстановить его позу — задачи всё-таки очень разные.

Что нужно из железа

С обычным ноутбуком и первым попавшимся домашним роутером далеко не уехать. Чаще всего наружу они отдают только RSSI, то есть довольно грубую оценку мощности сигнала. Для простого детектора движения этого ещё может хватить. Для восстановления позы — уже нет.

В документации RuView для получения CSI предлагаются ESP32-S3 и ESP32-C6. Отдельная плата стоит примерно 6–10 долларов. Правда, тут довольно быстро портится красивый заголовок про «человека за стеной за $9». Разработчики рекомендуют использовать несколько узлов. Например, комплект из трёх-шести ESP32-S3 в документации оценивается примерно в 54 доллара. Всё равно недорого. Но это уже не совсем история про одну плату, которую воткнул в USB и пошёл смотреть сквозь стены.

Панель Human Pose Detection в RuView
Панель Human Pose Detection в RuView

Официальный скриншот Human Pose Detection. Справа сам интерфейс поясняет границу возможностей: одна ESP32 — присутствие, дыхание и грубое движение; две-три — локализация тела и направление движения; четыре и более плюс обученная модель — отслеживание конечностей и полная поза. Источник: репозиторий RuView.

Есть ещё один момент, на котором я сначала сам чуть не споткнулся. Самый простой запуск RuView через Docker работает на симулированных данных. То есть ESP32 можно вообще не покупать. Запускаем проект и получаем красивый интерфейс со скелетом. Только Wi-Fi в этот момент никого не видит. Это демонстрация программы на сгенерированных данных.

Демонстрационный режим RuView Observatory
Демонстрационный режим RuView Observatory

Официальная визуализация RuView Observatory. В правом верхнем углу видна метка DEMO: этот экран показывает возможности интерфейса, но сам по себе не доказывает работу распознавания на реальных CSI-данных. Источник: репозиторий RuView.

Где начинается самое интересное

Разработчикам тут надо отдать должное. Если залезть в документацию чуть глубже README, состояние разных частей проекта описано довольно подробно. Захват CSI и обработка сигнала реализованы. Детектирование присутствия и движения тоже. Для ESP32 есть прошивка, модели выложены, репозиторий активно обновляется, лицензия MIT. То есть перед нами точно не README с тремя красивыми GIF-ками и обещанием когда-нибудь написать код.

А вот с восстановлением позы пока сложнее. Речь про тот самый режим с 17 точками тела, который и выглядит на видео наиболее эффектно. Для встроенной модели сейчас указано около 3% PCK@20. До надёжного определения реального положения рук, ног и головы тут, мягко говоря, ещё далеко. Причём есть деталь ещё интереснее: текущий путь выполнения модели всё ещё может возвращать центрированный скелет-заглушку с confidence=0. Получается немного забавно. Скелет на экране есть, а человека этот конкретный скелет может вообще не описывать.

При этом в README встречается куда более приятная цифра: 82,69% PCK@20. Вот на ней очень легко сделать неправильный вывод. Эти 82,69% относятся к отдельному тестированию на подготовленном датасете MM-Fi. Это совсем не тот сценарий, когда мы приносим домой одну ESP32, ставим её возле роутера и получаем такую же точность на человеке за стеной.

Мне кажется, большая часть хайпа вокруг проекта появляется именно здесь. CSI реально существует. По нему реально можно ловить изменения в помещении. Есть нейросети, которые пытаются из этих изменений восстановить позу. Есть научные работы с хорошими результатами в контролируемых условиях. Ну и есть очень эффектная визуализация со скелетом. Когда всё это видишь в одном ролике, вывод «ESP32 видит людей через стены» возникает почти автоматически. Но пока между этими вещами есть довольно большой зазор.

Часть демонстраций RuView работает на симуляции. Есть и вариант, где эталонную позу получает веб-камера, а Wi-Fi используется как дополнительный источник данных. Если смотреть короткий ролик без пояснений, понять, что именно сейчас перед тобой, практически невозможно.

А кто-нибудь пробовал собрать это дома?

Вот тут я полез в issues и завис там надолго. Один пользователь пытался получить нормальную позу с четырьмя ESP32-S3, но ожидаемого результата не получил. Другой подключил уже шесть узлов: пакеты приходили, система их видела, но скелет на экране двигаться почему-то не захотел. Понятно, что два неудачных запуска сами по себе ничего не доказывают. Может быть проблема в настройке, помещении, расположении узлов, версии софта — вариантов хватает. Но для меня это хороший показатель того, на какой стадии сейчас находится проект.

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

Так это фейк или всё-таки работает?

Фейком я бы RuView точно не называл. Физика здесь реальная. Изменения Wi-Fi-сигнала действительно позволяют обнаруживать присутствие человека, движение и даже дыхание.

Восстановление позы тоже не придумали авторы RuView вчера вечером. Например, в работе DensePose From WiFi исследователи показывали восстановление положения человеческого тела по Wi-Fi-сигналам в контролируемых условиях.

И сам RuView не пустышка. Внутри нормальный живой проект: код, прошивки для ESP32, обработка CSI, модели, документация. Причём лично мне даже детектор присутствия кажется интересной штукой, если забыть на минуту про скелеты.

Представьте умный дом, который понимает, что в комнате кто-то есть, но при этом ему не нужна камера. Автоматический свет, охрана, определение движения. Можно экспериментировать с дыханием. В общем, применений хватает и без попытки нарисовать человеку локти.

Проблема скорее в формулировке. «По Wi-Fi можно определить присутствие и движение человека» — уже вполне реальная технология. «ESP32 за $9 строит точный скелет человека через стену» — пока нет. Разница между ними огромная, хотя для хорошего вирусного ролика она занимает примерно ноль секунд экранного времени.

Что бы я попробовал собрать сам

Если буду повторять RuView дома, со скелета точно не начну. Я бы взял две-три ESP32-S3 и сначала попробовал решить максимально скучную задачу: определить, есть человек в соседней комнате или нет. Без рук, ног и красивых человечков на экране. Просто есть человек — нет человека. Если это заработает стабильно, уже интересно.

Потом можно посмотреть сырые CSI, подвигать платы по комнате, поиграться с калибровкой. После этого попробовать движение, потом дыхание. А вот если всё перечисленное действительно удастся нормально повторить, тогда уже можно лезть в восстановление позы и смотреть, что получится там. Мне такой подход нравится больше, потому что сразу становится понятно, где реально работает радиочасть, где работает обработка сигнала, а где мы уже смотрим на результат экспериментальной модели.

Наверное, поэтому сам RuView меня в итоге и зацепил. Не скелетом за стеной. С ним как раз пока вопросов больше всего. Меня больше удивило другое: сколько информации вообще можно вытащить из обычного Wi-Fi-сигнала. Из того самого сигнала, который круглосуточно болтается вокруг нас и про который обычно вспоминаешь только тогда, когда интернет начинает тормозить.

Если очередной проект обещает какую-то совсем уж красивую магию, мне обычно интереснее открыть репозиторий и посмотреть, что там реально работает. Иногда после этого магии становится меньше. Зато сам проект оказывается намного интереснее.