WiFi穿墙看人:一个把科研做成产品的硬核开源项目
wifi-densepose 用普通Mesh路由器+CSI信号实现隔墙实时人体姿态估计,Python版22FPS,Rust重写后达54,000 FPS。支持FastAPI服务、WebSocket流式推送、医疗/健身领域配置隔离,工程规范堪比SRE白皮书。

嘿,各位老铁,我是周小码——一个被Spring Boot的自动配置绕晕过、被Hibernate二级缓存坑哭过、但依然在Java生态里摸爬滚打8年的后端老兵。
今天不聊JVM调优,也不讲分布式事务,咱们来点硬核又带感的:用WiFi穿墙看人!
没错,就是这个 repo —— wifi-densepose。它不是科幻片预告,也不是实验室PPT,而是一个已上生产、有Docker镜像、有PyPI包、有100%测试覆盖率、甚至还有Rust重写版的真实系统。我第一眼看到描述里那句 "real-time full-body tracking through walls using commodity mesh routers"(用普通家用Mesh路由器,隔墙实时全身追踪)时,手里的保温杯差点没拿稳。
这玩意儿到底怎么工作的?
它不靠摄像头,而是“听”WiFi信号——准确说是解析 Channel State Information (CSI)。
CSI是Wi-Fi设备在MIMO通信中记录的信道复数响应,包含每个子载波上的幅度与相位信息。当人体在WiFi信号场中移动,身体组织(尤其是含水肌肉)会反射、散射、吸收电磁波,导致CSI数据产生微小但可建模的扰动——这种扰动具有典型的微多普勒效应(micro-Doppler effect),就像雷达探测旋转螺旋桨叶片时产生的频谱边带一样。wifi-densepose 的核心,就是把原始CSI时间序列 → 经过相位解缠、噪声抑制、时频变换 → 输入轻量化DensePose神经网络头 → 输出17个关键点(COCO格式)的3D空间坐标。
这不是魔法,是物理+信号处理+AI的三重嵌套工程:
- 底层驱动层:需Intel 5300/7260或Atheros AR9300系列网卡,通过
nexmon_csi或intel-csi-tool提取原始CSI; - 信号预处理层:相位解缠(unwrap)、去直流偏移、滑动窗口FFT、STFT时频图生成;
- 模型推理层:PyTorch实现的MobilePoseNet变体,输入为(30, 30, 30) STFT立方体,输出为17×3坐标+置信度;
- 系统集成层:FastAPI + WebSocket + 多目标ID关联(IOU-KF融合)。
整个架构是清晰的六层流水线:
CSI采集层 → 相位清洗器 → DensePose神经网络头 → 多目标追踪器 → REST/WebSocket/API网关 → 分析引擎
更绝的是,它连“灾难救援模块”(WiFi-Mat)都单独拆出来做了DDD建模,还写了ADR(架构决策记录)——这哪是开源项目?这是在写IEEE论文附录啊!
安装?就一行
bash
pip install wifi-densepose
比Spring Boot启动还干净。它用PEP 508可选依赖机制,把复杂性藏得严严实实:
bash
pip install wifi-densepose[gpu] # 绑定CUDA 12.1 + cuDNN 8.9,自动安装torch==2.3.0+cu121
pip install wifi-densepose[dev] # 拉下black、mypy、pytest-benchmark、adr-tools全套
四行代码,跑通全流程
python
from wifi_densepose import WiFiDensePose
system = WiFiDensePose() # 自动加载config/.env + 默认模型权重
system.start() # 启动CSI采集线程 + 模型warmup + WebSocket server
poses = system.get_latest_poses() # 非阻塞,返回list[PersonPose]
print(f"Detected {len(poses)} persons")
system.stop() # 清理资源,关闭所有后台线程
注意 PersonPose 是一个dataclass:
python
@dataclass
class PersonPose:
id: int
keypoints: np.ndarray # shape=(17, 3), [x, y, z] in meters, z为深度估计
confidence: float # 整体姿态置信度
bbox: Tuple[float, float, float, float] # [x1, y1, x2, y2] in CSI pixel space
timestamp_ns: int
这不是Demo玩具。它背后跑的是FastAPI服务(开箱即用/docs Swagger UI),支持WebSocket流式推送——这才是真正的“实时”:
python
import asyncio
import websockets
import json
async def stream_poses():
uri = "ws://localhost:8000/ws/pose/stream"
async with websockets.connect(uri) as websocket:
while True:
data = await websocket.recv()
poses = json.loads(data)
print(f"Received poses: {len(poses['persons'])} persons detected")
# 示例输出:{"persons": [{"id": 1, "keypoints": [[1.2, 0.8, 2.1], ...], "confidence": 0.92}]}
asyncio.run(stream_poses())
性能?别谈优化,这是降维打击
官方基准测试(Intel i9-13900K + RTX 4090 + ASUS AX6000):
- Python版:平均延迟 45.2ms(≈22FPS),内存占用 500MB;
- Rust重写版(
wifi-densepose-corecrate):延迟 18.47μs,快了 810倍,内存压到 100MB,吞吐量拉到 54,000 FPS。
Rust版不是简单移植,而是重构了整个数据流:
- 用
ndarray替代NumPy,零拷贝共享CSI buffer; rayon并行化STFT计算;tch绑定libtorch C++ API,避免Python GIL;- WebSocket使用
tokio-tungstenite,单连接吞吐>12k msg/s。
配置?拒绝YAML地狱
它分三层控制:
.env:CSI_SOURCE=intel5300,GPU_ACCELERATION=true,MOCK_HARDWARE=true;- Domain config:
config/healthcare.yaml控制医疗场景行为; - 运行时注入:
python
from wifi_densepose.config import Settings
config = Settings(
domain="healthcare",
detection=Settings.Detection(confidence_threshold=0.85),
privacy=Settings.Privacy(anonymize_data=True, data_retention_days=30)
)
system = WiFiDensePose(config=config)
踩坑指南:硬件和认知门槛
硬件门槛真实存在:
- ✅ 支持:Intel 5300/7260(Linux需
iwlwifi固件补丁)、Atheros AR9300(需ath9k_htc驱动); - ❌ 不支持:绝大多数笔记本内置WiFi(Realtek/Broadcom/MediaTek);
- 📋 README Hardware Setup章节用表格列清每款路由器的固件版本、CSI提取命令、校准流程——诚实得可爱。
领域知识鸿沟?它用MOCK_HARDWARE=true环境变量直接生成合成CSI数据流,让你在MacBook上也能跑通端到端测试,连pytest --benchmark-only都能跑出稳定FPS曲线。
如果是我来用?
- 养老院无感跌倒监测:免装摄像头,隐私合规,
/api/v1/alert/fallWebhook直连钉钉机器人; - 智慧健身房动作分析:它预留了
rep_count(次数)、form_score(动作分)、joint_angle_velocity字段,深蹲/硬拉/卧推全链路可量化; - 灾难救援:WiFi-Mat模块专为废墟场景设计,支持多跳Mesh组网、低带宽UDP传输、断网本地缓存。
这不是又一个玩具项目。当你看到README里那句 "Vital Signs Detection: Breathing (4-60 BPM), heartbeat via micro-Doppler",你就知道——这是一束正在穿透墙壁、照进现实的光。