WiFi DensePose
See through walls with WiFi. No cameras. No wearables. Just radio waves.
WiFi DensePose turns commodity WiFi signals into real-time human pose estimation, vital sign monitoring, and presence detection — all without a single pixel of video. By analyzing Channel State Information (CSI) disturbances caused by human movement, the system reconstructs body position, breathing rate, and heartbeat using physics-based signal processing and machine learning.

| What |
How |
Speed |
| Pose estimation |
CSI subcarrier amplitude/phase → DensePose UV maps |
54K fps (Rust) |
| Breathing detection |
Bandpass 0.1-0.5 Hz → FFT peak |
6-30 BPM |
| Heart rate |
Bandpass 0.8-2.0 Hz → FFT peak |
40-120 BPM |
| Presence sensing |
RSSI variance + motion band power |
< 1ms latency |
| Through-wall |
Fresnel zone geometry + multipath modeling |
Up to 5m depth |
Hardware options for live CSI capture:
| Option |
Hardware |
Cost |
Capabilities |
| ESP32 Mesh (recommended) |
3-6x ESP32-S3 + WiFi router |
~$54 |
Presence, motion, breathing, heartbeat |
| Research NIC |
Intel 5300 / Atheros AR9580 |
~$50-100 |
Full CSI with 3x3 MIMO |
| Any WiFi |
Windows/Linux laptop |
$0 |
RSSI-based presence and motion |
No hardware? Verify the pipeline with the deterministic reference signal: python v1/data/proof/verify.py
🚀 Key Features
| Feature |
Description |
| Privacy-First |
No cameras — uses WiFi signals for pose detection |
| Real-Time |
Sub-100µs/frame (Rust), 11,665 fps vital sign benchmark |
| Vital Signs |
Contactless breathing (6-30 BPM) and heart rate (40-120 BPM) |
| Multi-Person |
Simultaneous tracking of up to 10 individuals |
| Docker Ready |
docker pull ruvnet/wifi-densepose:latest (132 MB) |
| RVF Portable Models |
Single-file .rvf containers with progressive loading |
| 542+ Tests |
Comprehensive Rust test suite, zero mocks |
📡 ESP32-S3 Hardware Pipeline (ADR-018) — 20 Hz CSI streaming, flash & provision
| Metric |
Measured |
| Frame rate |
~20 Hz sustained |
| Subcarriers |
64 / 128 / 192 (LLTF, HT, HT40) |
| Latency |
< 1ms (UDP loopback) |
| Presence detection |
Motion score 10/10 at 3m |
See firmware/esp32-csi-node/README.md and Tutorial #34.
🦀 Rust Implementation (v2) — 810x faster, 54K fps pipeline
Performance Benchmarks (Validated)
| Operation |
Python (v1) |
Rust (v2) |
Speedup |
| CSI Preprocessing (4x64) |
~5ms |
5.19 µs |
~1000x |
| Phase Sanitization (4x64) |
~3ms |
3.84 µs |
~780x |
| Feature Extraction (4x64) |
~8ms |
9.03 µs |
~890x |
| Motion Detection |
~1ms |
186 ns |
~5400x |
| Full Pipeline |
~15ms |
18.47 µs |
~810x |
| Vital Signs |
N/A |
86 µs |
11,665 fps |
| Resource |
Python (v1) |
Rust (v2) |
| Memory |
~500 MB |
~100 MB |
| Docker Image |
569 MB |
132 MB |
| Tests |
41 |
542+ |
| WASM Support |
No |
Yes |
💓 Vital Sign Detection (ADR-021) — Breathing and heartbeat via FFT
| Capability |
Range |
Method |
| Breathing Rate |
6-30 BPM (0.1-0.5 Hz) |
Bandpass filter + FFT peak detection |
| Heart Rate |
40-120 BPM (0.8-2.0 Hz) |
Bandpass filter + FFT peak detection |
| Sampling Rate |
20 Hz (ESP32 CSI) |
Real-time streaming |
| Confidence |
0.0-1.0 per sign |
Spectral coherence + signal quality |
See ADR-021.
📡 WiFi Scan Domain Layer (ADR-022) — 8-stage RSSI pipeline for Windows WiFi
| Stage |
Purpose |
| Predictive Gating |
Pre-filter scan results using temporal prediction |
| Attention Weighting |
Weight BSSIDs by signal relevance |
| Spatial Correlation |
Cross-AP spatial signal correlation |
| Motion Estimation |
Detect movement from RSSI variance |
| Breathing Extraction |
Extract respiratory rate from sub-Hz oscillations |
| Quality Gating |
Reject low-confidence estimates |
| Fingerprint Matching |
Location and posture classification via RF fingerprints |
| Orchestration |
Fuse all stages into unified sensing output |
See ADR-022 and Tutorial #36.
🚨 WiFi-Mat: Disaster Response — Search & rescue, START triage, 3D localization
| Feature |
Description |
| Vital Signs |
Breathing (4-60 BPM), heartbeat via micro-Doppler |
| 3D Localization |
Position estimation through debris up to 5m |
| START Triage |
Automatic Immediate/Delayed/Minor/Deceased classification |
| Real-time Alerts |
Priority-based notifications with escalation |
📦 RVF Model Container — Single-file deployment with progressive loading
| Property |
Detail |
| Format |
Segment-based binary (magic 0x52564653) with 64-byte headers |
| Progressive Loading |
Layer A <5ms, Layer B 100ms-1s, Layer C full graph |
| Signing |
Ed25519 training proofs for verifiable provenance |
| Quantization |
f32/f16/u8 via rvf-quant with SIMD distance |
| CLI |
--export-rvf, --save-rvf, --load-rvf, --model |
See ADR-023.
🧬 Training & Fine-Tuning — MM-Fi/Wi-Pose pre-training, SONA adaptation
Three-tier data strategy:
- Pre-train on public datasets (MM-Fi, Wi-Pose) for cross-environment generalization
- Fine-tune with ESP32 data + camera pseudo-labels for environment-specific multipath
- SONA adaptation via micro-LoRA + EWC++ for continuous on-device learning
🔩 RuVector Crates — 11 vendored signal intelligence crates
| Crate |
Purpose |
ruvector-core |
VectorDB, HNSW index, SIMD distance, quantization |
ruvector-attention |
Scaled dot-product, MoE, sparse attention |
ruvector-gnn |
Graph neural network, graph attention, EWC training |
ruvector-nervous-system |
PredictiveLayer, OscillatoryRouter, Hopfield |
ruvector-coherence |
Spectral coherence, HNSW health, Fiedler value |
ruvector-temporal-tensor |
Tiered temporal compression (8/7/5/3-bit) |
ruvector-mincut |
Subpolynomial dynamic min-cut |
ruvector-attn-mincut |
Attention-gated min-cut |
ruvector-solver |
Sparse Neumann solver O(sqrt(n)) |
ruvector-graph-transformer |
Proof-gated graph transformer |
ruvector-sparse-inference |
PowerInfer-style sparse execution |
See vendor/ruvector/ for full source.
🔬 SOTA Signal Processing (ADR-014) — 6 research-grade algorithms
| Algorithm |
Purpose |
Reference |
| Conjugate Multiplication |
Cancels CFO/SFO from raw CSI phase |
SpotFi (SIGCOMM 2015) |
| Hampel Filter |
Robust outlier removal using median/MAD |
Hampel (1974) |
| Fresnel Zone Model |
Physics-based breathing detection |
FarSense (MobiCom 2019) |
| CSI Spectrogram |
STFT time-frequency matrices |
Standard since 2018 |
| Subcarrier Selection |
Variance-ratio top-K ranking |
WiDance (MobiCom 2017) |
| Body Velocity Profile |
Domain-independent velocity x time |
Widar 3.0 (MobiSys 2019) |
📋 Table of Contents
🚀 Getting Started — Install, Docker, first API call
📡 Signal Processing & Sensing — From raw WiFi frames to vital signs
🧠 Models & Training — DensePose pipeline, RVF containers, SONA adaptation
🖥️ Usage & Configuration — CLI flags, API endpoints, hardware setup
| Section |
What You'll Learn |
| CLI Usage |
--export-rvf, --train, --benchmark, --source |
| Documentation |
Core docs, API overview, quick links |
| Hardware Setup |
Supported devices, physical placement, calibration |
| Configuration |
Environment variables, domain-specific configs |
⚙️ Development & Testing — 542+ tests, CI, deployment
| Section |
What You'll Learn |
| Testing |
542+ tests, hardware-free simulation, CI pipeline |
| Deployment |
Docker, docker-compose, production monitoring |
| Contributing |
Dev setup, code standards, review checklist |
📊 Performance & Benchmarks — Measured throughput, latency, resource usage
📄 Meta — License, acknowledgments, support
🏗️ System Architecture — End-to-end data flow from CSI to API
| Component |
Description |
| CSI Processor |
Extracts Channel State Information from WiFi signals (ESP32 or RSSI) |
| Signal Processor |
RuVector-powered phase sanitization, Hampel filter, Fresnel model |
| Graph Transformer |
GNN body-graph reasoning with cross-attention CSI-to-pose mapping |
| Vital Signs |
FFT-based breathing (0.1-0.5 Hz) and heartbeat (0.8-2.0 Hz) extraction |
| REST API |
Axum (Rust) or FastAPI (Python) for data access and control |
| WebSocket |
Real-time pose, sensing, and vital sign streaming |
| Analytics |
Fall detection, activity recognition, START triage |
📦 Installation — Guided installer, Docker, Rust, or Python
Guided Installer (Recommended)
The interactive installer detects your hardware, checks your environment, and builds the right profile automatically:
It walks through 7 steps:
- System detection — OS, RAM, disk, GPU
- Toolchain detection — Python, Rust, Docker, Node.js, ESP-IDF
- WiFi hardware detection — interfaces, ESP32 USB, Intel CSI debug
- Profile recommendation — picks the best profile for your hardware
- Dependency installation — installs what's missing
- Build — compiles the selected profile
- Summary — shows next steps and verification commands
Install Profiles
| Profile |
What it installs |
Size |
Requirements |
verify |
Pipeline verification only |
~5 MB |
Python 3.8+ |
python |
Full Python API server + sensing |
~500 MB |
Python 3.8+ |
rust |
Rust pipeline (~810x faster) |
~200 MB |
Rust 1.70+ |
browser |
WASM for in-browser execution |
~10 MB |
Rust + wasm-pack |
iot |
ESP32 sensor mesh + aggregator |
varies |
Rust + ESP-IDF |
docker |
Docker-based deployment |
~1 GB |
Docker |
field |
WiFi-Mat disaster response kit |
~62 MB |
Rust + wasm-pack |
full |
Everything available |
~2 GB |
All toolchains |
Non-Interactive Install
From Source (Rust — Primary)
From Source (Python)
Using pip (Python only)
Using Docker
Pre-built images are published on Docker Hub:
| Image |
Tag |
Size |
Ports |
ruvnet/wifi-densepose |
latest, rust |
132 MB |
3000 (REST), 3001 (WS), 5005/udp (ESP32) |
ruvnet/wifi-densepose |
python |
569 MB |
8765 (WS), 8080 (UI) |
Export RVF model package:
System Requirements
- Rust: 1.70+ (primary runtime — install via rustup)
- Python: 3.8+ (for verification and legacy v1 API)
- Operating System: Linux (Ubuntu 18.04+), macOS (10.15+), Windows 10+
- Memory: Minimum 4GB RAM, Recommended 8GB+
- Storage: 2GB free space for models and data
- Network: WiFi interface with CSI capability (optional — installer detects what you have)
- GPU: Optional (NVIDIA CUDA or Apple Metal)
🚀 Quick Start — First API call in 3 commands
1. Basic Setup
2. Start the System
3. Using the REST API
The API will be available at http://localhost:8000
4. Real-time Streaming
🖥️ CLI Usage — Server management, Rust sensing server flags
Rust Sensing Server (Primary)
| Flag |
Description |
--source |
Data source: auto, wifi, esp32, simulate |
--http-port |
HTTP port for UI and REST API (default: 8080) |
--ws-port |
WebSocket port (default: 8765) |
--udp-port |
UDP port for ESP32 CSI frames (default: 5005) |
--benchmark |
Run vital sign benchmark (1000 frames) and exit |
--export-rvf |
Export RVF container package and exit |
--load-rvf |
Load model config from RVF container |
--save-rvf |
Save model state on shutdown |
--model |
Load trained .rvf model for inference |
--progressive |
Enable progressive loading (Layer A instant start) |
--train |
Train a model and exit |
--dataset |
Path to dataset directory (MM-Fi or Wi-Pose) |
--epochs |
Training epochs (default: 100) |
Python Legacy CLI
WiFi DensePose provides a comprehensive command-line interface for easy system management, configuration, and monitoring.
CLI Installation
The CLI is automatically installed with the package:
Basic Commands
The WiFi-DensePose CLI provides the following commands:
Server Management
Configuration Commands
Configuration Management
Database Management
Background Tasks
REST API (Rust Sensing Server)
WebSocket: ws://localhost:8765/ws/sensing (real-time sensing + vital signs)
Hardware Support
| Hardware |
CSI |
Cost |
Guide |
| ESP32-S3 |
Native |
~$8 |
Tutorial #34 |
| Intel 5300 |
Firmware mod |
~$15 |
Linux iwl-csi |
| Atheros AR9580 |
ath9k patch |
~$20 |
Linux only |
| Any Windows WiFi |
RSSI only |
$0 |
Tutorial #36 |
Docs
🧪 Testing — 542+ tests, hardware-free simulation, CI
| Suite |
Tests |
What It Covers |
| sensing-server lib |
147 |
Graph transformer, trainer, SONA, sparse inference, RVF |
| sensing-server bin |
48 |
CLI integration, WebSocket, REST API |
| RVF integration |
16 |
Container build, read, progressive load |
| Vital signs integration |
18 |
FFT detection, breathing, heartbeat |
| wifi-densepose-signal |
83 |
SOTA algorithms, Doppler, Fresnel |
| wifi-densepose-mat |
139 |
Disaster response, triage, localization |
| wifi-densepose-wifiscan |
91 |
8-stage RSSI pipeline |
🚀 Deployment — Docker, docker-compose, production
Docker (Recommended)
Environment Variables
📊 Performance Metrics — Measured benchmarks
Rust Sensing Server
| Metric |
Value |
| Vital sign detection |
11,665 fps (86 µs/frame) |
| Full CSI pipeline |
54,000 fps (18.47 µs/frame) |
| Motion detection |
186 ns (~5,400x vs Python) |
| Docker image |
132 MB |
| Memory usage |
~100 MB |
| Test count |
542+ |
Python vs Rust
| Operation |
Python |
Rust |
Speedup |
| CSI Preprocessing |
~5 ms |
5.19 µs |
1000x |
| Phase Sanitization |
~3 ms |
3.84 µs |
780x |
| Feature Extraction |
~8 ms |
9.03 µs |
890x |
| Motion Detection |
~1 ms |
186 ns |
5400x |
| Full Pipeline |
~15 ms |
18.47 µs |
810x |
🤝 Contributing — Dev setup, code standards, PR process
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature)
- Commit your changes
- Push and open a Pull Request
📄 Changelog — Release history
v2.3.0 — 2026-03-01
- Docker images published —
ruvnet/wifi-densepose:latest (132 MB Rust) and :python (569 MB)
- 8-phase DensePose training pipeline (ADR-023) — Dataset loaders, graph transformer, trainer, SONA adaptation, sparse inference, RVF pipeline, server integration
--export-rvf CLI flag — Standalone RVF model package generation
--train CLI flag — Full training mode with cosine-scheduled SGD, PCK/OKS validation
- Vital sign detection (ADR-021) — FFT-based breathing and heartbeat extraction, 11,665 fps
- 542+ Rust tests — All passing, zero mocks
v2.2.0 — 2026-02-28
- Guided installer —
./install.sh with 7-step hardware detection
- 6 SOTA signal algorithms (ADR-014) — SpotFi, Hampel, Fresnel, spectrogram, subcarrier selection, BVP
- WiFi-Mat disaster response — START triage, scan zones, API endpoints — 139 tests
- ESP32 CSI hardware parser — Binary frame parsing with I/Q extraction — 28 tests
- WiFi scan domain layer (ADR-022) — 8-stage pure-Rust signal intelligence pipeline
- Security hardening — 10 vulnerabilities fixed
v2.1.0 — 2026-02-28
- RuVector RVF integration — ADR-002 through ADR-013
- ESP32 CSI sensor mesh — $54 starter kit with 3-6 ESP32-S3 nodes
- Three.js visualization — 3D body model with WebSocket streaming
- CI verification pipeline — Determinism checks and unseeded random scan
📄 License
MIT License — see LICENSE for details.
📞 Support
GitHub Issues | Discussions | PyPI
WiFi DensePose — Privacy-preserving human pose estimation through WiFi signals.