WiFi穿墙看人:一个把科研做成产品的硬核开源项目

254 次阅读 0 点赞 0 评论 9 分钟原创开源项目

wifi-densepose 用普通Mesh路由器+CSI信号实现隔墙实时人体姿态估计,Python版22FPS,Rust重写后达54,000 FPS。支持FastAPI服务、WebSocket流式推送、医疗/健身领域配置隔离,工程规范堪比SRE白皮书。

#wifi-sensing # pose-estimation # privacy-preserving # rust # real-time # edge-ai
WiFi穿墙看人:一个把科研做成产品的硬核开源项目

嘿,各位老铁,我是周小码——一个被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_csiintel-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-core crate):延迟 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地狱

它分三层控制:

  • .envCSI_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/fall Webhook直连钉钉机器人;
  • 智慧健身房动作分析:它预留了rep_count(次数)、form_score(动作分)、joint_angle_velocity字段,深蹲/硬拉/卧推全链路可量化;
  • 灾难救援:WiFi-Mat模块专为废墟场景设计,支持多跳Mesh组网、低带宽UDP传输、断网本地缓存。

这不是又一个玩具项目。当你看到README里那句 "Vital Signs Detection: Breathing (4-60 BPM), heartbeat via micro-Doppler",你就知道——这是一束正在穿透墙壁、照进现实的光。

最后更新:2026-01-24T10:01:44

评论 (0)

发表评论

blog.comments.form.loading
0/500
加载评论中...