在计算机视觉领域,基于摄像头的姿态估计已相当成熟,但在隐私敏感场景、弱光环境或遮挡条件下,射频感知提供了另一种可能性。RuView 项目展示了如何利用商品 WiFi 设备的信道状态信息(CSI)实现无摄像头的人体姿态估计本文将聚焦其信号处理流水线的核心算法,剖析从原始 CSI 数据到 17 关键点姿态的完整工程路径。

CSI 信号的基本原理

现代 WiFi 设备在每帧数据传输时都会记录信道状态信息,这些信息描述了信号从发射端到接收端所经历的幅度衰减和相位变化。当人体在室内移动或呼吸时,会改变无线信号的传播路径,导致 CSI 的幅度和相位产生可测量的扰动。传统 WiFi 设备在 2.4 GHz 或 5 GHz 频段上工作,常见配置下每个 WiFi 帧携带 56 或 114 个子载波的 CSI 数据,采样率通常为 20 Hz 左右。

商品 WiFi 网卡(如 ESP32-S3)能够以接近 30 Hz 的速率持续输出 CSI 帧,每个帧包含 64 至 192 个子载波的数据。这种数据密度为姿态估计提供了足够的时频分辨率,但原始 CSI 数据存在显著噪声:载波频率偏移(CFO)、采样频率偏移(SFO)以及多径效应都会污染信号,必须通过专门的算法进行校正。

六种 SOTA 算法的工程实现

RuView 的信号处理流水线集成了六种经过学术界验证的算法,每种算法解决一个特定的信号处理难题。

共轭乘法(Conjugate Multiplication) 是相位清洗的第一道工序。算法将两天线接收的 CSI 进行复共轭相乘:CSI_ratio[k] = H₁[k] × conj(H₂[k])。这一操作能够消除载波频率偏移和采样频率偏移的影响,保留仅由人体运动引起的相位差异。该方法源自 SpotFi 论文(SIGCOMM 2015),在 RuView 中作为相位清理的基准步骤,处理延迟仅为 3.84 微秒。

Hampel 滤波器 负责剔除脉冲型噪声。传统 Z-score 方法在存在异常值时会被误导 —— 异常值拉偏均值和标准差,反而使其更难被检测。Hampel 滤波器改用中位数(MAD)作为中心度量:σ̂ = 1.4826 × MAD。这种方法在最多 50% 污染率下仍能保持稳定,RuView 在每个子载波窗口上应用该滤波器,典型参数为窗口大小 11、阈值 3 倍 MAD。实测表明,该步骤将相位噪声降低约 40%。

Fresnel 区模型 将呼吸检测建模为信号穿越 Fresnel 区时的相位变化。当人体胸腔起伏时,会改变发射端 - 人体 - 接收端的几何路径,引入可预测的相位调制。公式 ΔΦ = 2π × 2Δd / λ 描述了相位变化与路径差的关系,其中 Δd 为位移量(约 5-10 毫米),λ 为信号波长(约 6 厘米)。该模型解决了传统零交叉计数法在多径丰富环境中失效的问题,将呼吸检测的 SNR 提升 6-10 dB。

CSI 时频谱图(STFT Spectrogram) 通过滑动窗口 FFT 将一维时序信号转换为二维时频矩阵。呼吸信号位于 0.1-0.5 Hz 频段,行走位于 1-2 Hz 频段,而噪声则分布在整个频谱。谱图结构使得卷积神经网络能够学习空间模式,识别特定活动的时频特征。RuView 采用 256 样本窗口、50% 重叠配置,生成的谱图直接输入后续的注意力网络。

子载波选择 并非所有子载波都对运动敏感 —— 部分子载波可能处于多径_null 中,几乎不响应人体移动。算法计算每个子载波的敏感度:sensitivity[k] = var_motion / var_static,然后选取敏感度最高的前 10-20 个子载波进行后续处理。这一步骤借助 ruvector-mincut 实现的图分割算法自动完成,无需人工调参,在实测中将整体 SNR 提升 6-10 dB。

身体速度轮廓(BVP) 源自 Widar 3.0 论文,从多普勒频移中提取速度分布。与依赖具体房间布局的特征不同,BVP 是域无关的 —— 相同的速度轮廓无论在何种环境中都保持一致,这为跨环境泛化提供了基础。BVP 计算公式为 BVP[v,t] = Σₖ |STFTₖ[v,t]|,对所有子载波的多普勒能量进行聚合。

姿态重建的神经网络架构

经过六步信号处理后,干净的 CSI 特征被送入图 transformer 网络。该网络以 17 个 COCO 关键点构建人体骨架图(16 条边),通过跨注意力机制将 CSI 特征矩阵映射到人体姿态。每个关键点输出二维 UV 坐标(对应 DensePose 的表面坐标),而不仅仅是二维坐标点,这使得后续应用可以精确地将信息映射到人体模型表面。

RuView 采用 6 项复合损失函数进行训练:均方误差损失(MSE)用于坐标回归、交叉熵损失(CE)用于关键点可见性判断、UV 损失用于表面坐标一致性、时间损失用于时序平滑、骨骼损失用于保持相邻关键点的合理距离、对称损失用于利用人体左右对称性。训练使用 MM-Fi 和 Wi-Pose 公开数据集进行预训练,然后可在特定环境中进行微调。

边缘部署的参数配置

RuView 提供三种量化级别以适应不同硬件:ESP32 端采用 int4 量化,模型体积约 0.7 MB,加载时间低于 5 毫秒;移动端和 WebView 采用 int8 量化,体积约 6 MB,加载时间约 200 毫秒;服务端采用 fp16 或 f32 完整精度。

对于呼吸检测,关键参数包括:带通滤波器通带 0.1-0.5 Hz、FFT 窗口长度建议 60 秒以获得 0.1 Hz 的频率分辨率、峰值检测阈值默认 0.3 倍最大谱值。对于心率检测,带通范围调整为 0.8-2.0 Hz(对应 40-120 BPM),由于心率信号幅度更弱,建议在静止场景下使用或在多帧上进行滑动平均。

多节点部署时,建议采用 4-6 个 ESP32-S3 节点组成时空分复用(TDM)网格,每个节点轮流发射,其他节点接收,形成 N×(N-1) 条测量链路。节点间通过 UDP 协议在 5005 端口进行时钟同步,建议配置频道跳变(1/6/11 循环)以增加有效带宽至 60 MHz。

工程落地的关键考量

在实际部署中,CSI 姿态估计面临几个工程挑战。首先是多径效应 —— 室内环境中的家具、墙壁都会产生反射信号,与直接路径叠加后可能掩盖人体信号。Fresnel 模型和子载波选择算法联合使用能够部分缓解这一问题,但复杂环境可能需要更多的部署节点来增加视角多样性。

其次是跨环境泛化能力。RuView 通过 MERIDIAN 项目实现域对抗训练,使模型能够在未经训练的房间中工作。关键机制包括梯度反转层(强制模型丢弃房间特有特征)、几何编码器(将发射 - 接收位置以傅里叶编码注入每层)、硬件标准化层(将不同芯片的 CSI 映射到统一格式)。实测显示,该方案在零样本迁移时可达到约 75% 的原始环境准确率。

第三是实时性要求。完整的 CSI 处理流水线在 Rust 实现中耗时约 18.47 微秒,能够支持 54,000 fps 的处理吞吐量。如果仅需生命体征检测(呼吸和心率),处理时间可压缩至 86 微秒,对应 11,665 fps。这些指标在 ESP32-S3 上完全可实现单芯片实时运行。

通过理解 CSI 信号处理的底层原理,工程师可以在特定应用场景中合理配置参数。对于养老监护场景,建议将呼吸检测灵敏度提升至 0.85 以上,同时降低心率检测阈值以捕捉微弱信号;对于安防场景,可启用多目标追踪模式,利用 Min-Cut 算法分离多人信号。CSI 感知技术虽不能完全替代视觉方案,但在隐私保护和弱光环境中提供了有价值的补充能力。

资料来源:RuView 项目 GitHub 仓库(github.com/ruvnet/RuView)、SpotFi 论文(SIGCOMM 2015)、Widar 3.0 论文(MobiSys 2019)