WiFi-DensePose 使用指南
· 阅读需 16 分钟
基于 WiFi 信号的隐私安全人体感知系统
无需摄像头、无需穿戴设备、无需互联网——仅靠 WiFi 信号实现穿墙人体检测、姿态估计、呼吸/心率监测。
一、项目简介
WiFi-DensePose(项目代号 π RuView)是一个边缘 AI 感知系统,利用 WiFi 信号实现人体感知。其核心原理是:WiFi 路由器发出的无线电波在遇到人体时会产生散射,通过分析信道状态信息(CSI)的变化,系统可以重建人体姿态、检测生命体征。
技术背景
该系统基于卡内基梅隆大学的 DensePose From WiFi 研究成果,将学术概念扩展为可实际部署的边缘系统。核心技术栈包括:
- RuVector:AI 信号处理引擎,包含注意力机制、图算法、稀疏求解器等
- RuvSense:多站感知融合框架,支持 360 度全覆盖
- SONA:自优化神经架构,支持设备端持续学习
与传统方案对比
| 特性 | WiFi-DensePose | 摄像头方案 | 穿戴设备方案 |
|---|---|---|---|
| 隐私保护 | ✅ 无图像,无视频 | ❌ 需要隐私协议 | ⚠️ 依赖佩戴 |
| 穿墙能力 | ✅ 可穿透墙壁 | ❌ 需要视线 | ❌ 仅接触式 |
| 黑暗环境 | ✅ 不受影响 | ⚠️ 需要红外 | ✅ 不受影响 |
| 部署成本 | ~¥50/区域 | ¥1500+/区域 | ¥200+/人 |
| 隐私法规 | ✅ 不受 GDPR 视频条款约束 | ❌ 需要合规处理 | ⚠️ 需要同意 |
二、核心功能
2.1 感知能力
| 功能 | 说明 | 性能 |
|---|---|---|
| 姿态估计 | 17 个 COCO 关键点的 3D 人体姿态 | 54,000 fps(Rust) |
| 呼吸检测 | 非接触式呼吸频率监测 | 6-30 BPM |
| 心率检测 | 非接触式心率监测 | 40-120 BPM |
| 存在感知 | 房间级人体存在检测 | < 1ms 延迟 |
| 穿墙感知 | 穿透墙壁、家具、废墟 | 最深 5 米 |
| 多人追踪 | 同时追踪多人,独立姿态和体征 | 每 AP 约 3-5 人 |
| 跌倒检测 | 自动检测跌倒事件 | 可配置灵敏度 |
2.2 智能特性
| 特性 | 说明 |
|---|---|
| 自学习 | 从原始 WiFi 数据自主学习,无需标注训练集 |
| 跨环境泛化 | 训练一次,部署到任何房间,无需重训练 |
| 跨视角融合 | 多传感器融合,消除盲点和深度模糊 |
| 自适应分类器 | 自动学习房间独特的信号特征 |
2.3 边缘智能模块
系统提供 65 个可热加载的 WASM 模块,直接运行在 ESP32 传感器上:
| 类别 | 模块示例 |
|---|---|
| 医疗健康 | 睡眠呼吸暂停、心律失常、步态分析、癫痫检测 |
| 安全防护 | 入侵检测、周界突破、徘徊检测、恐慌运动 |
| 智能建筑 | 暖通控制、照明分区、电梯计数、会议室管理 |
| 零售分析 | 队列长度、停留热力图、客流统计、翻台率 |
| 工业安全 | 叉车接近、密闭空间监测、结构振动 |
三、系统架构
WiFi 路由器 → 电波穿过房间 → 碰到人体 → 散射
↓
ESP32 网格(3-6 节点)采集 CSI 信号
↓
信号处理:Hampel 滤波 → SpotFi 相位校正 → 菲涅尔区建模
↓
AI 骨干(RuVector):注意力网络 → 图算法 → 压缩表示
↓
神经网络 → 17 个身体关键点 + 生命体征
↓
输出:REST API / WebSocket / Web UI
组件说明
| 组件 | 功能 |
|---|---|
| 感知服务器 | Rust 实现,Axum 框架,提供 REST API 和 WebSocket |
| 信号处理 | 6 种 SOTA 算法(SpotFi、Hampel、菲涅尔等) |
| AI 骨干 | RuVector 引擎,注意力机制 + 图算法 |
| Web UI | Three.js 3D 可视化,实时姿态展示 |
| ESP32 固件 | CSI 采集 + 设备端处理 + WASM 模块运行 |
四、环境要求
软件要求
| 软件 | 最低版本 | 说明 |
|---|---|---|
| Docker | 20.0+ | 推荐部署方式 |
| Python | 3.10+ | 用于验证和旧版 API |
| Rust | 1.70+ | 源码编译需要 |
| 操作系统 | Windows 10+、macOS 10.15+、Ubuntu 18.04+ | — |
| 内存 | 4 GB | 推荐 8 GB+ |
| 磁盘 | 2 GB 可用 | 模型和数据存储 |
硬件要求(可选)
| 硬件 | 成本 | 能力 |
|---|---|---|
| ESP32-S3 开发板(3-6 个) | ~¥50/个 | 完整 CSI:姿态、呼吸、心跳、存在 |
| Intel 5300 / Atheros 网卡 | ¥300-700 | 完整 CSI,3x3 MIMO(仅 Linux) |
| 任意 WiFi 笔记本 | ¥0 | 仅 RSSI:粗略存在和运动检测 |
无硬件也可运行:系统默认使用模拟数据源,可以体验完整功能。
五、部署方法
方式一:Docker 部署(推荐)
这是最简单的部署方式,无需安装任何工具链。
步骤 1:拉取镜像
docker pull ruvnet/wifi-densepose:latest
镜像大小约 132 MB,支持 amd64 和 arm64 架构。
步骤 2:启动容器
docker run -d --name wifi-densepose \
-p 3000:3000 \
-p 3001:3001 \
-p 5005:5005/udp \
-e RUVIEW_ALLOW_UNAUTHENTICATED=1 \
ruvnet/wifi-densepose:latest
端口说明:
| 端口 | 协议 | 用途 |
|---|---|---|
| 3000 | TCP | REST API + Web UI |
| 3001 | TCP | WebSocket 实时流 |
| 5005 | UDP | ESP32 CSI 数据接收 |
步骤 3:验证服务
# 健康检查
curl http://localhost:3000/health
# 服务器信息
curl http://localhost:3000/api/v1/info
# 生命体征
curl http://localhost:3000/api/v1/vital-signs
# 姿态估计
curl http://localhost:3000/api/v1/pose/current
步骤 4:打开浏览器
访问 http://localhost:3000 即可看到 Web UI。
Windows 端口被占用时
如果 3000 端口被占用,可以映射到其他端口:
docker run -d --name wifi-densepose \
-p 3010:3000 \
-p 3011:3001 \
-p 5005:5005/udp \
-e RUVIEW_ALLOW_UNAUTHENTICATED=1 \
ruvnet/wifi-densepose:latest
Docker Compose 部署
cd docker
docker compose up -d
方式二:源码编译部署(Rust)
适合需要自定义修改或追求最佳性能的场景。
步骤 1:安装 Rust
# Windows/macOS/Linux
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
步骤 2:克隆并编译
git clone https://github.com/ruvnet/RuView.git
cd RuView/rust-port/wifi-densepose-rs
# 编译(约 5-10 分钟)
cargo build --release
# 运行测试(1,400+ 测试)
cargo test --workspace --no-default-features
步骤 3:启动服务
# 模拟数据源(无需硬件)
./target/release/sensing-server --source simulate --http-port 3000 --ws-port 3001
# ESP32 数据源
./target/release/sensing-server --source esp32 --udp-port 5005 --http-port 3000
# Windows WiFi RSSI
./target/release/sensing-server --source wifi --http-port 3000
CLI 参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
--source | 数据源:auto、wifi、esp32、simulate | auto |
--http-port | HTTP 服务端口 | 8080 |
--ws-port | WebSocket 端口 | 8765 |
--udp-port | ESP32 CSI 数据接收端口 | 5005 |
--model | 加载训练好的 .rvf 模型 | — |
--train | 训练模式 | — |
--dataset | 数据集路径 | — |
--epochs | 训练轮次 | 100 |
--benchmark | 运行性能基准测试 | — |
--export-rvf | 导出 RVF 模型包 | — |
方式三:Python 旧版部署
适合需要使用 Python API 或进行二次开发的场景。
步骤 1:安装依赖
cd v1
pip install -r requirements-lock.txt
pip install -e .
步骤 2:启动服务
# 启动 API 服务器
python -m src.main
# 或使用 CLI
wifi-densepose start
步骤 3:运行测试
cd v1
python -m pytest tests/ -v
六、使用说明
Web UI 可视化
访问 http://localhost:3000 打开内置的 Three.js 可视化 界面,包含:
- 3D 人体骨架:17 个 COCO 关键点的实时渲染
- 信号幅度热力图:子载波幅度的可视化
- 相位图:CSI 相位变化的实时展示
- 生命体征面板:呼吸频率和心率的实时显示
REST API 接口
健康检查
curl http://localhost:3000/health
返回示例:
{
"status": "ok",
"source": "simulated",
"clients": 0,
"tick": 12345
}
获取生命体征
curl http://localhost:3000/api/v1/vital-signs
返回示例:
{
"breathing_rate_bpm": 16.2,
"heart_rate_bpm": 72.1,
"breathing_confidence": 0.87,
"heartbeat_confidence": 0.63,
"signal_quality": 0.49
}
获取姿态估计
curl http://localhost:3000/api/v1/pose/current
返回示例:
{
"persons": [
{
"id": 0,
"confidence": 0.9,
"keypoints": [
{"name": "nose", "x": 329.3, "y": 153.7, "z": -0.31, "confidence": 0.0},
{"name": "left_eye", "x": 323.8, "y": 142.3, "z": -0.31, "confidence": 0.0},
{"name": "right_eye", "x": 334.4, "y": 145.1, "z": -0.31, "confidence": 0.0}
],
"position": [-1.2, 0.0, -0.5],
"zone": "tracked"
}
],
"total_persons": 1
}
获取感知数据
curl http://localhost:3000/api/v1/sensing/latest
服务器信息
curl http://localhost:3000/api/v1/info
返回示例:
{
"backend": "rust",
"version": "0.3.3",
"environment": "production",
"features": {
"pose_estimation": true,
"vital_signs": true,
"signal_processing": true,
"streaming": true,
"wifi_sensing": true
}
}
完整 API 端点列表
| 方法 | 端点 | 说明 |
|---|---|---|
| GET | /health | 健康检查 |
| GET | /api/v1/info | 服务器信息 |
| GET | /api/v1/sensing/latest | 最新感知帧 |
| GET | /api/v1/vital-signs | 生命体征(呼吸+心率) |
| GET | /api/v1/pose/current | 姿态估计(17 关键点) |
| GET | /api/v1/bssid | 多 BSSID 注册表 |
| GET | /api/v1/model/layers | 渐进加载状态 |
| GET | /api/v1/model/sona/profiles | SONA 环境画像 |
| POST | /api/v1/model/sona/activate | 激活 SONA 画像 |
| GET | /api/v1/models | 可用模型列表 |
| POST | /api/v1/models/load | 加载模型 |
| GET | /api/v1/recording/list | 录制会话列表 |
| POST | /api/v1/recording/start | 开始录制 CSI |
| POST | /api/v1/recording/stop | 停止录制 |
| GET | /api/v1/train/status | 训练状态 |
| POST | /api/v1/train/start | 开始训练 |
| POST | /api/v1/adaptive/train | 训练自适应分类器 |
WebSocket 实时流
实时感知数据通过 WebSocket 推送,适合需要低延迟数据的应用场景。
连接地址
ws://localhost:3001/ws/sensing
或使用 HTTP 端口(推荐):
ws://localhost:3000/ws/sensing
Python 示例
import asyncio
import websockets
import json
async def stream():
uri = "ws://localhost:3001/ws/sensing"
async with websockets.connect(uri) as ws:
async for message in ws:
data = json.loads(message)
persons = data.get("persons", [])
vitals = data.get("vital_signs", {})
print(f"人数: {len(persons)}, "
f"呼吸: {vitals.get('breathing_rate_bpm', 'N/A')} BPM")
asyncio.run(stream())
JavaScript 示例
const ws = new WebSocket("ws://localhost:3001/ws/sensing");
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log("人数:", data.persons?.length ?? 0);
console.log("呼吸:", data.vital_signs?.breathing_rate_bpm, "BPM");
};
ws.onerror = (err) => console.error("WebSocket 错误:", err);
curl 测试(需要安装 wscat)
npm install -g wscat
wscat -c ws://localhost:3001/ws/sensing
观测台可视化
项目提供了一个电影级的 Three.js 观测台界面,包含 5 个全息面板:
- 子载波流形:CSI 子载波的 3D 可视化
- 生命体征预言机:呼吸和心率的实时显示
- 存在热力图:房间内人员分布
- 相位星座:CSI 相位变化的星座图
- 收敛引擎:信号收敛状态
访问地址:http://localhost:3000/ui/observatory.html