Hotdry.

Article

WiFi DensePose 工程实践:从射频信号到人体 17 关键点的实时估计

深入解析基于商品 WiFi CSI 信号的人体姿态估计系统,涵盖 WiFlow 模型架构、两种训练范式及边缘部署参数。

2026-04-20ai-systems

当我们谈论人体姿态估计时,摄像头、深度传感器、骨架追踪算法往往是第一反应。但有一类技术正在悄然改变游戏规则 ——基于 WiFi 信号的人体姿态估计(WiFi DensePose)。它不需要任何光学设备,不侵犯隐私,却能在某种程度上 “穿墙” 感知人体姿态。RuView 项目正是这一领域的工程化代表,本文将深入剖析其核心技术路径与落地参数。

一、为什么需要 WiFi DensePose?

传统视觉方案面临三大痛点:光照依赖、遮挡敏感、隐私争议。而 WiFi DensePose 利用无线电波在空间中的传播特性,当人体移动或呼吸时,电磁场会发生可测量的扰动。通过解析这些扰动信号,可以重建人体姿态 —— 无需一个像素的视频。

这一技术在以下场景具有独特价值:养老机构夜间看护(无摄像头侵犯隐私)、手术室生命体征监测(无传感器接触患者)、安防盲区探测(穿墙感知)、灾害救援(废墟下的生命迹象)。它本质上是将 WiFi 信号变成了分布式 “雷达”,而 DensePose 正是从这种雷达回波中提取人体骨架信息的技术路径。

二、核心技术架构:WiFlow 模型

WiFlow 是 RuView 实现 WiFi DensePose 的核心模型架构。其设计思路借鉴了计算机视觉中的姿态估计方法,但输入从图像换成了 WiFi CSI(Channel State Information)信号。整体架构包含三个关键组件:

TCN(Temporal Convolutional Network):负责时序特征提取。CSI 信号本质上是时间序列,TCN 通过多层因果卷积捕获多尺度时序模式。相比循环神经网络,TCN 具有更低的推理延迟和更好的并行能力。

Axial Attention(轴向注意力):分别对空间维度和时间维度进行注意力计算。这一设计源于 HRNet 等视觉模型的启发,但针对 CSI 的特性进行了调整 —— 空间轴对应不同子载波,时间轴对应采样窗口。轴向注意力可以在保持计算效率的同时捕获长程依赖。

Pose Decoder(姿态解码器):将编码后的特征向量映射到 17 个 COCO 关键点坐标。每个关键点包含 (x, y) 二维位置和对应的置信度分数。解码器还输出骨骼约束损失,确保相邻关键点之间的距离符合人体 anatomy 规律。

WiFlow 提供四种规模预设:lite(189K 参数)、small(474K 参数)、medium(800K 参数)和 full(7.7M 参数)。边缘部署推荐 lite 或 small 版本,服务器端可使用 medium/full 以获得更高精度。

三、两种训练范式:Camera-Free 与 Camera-Supervised

RuView 提供了两条训练路径,分别对应不同的数据获取条件:

无监督训练(Camera-Free):仅依赖 10 种传感器信号(PIR、RSSI 三角测量、子载波不对称性、振动、BME280 温湿度等),无需任何标注数据。模型通过自监督方式学习哪些信号模式对应人体姿态变化。训练时间约 84 秒(Apple M4 Pro),模型自动适应新环境。该方式的局限在于精度有限,PCK@20 接近 0%。

有监督训练(Camera-Supervised):利用 MediaPipe PoseLandmarker 同步采集 17 个 COCO 关键点真值,与 ESP32 CSI 数据对齐后进行监督学习。v0.7.0 版本引入的 Camera Ground-Truth Training 可将 PCK@20 提升至 92.9%,训练时间约 19 分钟。

有监督训练的关键步骤包括:使用 python scripts/collect-ground-truth.py --duration 300 --preview 同步采集摄像头和 CSI 数据;使用 node scripts/align-ground-truth.js 对齐时间窗口;通过 node scripts/train-wiflow-supervised.js --scale lite 启动训练。子载波选择采用方差排序的 top-K 策略,将 70 个子载波压缩至 35 个,减少 50% 输入维度的同时保留关键特征。

四、关键性能指标与阈值

工程落地需要关注以下量化指标:

指标 阈值 / 范围 说明
PCK@20 ≥ 92.9% 有监督模式下的关键点正确率
推理延迟 ≤ 0.012 ms 单帧 embedding 延迟(M4 Pro)
吞吐量 171,472 embeddings/sec 单节点处理能力
模型大小 8 KB(4-bit 量化) 量化后可在 ESP32 SRAM 运行
呼吸检测范围 6-30 BPM 通过 0.1-0.5 Hz 带通滤波
心率检测范围 40-120 BPM 通过 0.8-2.0 Hz 带通滤波
穿墙深度 ≤ 5 m 视墙体材质而定
单 AP 可辨识人数 ~3-5 人 受限于 56 子载波数量

对于姿态置信度阈值,建议设置为 0.7 以过滤噪声关键点。低于此阈值的关键点应在后处理中丢弃或插值平滑。多人物场景下,使用 Stoer-Wagner min-cut 算法进行子载波聚类分离,RuView 的测试显示可实现 24/24 正确计数。

五、边缘部署:硬件选型与参数配置

最低硬件配置:ESP32-S3($9)+ Cognitum Seed($131),总计约 $140。BOM 包含 8-dim 特征向量提取、RVF 向量存储、kNN 相似性搜索、Ed25519 见证链和 MCP 代理。

ESP32-S3 需满足以下条件:双核处理器(单核如 ESP32-C3 不支持 CSI DSP)、至少 4MB Flash(8MB 推荐)。固件刷写后,通过 python firmware/esp32-csi-node/provision.py --port COM9 --ssid YourWiFi --password secret --target-ip 192.168.1.20 配置 WiFi 凭证。

边缘推理的关键参数:在 Tier 2 模式下,ESP32 可本地运行 presence 检测、呼吸心率测量和跌倒警报。推荐配置 --vital-int 500(500ms 生命体征上报间隔)、--fall-thresh 15000(跌倒加速度阈值 15.0 rad/s²)、--subk-count 16(保留 16 个最敏感子载波)。这些参数可根据实际环境通过 --edge-tier 2 重新配置。

多节点部署时,建议使用 3-6 个 ESP32 组成 TDM mesh,节点 ID 和时隙通过 provisioning 脚本配置。信道跳频可开启 --hop-channels "1,6,11" 以增加 sensing 带宽。

六、信号处理管道的工程细节

从原始 CSI 到姿态输出,需经过六个处理阶段:

Phase Sanitization(相位净化):使用 SpotFi 的共轭乘法消除载波频率偏移(CFO)、采样频率偏移(SFO)和包检测延迟。公式为 CSI_ratio[k] = H₁[k] × conj(H₂[k])

Hampel 滤波:相比于 Z-score 使用均值 / 标准差,Hampel 采用中位数 / MAD,在 50% 污染率下仍能有效剔除异常值。使用 σ̂ = 1.4826 × MAD 计算稳健标准差。

子载波选择:基于敏感度排序,选择方差比(运动方差 / 静止方差)最高的 top-K 子载波。这一步可将 SNR 提升 6-10 dB。

时频分析:通过 STFT 生成 CSI 频谱图,捕捉不同活动的频率特征 —— 呼吸 0.2-0.4 Hz、步行 1-2 Hz。

Fresnel 模型:基于 TX-body-RX 几何计算菲涅尔区交叉,预测呼吸信号出现位置,解决多径环境下的零交叉点失效问题。

Body Velocity Profile(BVP):从多普勒频移提取速度分布,这是与房间布局无关的域不变特征。

七、应用场景与监控要点

部署后应关注以下监控指标:

Presence 检测:延迟应低于 0.012 ms,精度目标 100%。可通过 /api/v1/sensing/latest 端点查询。

生命体征:呼吸率和心率需每帧输出置信度,低于 0.5 的读数应标记为不可靠。建议在 /api/v1/vital-signs 设置告警阈值。

姿态稳定性:骨骼物理约束损失应保持在 0.008 以下,确保每个姿态符合人体解剖学。可通过 node scripts/eval-wiflow.js 定期评估。

多人物追踪:监控 min-cut 分离结果,ID 交换次数应为零。使用 node scripts/mincut-person-counter.js 验证计数准确性。

在线学习:SNN 自适应应在 30 秒内完成新环境学习,观察 snn-csi-processor.js 的收敛日志。

资料来源

本文技术参数与架构细节主要来自 RuView GitHub 仓库及项目文档。

ai-systems