RuView: 비디오 없이 WiFi 신호만으로 존재와 호흡, 심박을 감지하는 센싱 플랫폼

RuView 소개

RuView는 카메라나 웨어러블 기기 없이 일반 WiFi 신호의 변화만으로 공간 안의 사람을 감지하고, 호흡과 심박 같은 생체 신호까지 측정하는 WiFi 센싱(WiFi sensing) 플랫폼 입니다. 사람이 움직이거나 호흡할 때 공기 중을 채우고 있는 WiFi 전파에는 미세한 교란이 생기는데, RuView는 ESP32 센서로 캡처한 채널 상태 정보(Channel State Information, CSI)에서 이 교란을 추출해 누가 어디에 있고 어떤 상태인지 추론합니다.

RuView는 카메라 기반 모니터링의 사생활 노출 문제와 어두운 환경에서의 한계, 그리고 웨어러블 기기가 강제하는 착용 부담을 동시에 피하면서, 벽 너머의 존재 감지, 수면 중 호흡·심박 측정, 낙상 감지 같은 응용을 노립니다. ESP32-S3 한 대 기준으로 약 $9 의 저가 하드웨어에서 동작하며, Hugging Face에 공개된 사전 학습 모델 ruvnet/wifi-densepose-pretrained 를 4비트로 양자화하면 8 KB 안에 들어가는 것 이 특징입니다.

저장소는 Rust로 작성되어 있고, RuVectorCognitum Seed 위에서 동작합니다. 클라우드 의존 없이 엣지에서 학습과 추론을 모두 수행하며, 모든 측정값은 Ed25519 기반 witness chain으로 암호학적으로 서명됩니다. Home Assistant 통합 문서Matter 브리지(ADR-122) 를 통해 Apple Home, Google Home, Alexa, SmartThings와 직접 연동되며, 노드 하나당 11개의 원시 신호와 10개의 추론된 의미 상태(누군가 자고 있음, 잠재적 위기, 방 활성화, 노약자 무활동 이상, 회의 중, 욕실 점유, 낙상 위험 상승, 침대 이탈, 무동작, 다중 룸 이동 등) 등 21개 엔터티와 3개의 Home Assistant 블루프린트를 함께 제공합니다.

RuView의 동작 원리와 전체 파이프라인

RuView의 신호 처리 파이프라인은 README의 "How It Works" 섹션에 한 장의 흐름도로 정리되어 있습니다. WiFi 라우터가 내보내는 전파가 사람의 몸에 부딪혀 산란되면, ESP32 메쉬가 채널 1·6·11에서 CSI를 캡처하고, 신호 처리·자기 학습 인코더·신경망을 차례로 거쳐 포즈와 생체 신호로 변환됩니다.

각 단계는 다음과 같이 이어집니다.

  • 다중 대역 융합(Multi-Band Fusion): 3개 채널 × 56개 서브캐리어를 합쳐 링크당 168개의 가상 서브캐리어를 만들어 해상도를 확보합니다.
  • 다중 정적 융합(Multistatic Fusion): N×(N-1) 링크에 어텐션 가중을 적용해 여러 관측 지점에서의 신호를 하나의 임베딩으로 묶습니다.
  • 간섭성 게이트(Coherence Gate): 잡음이 큰 측정값을 거르고, 며칠 동안 재튜닝 없이도 안정적으로 동작하게 합니다.
  • 신호 처리: Hampel 필터, SpotFi, Fresnel 영역 모델, BVP(혈류량 파형), 스펙트로그램을 적용해 깨끗한 특징을 추출합니다.
  • AI 백본(RuVector): 어텐션·그래프 알고리즘·압축·필드 모델을 묶은 신호 처리 계층입니다.
  • 시그널 라인 프로토콜(CRV): gestalt → sensory → topology → coherence → search → model의 6단계 게슈탈트 처리 파이프라인입니다.
  • 출력: 실시간 포즈(17 키포인트), 호흡·심박, 룸 핑거프린트, 드리프트 경보가 산출됩니다.

이 흐름은 ADR-024(자기 지도 CSI 임베딩 모델)ADR-027(교차 환경 도메인 일반화 MERIDIAN) 으로 보강되어, 카메라 정답 없이도 부트스트랩이 가능하고 학습한 방 외의 환경에서도 동작하도록 설계되어 있습니다.

RuView의 주요 감지 기능

RuView가 CSI 신호에서 추출하는 신호와 적용된 처리 기법은 README 상단의 기능 표 에 정리되어 있습니다. 자주 쓰이는 항목만 옮기면 다음과 같습니다.

  • 호흡 측정(Breathing rate): wrapped phase에 0.1–0.5 Hz 대역 필터와 circular variance, zero-crossing BPM을 적용해 6–30 BPM 범위를 실시간 추정합니다.
  • 심박 측정(Heart rate): 0.8–2.0 Hz 대역 필터와 zero-crossing 알고리즘으로 40–120 BPM 범위를 실시간 추정합니다.
  • 존재 감지(Presence detection): Hugging Face에 공개된 학습 헤드와, 모델 없이 동작하는 phase-variance 폴백을 함께 제공합니다. 약 30초의 환경 캘리브레이션 후 1ms 안에 추정합니다.
  • CSI 임베딩(CSI embeddings): 128차원 contrastive 인코더이며, 4비트 양자화 변형은 8 KB 안에 들어갑니다. Apple M4 Pro 기준 초당 164,183개의 임베딩을 생성합니다.
  • 17 키포인트 포즈 추정(Pose estimation): Candle 런타임 위에서 pose_v1.safetensors 를 로드하는 cog-pose-estimation 모듈 로, Raspberry Pi 5 기준 콜드 스타트가 8.4ms 라고 ADR-101 에 명시되어 있습니다.
  • 낙상 감지(Fall detection): phase-acceleration 임계치와 3프레임 디바운스, 5초 쿨다운을 결합해 200ms 이내의 감지를 목표로 합니다.
  • 다중 인원 카운팅: 적응형 P95 정규화와 런타임 조정 가능한 dedup factor를 사용하며, occupancy-zones, elevator-count, queue-length, customer-flow, clean-room, person-matching 같은 학습된 카운터를 별도 Cog로 제공합니다.
  • 벽 너머 감지(Through-wall sensing): Fresnel 영역 기하와 multipath 모델을 사용해 신호 조건에 따라 약 5m 까지의 감지를 지원합니다.
  • 다중 주파수 메쉬: 6개 대역을 채널 호핑하고 TDM 슬롯 스케줄링으로 합치는 ADR-029 구조로 센싱 대역폭을 3배 확장합니다.
  • 3D 포인트 클라우드 융합: MiDaS의 카메라 깊이, WiFi CSI, mmWave 레이더를 22ms 파이프라인으로 묶어 한 프레임당 19,000개 이상의 점을 생성합니다.

RuView는 카메라 정답 없이 자체 학습한 단계의 PCK@20이 약 2.5%이며, 카메라 정답으로 보강한 학습이 35%+ 를 목표로 진행 중이지만 ADR-079 의 P7–P9 단계가 아직 완료되지 않았다고 자체 명시하고 있습니다. RuView는 "Beta Software — Under active development. APIs and firmware may change" 라고 README 상단에 경고를 박아 두었으며, ESP32-C3와 1세대 ESP32는 단일 코어로 인해 CSI DSP가 불가능해 지원 대상에서 제외됩니다.

RuView의 자기 지도 학습과 모델 구성

RuView는 카메라나 라벨 없이 raw CSI 데이터만으로도 부트스트랩이 가능한 자기 지도(self-supervised) 학습 파이프라인 을 핵심 자산으로 삼고 있습니다. WiFi 신호를 128차원 핑거프린트로 변환하는 contrastive 인코더는 60,000 프레임 / 61만 contrastive triplet에 대해 1,220만 스텝을 학습했으며, 검증 세트에서 존재 감지 정확도 100% 를 보고합니다.

전체 모델은 ESP32 한 대의 520 KB 메모리 가운데 55 KB만 차지하도록 설계되어 있습니다.

구성 요소 파라미터 ESP32 메모리
Transformer 백본 ~28,000 28 KB
임베딩 프로젝션 헤드 ~25,000 25 KB
방별 MicroLoRA 어댑터 ~1,800 2 KB
합계 ~55,000 55 KB

각 방에 1,792개 파라미터의 MicroLoRA 어댑터를 끼우는 방식으로 환경에 적응하며, EWC++ 정규화로 기존에 학습한 지식을 보존합니다. 결과적으로 새 공간에 배포하면 약 10분 안에 학습이 완료된다고 ADR-024 는 안내합니다. 핑거프린트 인덱스는 env_fingerprint(방 식별), activity_pattern(활동 분류), temporal_baseline(이상 탐지), person_track(개인 재식별) 네 종류로 구분돼 검색·분류·이상 탐지에 그대로 활용됩니다.

RuView의 엣지 모듈 카탈로그

RuView는 단일 도구가 아니라 105개 엣지 모듈(Cog)로 구성된 카탈로그 를 함께 배포합니다. 각 모듈은 약 400 KB 내외의 서명된 바이너리로, Cognitum-V0 어플라이언스에서 WiFi-DensePose 센싱 스택과 나란히 실행됩니다. 카탈로그는 OTA로 갱신되고, 모든 바이너리는 ADR-100 의 Ed25519 서명으로 검증된 뒤에 설치됩니다.

카탈로그는 헬스(14), 보안(14), 빌딩(11), 리테일(7), 산업(7), 연구(12), AI(15), 스웜(11), 시그널(6), 네트워크(1), 개발자(7)의 11개 도메인으로 나뉩니다. 대표적인 모듈로는 수면 무호흡을 감지하는 sleep-apnea (4 KB), 심박 부정맥을 잡는 cardiac-arrhythmia (8 KB), 보행 분석으로 낙상 위험을 점수화하는 gait-analysis (12 KB), 그리고 신호 재생·인젝션 공격을 차단하는 prompt-shield (10 KB) 가 있습니다. 모든 모듈은 OTA 레지스트리(/api/v1/edge/registry, ADR-102)에서 받아와 어플라이언스에 설치할 수 있습니다.

RuView의 설치 및 사용법

가장 빠른 평가는 시뮬레이션 데이터가 포함된 Docker 이미지를 사용하는 방법입니다.

docker pull ruvnet/wifi-densepose:latest
docker run -p 3000:3000 ruvnet/wifi-densepose:latest
# http://localhost:3000 접속

실측 데이터를 다루려면 ESP32-S3 보드(약 $9)에 firmware/esp32-csi-node 펌웨어를 적재하고 WiFi 자격증명을 프로비저닝합니다.

python -m esptool --chip esp32s3 --port COM9 --baud 460800 \
  write_flash 0x0 bootloader.bin 0x8000 partition-table.bin \
  0xf000 ota_data_initial.bin 0x20000 esp32-csi-node.bin

python firmware/esp32-csi-node/provision.py --port COM9 \
  --ssid "YourWiFi" --password "secret" --target-ip 192.168.1.20

WiFi 6 / 802.15.4 연구용으로는 ESP32-C6 보드를 같은 펌웨어로 빌드할 수 있습니다. 보드 추가에 따른 변경 사항은 ADR-110 에 정리되어 있습니다.

cd firmware/esp32-csi-node
idf.py set-target esp32c6 && idf.py build
idf.py -p COM6 flash

Python 패키지는 PyPI에서 동일한 PyO3 휠로 배포됩니다. asyncio WebSocket과 MQTT 클라이언트가 필요하면 [client] extras를 함께 설치합니다.

pip install ruview            # 또는 pip install wifi-densepose
pip install "ruview[client]"   # WebSocket / MQTT 클라이언트 포함
from ruview import BreathingExtractor, HeartRateExtractor
from ruview.client import SensingClient, RuViewMqttClient

Hugging Face에서 사전 학습 모델을 받을 때는 huggingface_hub 를 사용합니다.

pip install huggingface_hub
huggingface-cli download ruvnet/wifi-densepose-pretrained \
  --local-dir models/wifi-densepose-pretrained

이때 사전 학습 모델은 JSONL 형식의 RVF로 배포되며, Python 학습/추론 경로(safetensors) 는 그대로 사용할 수 있지만 라이브 센싱 서버는 아직 JSONL 컨테이너를 파싱하지 못합니다. 라이브 파이프라인을 돌릴 때는 --model 옵션 없이 휴리스틱 모드로 실행하라고 README의 가이드 는 안내합니다. 양자화 변형은 model-q2.bin(4 KB), model-q4.bin(8 KB, 권장), model-q8.bin(16 KB), model.safetensors(48 KB) 의 네 종류가 함께 들어 있습니다.

RuView의 Claude Code·Codex 플러그인

RuView는 온보딩, ESP32 펌웨어 빌드/플래시, 프로비저닝, 센싱 앱 실행, 모델 학습, 다중 정적 센싱, 검증까지의 워크플로를 9개 스킬, 7개 /ruview-* 명령, 3개 에이전트로 묶은 Claude Code 플러그인 을 함께 배포합니다. 마켓플레이스 매니페스트는 저장소 루트의 .claude-plugin/marketplace.json 입니다.

# Claude Code 안에서 마켓플레이스에 추가 후 설치
/plugin marketplace add ruvnet/RuView
/plugin install ruview@ruview

# 또는 로컬 클론에서 단발 실행
claude --plugin-dir ./plugins/ruview

ruview-start(온보딩), ruview-flash(펌웨어 빌드/플래시), ruview-provision(WiFi·메쉬 슬롯 설정), ruview-app(존재 감지·생체 신호·포즈·수면·MAT·포인트 클라우드 실행), ruview-train(모델 학습/평가/배포), ruview-advanced(다중 정적·토모그래피), ruview-verify(테스트·결정적 증명·witness 번들) 7개 명령이 매핑돼 있습니다. Codex CLI 사용자는 plugins/ruview/codex/prompts/*.md~/.codex/prompts/ 로 복사하면 동일한 명령을 사용할 수 있습니다.

RuView의 라이선스

RuView는 MIT 라이선스 로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.

:house: RuView 공식 홈페이지

:github: RuView 프로젝트 GitHub 저장소

:hugs: RuView 사전 학습 모델 다운로드

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck: