Я не раз читал, что Wi-Fi видит людей сквозь стены. В общих чертах я в это верил. Тело в основном вода, вода поглощает 2,4 ГГц, значит человек в комнате должен менять сигнал. Этот сигнал и так показывает любой клиент Wi-Fi, iw dev wlan0 link печатает его в dBm. Если этого числа достаточно, понять, пуста ли комната, можно без камеры и без нового железа.
Что на самом деле показывает одно такое число, я ни разу не проверял. Железа для нормальной проверки у меня тоже нет, поэтому я взял чужие записи.
Данные
Себастьян Шойрер из University College Cork выложил набор данных на Zenodo в 2020 году. Записан он в июле 2018 года с помощью Intel 5300 CSI Tool. В каждой комнате стоят точка доступа и 3 клиента на Raspberry Pi. Для каждого пакета на каждой связке точки доступа с клиентом в файле есть уровень сигнала на 3 антеннах и усиление приёмника. Человек был снаружи, сидел в комнате или ходил по ней. Сидение и ходьба идут блоками примерно по 5 минут, пустые промежутки длятся от 5 до 14 минут. Время каждой смены записано в файле разметки.
Я взял те 2 комнаты из 4, где участвует только один человек. Это 6 связок и 3 дня на комнату. На комнату в разметке около 3 часов сидения, от 77 до 87 минут пустой комнаты и меньше часа ходьбы. Часть этих минут не записана. Минуты в дверях и в коридоре я выбросил.
Набор даёт сырые числа по каждой антенне. Я перевёл их в dBm так же, как это делает get_total_rss.m из самого инструмента: сложить мощность 3 антенн, вычесть 44 и усиление. В среднем связка шлёт около 95 или 155 пакетов в секунду, в зависимости от комнаты. Я усреднил их до одного значения в секунду, примерно столько показывает индикатор сигнала в ноутбуке. Дальше смотрел окна по 10 секунд. Для каждого окна взял разброс и среднее.
Ходьба видна сразу
Когда человек ходит, медианный разброс в окне вырастает в 8 раз на одной связке и в 21 раз на другой. В пустой комнате медианный разброс окна держится от 0,04 до 0,06 dB, а при ходьбе поднимается до значений от 0,45 до 0,95 dB. Числа маленькие, но пустая комната очень тихая.
Чтобы из этого вышел детектор, нужен был порог. Для каждого дня я брал окна пустой комнаты за 2 других дня на той же связке. Порог я ставил так, чтобы выше него оказались 5% из них. Значит ложная тревога должна срабатывать примерно на 5% пустых окон. Вышло от 4,3% до 8,5%, во второй комнате больше. Окна с ходьбой оказались выше порога в 80% случаев на худшей связке и в 99% на лучшей.
Эта часть сходится с тем, что я читал. Уилсон и Патвари построили своё слежение “сквозь стены” на дисперсии уровня сигнала, статья вышла в 2011 году. Авторы этого набора занимались распознаванием присутствия и движения.
Человек, который сидит
С сидящим человеком выше того же порога оказались 12% окон на худшей связке и 43% на лучшей. Это заметно больше, чем у пустой комнаты, так что тело всё-таки видно. Но даже на лучшей связке больше половины окон с человеком внутри выглядят пустыми.
Следующая мысль была такая: ответ раз в 10 секунд никому не нужен. Датчик движения в коридоре держит свет ещё несколько минут после того, как вас увидел. Я попробовал то же правило: комната занята, если за последние 5 минут хоть одно окно было выше порога. Пустую комнату правило считало занятой в 42% её окон на одной связке и в 82% на другой. Я довольно долго искал ошибку. Отчасти дело было в сценарии записи, потому что пустой блок начинается сразу после ухода человека. Но даже когда я учитывал за последние 5 минут только тревоги самой пустой комнаты, она считалась занятой от 18% до 60% времени.
Поэтому я стал считать целые блоки. Блок замечен, если хотя бы одно окно внутри него выше порога. С порогом, который пропускает 5% пустых окон, каждая связка заметила от 23 до 31 из своих 30 или 31 блоков сидения. Она же заметила от 4 до 7 из своих 9 или 11 пустых блоков. 5% на окно звучит немного, но в пустом блоке длиной от 5 до 7 минут от 30 до 45 окон. Тогда я поднял порог до самого большого разброса среди пустых окон других дней. Замеченным остался только 1 пустой блок на связку, но и замеченных блоков сидения осталось от 5 до 21 примерно из 30.
Когда я впервые так считал, связки одной комнаты целиком пропустили 2 из 9 блоков ходьбы. Если видны 99% окон с ходьбой, такого быть не могло. Оказалось, что для этих блоков в комнате нет записи вообще, на всех 3 связках. Я выбросил все блоки, где данные есть меньше чем у половины окон.
Уровень гуляет сам по себе
Вторая идея была про среднее. Если человек поглощает часть сигнала, уровень должен падать, пока он сидит в комнате. Внутри одного дня среднее при сидении отличается от среднего пустой комнаты на величину от −1,41 до +0,69 dB. Знак меняется между связками и даже между днями на одной связке. В 8 случаях из 18 уровень вырос.
На 5 связках из 6 уровень пустой комнаты от дня к дню менялся сильнее, чем его сдвигал сидящий человек на той же связке. На одной связке уровень пустой комнаты в первый день был −51,85 dBm, а в третий −48,42, при том что человек по разметке отсутствовал. Что его сдвинуло, я не знаю. Дверь, передвинутый стул или люди в соседней комнате тоже меняют путь сигнала, как и само железо.
Одно меня удивило. Я попробовал ещё считать разброс по сырым пакетам, а не по средним за секунду и ждал, что больше данных поможет. Для сидения на всех 6 связках стало хуже. Подозреваю, что сидящий человек двигается медленно, а усреднение убирает только быстрый шум, но я это не проверял.
Что я не проверял
- Настоящую квартиру. Это 2 университетские комнаты 2018 года и один человек, который менял состояние каждые 5 минут. Того, кто час читает не двигаясь, увидеть, скорее всего, труднее.
- Несколько связок сразу. В наборе 3 связки на комнату, а я смотрел каждую отдельно. Радиотомография объединяет много связок, а CSI в том же наборе даёт 30 поднесущих вместо одного суммарного числа. Скорее всего, оба способа видят больше, но я не пробовал.
- Дыхание. Человек, который не двигается, всё равно дышит. В 2014 году Патвари с коллегами заметили дыхание по уровню сигнала, используя сеть из многих связок. Они пишут, что одна связка надёжно его не обнаруживает. Позже дыхание научились видеть в CSI. Здесь я его не искал.
- Другие сетевые карты. Intel 5300 отдаёт уровень каждой антенны с точностью до целого dB. Другая карта или телефон могут дать другой результат.