WiFi 信号本质上是一种电磁波传播介质,当人体在房间内移动、呼吸甚至静止时,都会引起无线信号的多径传播发生变化。这种变化虽然微弱,但通过读取 WiFi 网卡的 Channel State Information(CSI),我们可以从中提取出人体活动的特征信息。RuView 项目正是基于这一原理,构建了一套完整的端到端感知 pipeline,在无需任何摄像头或可穿戴设备的情况下,实现实时人体姿态估计、存在检测和生命体征监测。
CSI 信号的基础原理与采集
WiFi CSI 描述的是每个子载波在发射端与接收端之间的信道响应复数值,包含幅度和相位信息。商品 WiFi 网卡(如 ESP32-S3、Intel 5300、Atheros AR9580)在接收数据包时能够报告 56 至 192 个子载波的 CSI 数据,采样率通常为 20 Hz 至 28 Hz。当人体位于信号传播路径上时,身体会充当散射体,导致信号经历不同的传播延迟和衰减,从而在 CSI 幅度和相位中留下可辨识的扰动模式。
在硬件选型上,ESP32-S3 是目前性价比最高的方案,单模块成本约 9 美元,支持原生 CSI 采集。对于精度要求更高的场景,可以采用多节点组网方案:4 个 ESP32-S3 节点构成 TDM 网格,总成本约 48 美元,可产生 12 条发射 - 接收链路,实现 360 度覆盖。如果需要持久化存储、向量化搜索和密码学证明,可以额外配置 Cognitum Seed(约 131 美元),它提供了 RVF 向量存储、kNN 相似度搜索和 Ed25519 见证链功能。
六阶信号处理 pipeline
RuView 的信号处理流程分为六个阶段,每个阶段对应特定的算法和参数配置。
第一阶段是相位净化。 由于载波频率偏移(CFO)和采样频率偏移(SFO)的存在,原始 CSI 相位往往被线性趋势所污染。RuView 采用 SpotFi 提出的共轭乘法技术,将双天线 CSI 相除以消除相位偏移,公式为 $CSI_{ratio}[k] = H_1 [k] \times conj (H_2 [k])$。这一步骤将相位误差从数百毫弧度降低到数十毫弧度级别。
第二阶段是异常值剔除。 环境中存在的突发噪声会导致某些子载波出现极端值,传统 Z-score 方法因为均值和标准差本身被异常值污染而效果不佳。RuView 使用 Hampel 滤波器,以中位数和 MAD(Median Absolute Deviation)作为稳健统计量,$\hat {\sigma} = 1.4826 \times MAD$,能够容忍高达 50% 的数据污染。
第三阶段是子载波筛选。 并非所有子载波对人体运动同等敏感,部分子载波可能处于多径 null 点。RuView 通过计算每个子载波的灵敏度 $sensitivity [k] = var_{motion} /var_{static}$,选择排名最高的 10 至 20 个子载波进行后续处理,经验证可将信噪比提升 6 至 10 dB。
第四阶段是时频分析。 对精选子载波执行滑动窗口短时傅里叶变换(STFT),生成 64×20 的时频谱图矩阵。呼吸信号通常出现在 0.1 至 0.5 Hz 频段,步行信号在 1 至 2 Hz 频段,而环境噪声则分布在更高频率。通过带通滤波和 FFT 峰值检测,可以准确提取呼吸率(6-30 BPM)和心率(40-120 BPM),实测处理速度达到 11,665 fps。
第五阶段是 Fresnel 建模。 在穿墙场景下,简单零交叉计数法会因多径效应而失效。RuView 引入 Fresnel 区模型,根据发射器 - 人体 - 接收器的几何关系预测呼吸信号的出现位置和强度,相位变化公式为 $\Delta\Phi = 2\pi \times 2\Delta d / \lambda$,幅度衰减为 $A = |\sin (\Delta\Phi/2)|$。该模型使得穿墙检测深度可达 5 米。
第六阶段是体感速度剖面(BVP)提取。 该方法源自 Widar 3.0 研究,从多普勒频移的角度提取人体运动速度分布,具有与房间布局无关的特性,是跨环境泛化能力的关键支撑。
神经网络模型与自学习系统
信号处理后的特征矩阵被送入基于图变换器的神经网络,输出 17 个 COCO 人体关键点坐标(头、肩、肘、腕、髋、膝、踝等)。模型采用 6 项复合损失函数:MSE 位置损失、交叉熵可见性损失、UV 坐标回归损失、时序一致性损失、骨骼长度约束和左右对称性约束。训练策略分为三个层级:第一层使用 MM-Fi 和 Wi-Pose 公共数据集进行跨环境预训练;第二层利用 ESP32 CSI 配合摄像头伪标签进行环境特异性微调;第三层通过 SONA(自优化神经架构)进行持续在线学习。
SONA 的核心是 Micro-LoRA 和 EWC++ 机制。Micro-LoRA 仅训练 1,792 个低秩参数(秩为 4),相比完整模型减少约 100 倍的参数量更新,使得边缘设备上的持续学习成为可能。EWC++(弹性权重整合)通过 Fisher 信息矩阵对重要权重施加惩罚,防止新任务学习覆盖旧任务知识。在实际部署中,环境检测器持续监控 CSI 特征漂移(3-sigma 阈值),一旦检测到新环境即可触发自动适应。
边缘智能与 65 个 WASM 模块
RuView 将 65 个感知模块编译为 WebAssembly 格式(约 5-30 KB 每个),通过 WASM3 运行时在 ESP32-S3 上执行。每个模块拥有独立的计算预算(2-10 毫秒),支持热加载而无需重启系统。这些模块覆盖 13 个类别,包括医疗健康(睡眠呼吸暂停、心律失常、跌倒检测)、安全防护(入侵检测、周边越界、逗留报警)、智能建筑(HVAC 存在感知、照明区域控制、会议室追踪)、零售分析(队列长度、热力图、客户流动)、工业安全(叉车 proximity、密闭空间监测)以及信号智能(稀疏恢复、Flash Attention、最优传输)等领域。
性能基准与部署实践
根据在 Apple M4 Pro 和 ESP32-S3 上的实测数据,Rust 实现的完整 pipeline 延迟为 18.47 微秒,相比 Python 原型加速约 810 倍;生命体征检测达到 11,665 fps,单次推理仅需 86 微秒。存在检测准确率 100%,无漏报或误报;多人计数采用 Stoer-Wagner 最小割算法,在 24 次独立测试中全部正确。姿态估计在使用摄像头监督训练的条件下达到 92.9% PCK@20(Percentage of Correct Keypoints,20 像素容差)。
部署方式上,推荐使用 Docker 镜像(132 MB,amd64/arm64 双架构),启动命令极为简洁:docker run -p 3000:3000 -p 3001:3001 -p 5005:5005/udp ruvnet/wifi-densepose:latest。对于硬件受限场景,可以选择纯 Rust 编译的二进制文件(~2 MB),直接运行于 x86_64 或 ARM64 主机。如果希望在浏览器中验证信号处理流程,也可以使用包含 Three.js 可视化界面的演示版本。
工程化要点与监控阈值
在实际项目中部署 RuView 时,以下参数值得关注:子载波选择数量建议 16 至 35 个(根据环境噪声水平调整);呼吸检测带通滤波采用 0.1-0.5 Hz 四阶巴特沃斯滤波器;心率检测采用 0.8-2.0 Hz 范围;Fresnel 建模的距离阈值默认为 3 米,超过此距离需要增加节点密度;TDM 协议下节点数量建议 3 至 6 个,过多节点会降低单节点占空比。
监控指标应至少包括:CSI 帧率(目标 ≥20 Hz,低于 15 Hz 需检查硬件)、子载波阻塞率(目标 <20%,过高说明多径环境复杂)、Coherence Gate 接受率(目标>70%,过低说明信号质量差)、推理延迟 P99(目标 <1 ms,边缘设备可容忍 10 ms)。建议将上述指标通过 Prometheus 或 InfluxDB 采集并配置告警。
小结
WiFi CSI 感知技术代表了无接触式人机交互的新范式。RuView 通过六阶信号处理、图神经网络模型、自学习适应机制和边缘 WASM 模块的协同设计,将商品 WiFi 设备转变为高精度的感知终端。从养老院的夜间呼吸监测到仓库的工人安全区域管控,这项技术的应用边界正在不断扩展。随着多节点组网和跨环境泛化能力的持续优化,基于射频信号的空间智能有望成为智慧城市和智能家居的基础设施层能力。
资料来源:GitHub ruvnet/RuView 项目文档(https://github.com/ruvnet/RuView)