dimhold.by
← Статьи

В одной открытой записи уровень сигнала Wi-Fi замечает идущего человека и почти не видит сидящего

Я не раз читал, что 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. Числа маленькие, но пустая комната очень тихая.

пусто сидит ходит сидит пусто −59 −55 −51 0 мин 10 мин 20 мин 30 мин dBm
Комната 2.60, связка с клиентом 4, 23 июля 2018 года, одно значение в секунду. Заливкой отмечено время, когда человек ходит.

Чтобы из этого вышел детектор, нужен был порог. Для каждого дня я брал окна пустой комнаты за 2 других дня на той же связке. Порог я ставил так, чтобы выше него оказались 5% из них. Значит ложная тревога должна срабатывать примерно на 5% пустых окон. Вышло от 4,3% до 8,5%, во второй комнате больше. Окна с ходьбой оказались выше порога в 80% случаев на худшей связке и в 99% на лучшей.

Эта часть сходится с тем, что я читал. Уилсон и Патвари построили своё слежение “сквозь стены” на дисперсии уровня сигнала, статья вышла в 2011 году. Авторы этого набора занимались распознаванием присутствия и движения.

Человек, который сидит

С сидящим человеком выше того же порога оказались 12% окон на худшей связке и 43% на лучшей. Это заметно больше, чем у пустой комнаты, так что тело всё-таки видно. Но даже на лучшей связке больше половины окон с человеком внутри выглядят пустыми.

0% 25% 50% 75% 100% связка 128a · 54 связка 128a · 56 связка 128a · 58 связка 260 · 4 связка 260 · 6 связка 260 · 8 пусто сидит ходит
Порог взят на 95-м перцентиле разброса в пустой комнате за 2 других дня той же связки.

Следующая мысль была такая: ответ раз в 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, при том что человек по разметке отсутствовал. Что его сдвинуло, я не знаю. Дверь, передвинутый стул или люди в соседней комнате тоже меняют путь сигнала, как и само железо.

0 dB 1 dB 2 dB 3 dB 4 dB связка 128a · 54 3,02 0,65 связка 128a · 56 2,14 1,11 связка 128a · 58 1,37 0,69 связка 260 · 4 0,62 0,54 связка 260 · 6 0,63 1,41 связка 260 · 8 3,42 0,86 пусто, между днями сидит, в тот же день
На 5 связках из 6 уровень пустой комнаты от дня к дню меняется сильнее, чем его сдвигает сидящий человек за день.

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

Что я не проверял

  • Настоящую квартиру. Это 2 университетские комнаты 2018 года и один человек, который менял состояние каждые 5 минут. Того, кто час читает не двигаясь, увидеть, скорее всего, труднее.
  • Несколько связок сразу. В наборе 3 связки на комнату, а я смотрел каждую отдельно. Радиотомография объединяет много связок, а CSI в том же наборе даёт 30 поднесущих вместо одного суммарного числа. Скорее всего, оба способа видят больше, но я не пробовал.
  • Дыхание. Человек, который не двигается, всё равно дышит. В 2014 году Патвари с коллегами заметили дыхание по уровню сигнала, используя сеть из многих связок. Они пишут, что одна связка надёжно его не обнаруживает. Позже дыхание научились видеть в CSI. Здесь я его не искал.
  • Другие сетевые карты. Intel 5300 отдаёт уровень каждой антенны с точностью до целого dB. Другая карта или телефон могут дать другой результат.