☰
用商用WiFi做跌倒检测:CSI感知原理、算法与工程实践
2026/10/22 6:29:53 网站建设 项目流程

1. 项目概述:为什么拿商用WiFi来做跌倒检测

老人跌倒这件事,在养老和医疗圈里一直是个老大难。据相关统计,跌倒是老年人意外伤害的首因,而且跌倒后如果没人及时发现,后果往往比跌倒本身严重得多——长时间躺在地上引发的并发症、错过黄金救治时间,这些才是真正致命的。所以做跌倒检测系统的核心需求从来不是"检测到跌倒",而是"跌倒后多久能被发现"。

这个项目TMC-RT-Fall,标题里三个关键词值得拆开看:Real-Time(实时)、Contactless(非接触式)、Commodity WiFi Devices(商用WiFi设备)。翻译成大白话就是:不穿戴任何设备、用家里或者养老院已有的普通路由器,实时检测老人是否跌倒。这听起来很美好,但背后要解决的问题一点都不简单。WiFi信号是拿来通信的,要让它变成"传感器",从一堆承载着网页、视频、语音的数据包里捕捉人体动作引起的微小变化,这相当于让一个快递员顺便当保安——他本来只是来送包裹的,你却指望他能看出屋里的人是不是摔倒了。

为什么选WiFi而不是摄像头或者可穿戴设备?摄像头的隐私问题在卧室、浴室这种场景几乎是无解的,而且光线不好、遮挡严重的时候效果很差。可穿戴设备呢,手环、挂坠这类东西最大的问题是老人不愿意戴,尤其是洗澡、睡觉的时候,摘下就忘了戴,检测系统就变成了摆设。WiFi感知的好处在于,它不需要人在身上装任何东西,路由器在那儿,人只要在信号覆盖范围内活动,系统就能感知到动作——这正好对上了养老场景里"无感监护"的核心诉求。

这套系统面向的落地场景很明确:独居老人的家里、养老机构的房间、医院的病房。在这些场景里,路由器几乎已经是标配基础设施,不需要额外部署专用硬件,改造成本极低。当然,低成本和易部署的背后,是用信号处理算法和机器学习模型的复杂度来换的,这也是这个项目最值得深入研究的地方。

拿到这个项目的时候,我最关心的是它的工程可行性——论文或者Demo里跑通的方案,能不能在真实环境下稳定工作。这个疑问贯穿了整篇文章,后面我会详细展开我在复现和实测过程中踩过的坑。

提示:本文所有讨论都基于通用的WiFi CSI感知技术原理,不涉及任何特定商业产品或品牌,重点讲方法论和工程经验。

2. 核心技术方案:CSI是拿来做感知的,不是拿来看信号的

2.1 从RSSI到CSI:精度的一场革命

WiFi感知这个概念其实不新鲜,早在RSSI时代就有人尝试用信号强度变化判断人体活动。RSSI(Received Signal Strength Indicator)是一个粗粒度的标量,它只告诉你接收到的信号总功率是多少,相当于一个房间的温度计——你能感觉到热还是冷,但说不清楚哪个角落热、哪里吹来了冷风。

CSI(Channel State Information)完全不一样。它描述的是无线信道在频域上的响应,通俗点说,WiFi信号在空间里传播时,会遇到墙壁、家具、人体这些障碍物,发生反射、散射、衍射,最终到达接收端的是多个路径信号的叠加。CSI把这个叠加结果按子载波拆开来看,每个子载波都有自己的幅度和相位,相当于把房间里的"温度分布图"画出来了。

为什么这对动作感知重要?因为人体动作会改变信道的多径结构。你挥一下手、弯一下腰、摔倒在地,都相当于在房间里移动了一面"会反射的墙",不同路径上信号的延迟、衰减随之改变。RSSI只给你一个总功率的波动数据,CSI却把每个频率分量上的变化都记录了下来,这给后续的跌倒检测提供了极其丰富的特征空间。

这个项目用的方式是通过修改无线网卡的固件驱动来提取CSI数据。目前比较成熟的方案是通过开源工具链,在Linux系统下让兼容的无线网卡工作在监控模式下,抓取数据包的同时提取CSI信息。这背后并不需要很昂贵的设备,支持的工具链最早是针对某些特定网卡芯片设计的,成本大概就是一块普通无线网卡的价格,这和专用雷达设备动辄上万的成本比起来,优势非常明显。

2.2 信号预处理:拿到手的CSI全靠下一步的"洗"

CSI数据不是拿来就能用的。原始CSI里噪声大得吓人,尤其室内环境,风扇转动、空调气流、甚至隔壁房间的电磁干扰都会叠加在信号上。做跌倒检测的时候,人体的动作特征主要集中在特定的频段,如果不去掉噪声,分类器很容易被干扰项带偏。

预处理第一步是去除异常值和突发脉冲。WiFi数据包在传输过程中偶尔会有丢包和重传,这会导致CSI序列出现不连续的跳变。处理办法就是做中值滤波或者剔除超出阈值的数据点。我一般用一个滑动窗口,窗口大小取5~7个样本,计算窗口内的中值,如果当前样本偏离中值超过预设倍数,就判定为异常点并替换掉。

第二步是低通滤波。人体跌倒这个动作,从开始失去平衡到倒地,整个过程大约持续0.5到1.5秒,对应的信号变化频率不会太高。用一个截止频率在20到30Hz左右的低通滤波器把高频噪声滤掉,既能保留跌倒动作的主要特征,又能大幅降低环境噪声的影响。这里我习惯用巴特沃斯滤波器,因为它在通带内足够平坦,不会把有用的信号幅度压变形。

第三步是滑动窗口和差分处理。实时检测系统和离线分析不一样,拿到的是一段持续流入的数据流。我把数据切成固定长度的滑动窗口,窗口长度一般取1到2秒,步长设0.2秒左右,保证相邻窗口之间有重叠,这样能捕捉到动作的连续性。窗口内的数据做一阶差分,把背景静态分量去掉,剩下的就是动态变化的部分,这部分才是人体动作引起的信号扰动。

预处理做完,数据就从一个乱七八糟的原始流,变成了干净、可分析的时间序列。这是整个系统里最不起眼、但绝对不可跳过的一步,我在实测中见过太多案例——算法模型本身没问题,就是数据预处理做得糙,导致准确率怎么都上不去。

3. 核心算法:跌倒是怎么被"认"出来的

3.1 特征提取:把信号变成能说明问题的数字

预处理之后的CSI数据每个数据包都有几百个子载波的信息,如果直接把这么高维的数据丢给分类器,计算量太大,实时性根本保证不了。所以必须在特征层面做一次"压缩"。

我在做这个项目的时候,主要提取了三类特征。

第一类是时域统计特征。对每个窗口内的CSI幅度序列,计算均值、方差、峰值、峰均比、过零率这些基础统计量。跌倒在时域上的表现是幅度会有一个剧烈的冲击性变化,然后趋于平稳——人倒地之后不动了,信号会重新稳定在一个新的水平上。所以"峰值+峰均比+方差突变"这个组合是非常有效的强特征。

第二类是频域特征。对窗口内信号做FFT变换,观察频谱分布。正常行走、坐下这些动作的能量集中在低频段,而跌倒瞬间因为动作剧烈,高频分量会比日常动作明显增多。我常用的是频谱能量分布、主频位置、高频占比这几个特征。实测下来,高频能量占比对区分"跌倒"和"快速坐下"这类近似动作非常有用。

第三类是时频域特征,这部分是这个系统的核心亮点。跌倒不是一个稳态过程,它的信号特征随时间快速变化,单纯看频域会丢失时间信息。我用了短时傅里叶变换(STFT)把信号在时间和频率两个维度同时展开,生成一个二维的时频谱图。跌倒在时频谱图上的形态一下子清晰起来——先是一个宽频带的能量爆发(倒地瞬间),紧接着是一个低频持续的尾巴(倒地后的静止状态)。这个形态特征和日常动作差异极大,机器的分类准确率因此提升了不少。

特征选好之后还要做归一化。不同环境、不同人的信号幅度差异很大,如果不归一化,模型在一个环境里训练好了,换个房间就彻底失灵。我把每个窗口的特征向量都减去当前环境基线的均值、除以标准差,这样模型学到的就是"相对变化模式"而不是"绝对幅度值",对环境变化也有一定的鲁棒性。

3.2 分类模型与实时判定逻辑

特征提取完成,接下来就到了"决策"环节。我在这个系统里对比过两种方案。

一种是传统的机器学习方案。用支持向量机(SVM)或者随机森林(Random Forest)做分类。这两种模型的训练速度快、部署简单、在嵌入式设备上也能流畅跑,但需要对特征做较精细的手工设计,泛化能力取决于特征选得好不好。我用随机森林的时候,把上面说的三类特征全部接起来作为输入,跌倒、行走、坐下、弯腰捡东西几类动作做了二分类和四分类对比实验。四分类的准确率能达到不错的效果,但二分类(跌倒/非跌倒)更实用,因为实际场景里最重要的是"是不是跌倒了"这一个判断。

另一种是深度学习方案。用一维卷积神经网络(1D-CNN)直接在原始CSI序列上做端到端的分类,让模型自己学习特征。这个方案的优点是不用手工设计特征、适应复杂场景的能力更强,但缺点是训练需要大量标注数据、模型体积大、推理速度可能跟不上实时要求。我在测试中发现,在数据量有限的情况下,经过精心特征工程的随机森林反而比仓促训练的CNN效果更好。

实时判定逻辑上,我采用的是"两级判决"策略。第一级是每个滑动窗口独立做一次跌倒概率估计,如果概率超过第一阈值(比如0.7),不立即报警,而是启动一个确认计时器。在接下来的1到2秒内持续观察,如果连续多个窗口的概率都超过第二阈值,才正式触发跌倒报警。这样做的好处是大大降低了误报率——因为单独的信号突发可能是弯腰或者跺脚,但连续多个窗口都表现出跌倒特征的概率就比较可信了。这个"两次确认"机制,是我在实测中觉得最值得推荐的工程经验之一。

4. 实操复现:从零搭建实时检测系统的完整记录

4.1 硬件环境与系统架构

说实话,一开始我以为这个系统的硬件门槛会比较高,实际折腾下来发现比想象中平易近人。整套系统的核心是一台运行Linux的电脑(我用的是某款基于Intel平台的迷你主机),配合一块兼容无线网卡,设置成AP模式或者监控模式。这块网卡要支持CSI提取工具链,安装对应的固件和驱动补丁就可以。接收端放在被测者的侧前方大约3到5米的位置,发射端放在对角线位置,基本能把房间主要活动区域覆盖进去。

系统架构分三层。最底层是数据采集层,负责从网卡驱动中获取CSI数据包,按时间戳解析成幅值和相位矩阵。中间层是信号处理层,完成预处理、滑动窗口切分、特征提取。最上层是决策层,运行分类模型和报警逻辑。这三层之间通过轻量级的消息队列串起来,数据帧实时往下游传,整个流水线的延迟控制在几十毫秒以内,加上识别时间,从跌倒发生到系统产生报警信号,端到端延迟能做到1秒以内。

4.2 数据收集与实验设计

数据是整个系统的命根子。我在采集数据的时候专门设计了几组实验。

第一组是单人场景的跌倒样本。让志愿者在不同位置(靠近发射端、正中间、靠近接收端)做跌倒动作。要注意的是,跌倒有多种姿势——正面扑倒、侧身倒下、向后坐倒,每一种的CSI信号特征其实都有差异,所以我每种姿势都采集了不少于50组样本。

第二组是日常动作样本。站立、行走、坐下、起身、弯腰捡东西、蹲下、在床上翻身、咳嗽、打喷嚏,这些动作都要采集,而且采集量要比跌倒样本多得多。因为日常动作发生的频率远高于跌倒,哪怕误报率只有5%,在一天里也会触发很多次假警报,让系统失去信任。所以日常动作数据越多,分类器的决策边界就越可靠。

第三组是干扰场景样本。房间里开风扇、开空调、有人从门外走廊经过、楼下有车辆路过,这些环境干扰对CSI的影响也不小。把这些干扰样本纳入训练,让模型学会忽略与人体跌倒无关的信号波动。

我还做了多位置交叉验证。同一个人的同一个动作,在不同的房间位置采集,训练和测试分开进行。这能检验系统对不同位置信号的适应性。实测数据表明,模型在训练位置附近的识别准确率最高,远离训练位置的准确率会明显下降——这说明基于CSI的感知是有空间依赖性的,部署时最好针对目标房间做一次现场采集和模型微调,而不是指望一个通用模型打遍天下。

4.3 工程化实现中的几个关键选择

实时系统里有一个容易被忽视的问题:CSI数据包的到达速率不稳定。商用WiFi的CSI采样率受到数据包发送速率和信道占用情况影响,波动很大。有时候一秒钟能收到几百个包,有时候只有几十个。如果直接把时间序列送进算法,时间间隔不均匀会让特征计算失真。我的处理办法是做了时间戳重采样,把不规则的CSI序列插值到固定采样率上,比如100Hz,这样后续处理就在统一的时间基准上进行了。

另一个关键选择是模型的量化部署。我把训练好的随机森林模型做了轻量化处理,把决策树的数量从100棵降到了50棵左右,同时将特征计算过程中的浮点运算改成定点近似。效果还不错,模型体积缩小了将近一半,推理速度从几毫秒降到接近即时,而准确率的损失几乎可以忽略不计。对于实时系统来说,减少每个数据帧的处理延迟,就是在为后续的报警决策和网络传输争取时间窗口。

5. 常见问题与排查心得

5.1 环境变化导致系统误报

这是所有基于CSI的感知系统都躲不开的痛点。房间里家具挪动了位置、路由器被碰了一下、窗外下大雨、湿度变化,都会让CSI的基线发生漂移。有一次测试中,系统本来稳定运行,突然开始频繁误报,排查了半天发现是扫地机器人启动了,在房间里移动产生了一系列类似人体活动的信号反射。

我的解决办法是引入"环境基线校准"机制。系统每运行一段时间(比如5分钟)就自动检测当前环境信号的静态统计量,与保存的基线做对比。如果发现基线漂移超过阈值,就自动触发一次在线校准,把当前的静态环境特征重新作为基线。同时,对"低频小幅度漂移"和"高频脉冲干扰"做区分处理,前者做基线更新,后者作为异常信号滤除。这就解决了一大半的误报问题。

5.2 多人场景下的干扰

养老机构里经常是一个房间住两个人,或者有护工进进出出。两个人同时活动时,CSI信号里叠加了两套人体动作的特征,分类器很容易被搞糊涂——系统可能把"一个人跌倒、另一个人正常走动"误判为"两个人都没事"或者直接触发误报。

针对这个问题,我在系统设计上做了减法:利用信号的空域特征做简单的目标分离。具体做法是多天线接收,利用不同天线上信号的到达角和时延差异,将信号能量按空间方向做粗粒度的分离。这个方案效果比完全不做分离好很多,但面对多人密集遮挡的场景依然吃力。所以在实际项目中,我建议把系统的部署定位在"单人为主的活动区域"——比如床头、卫生间门口这种一次只会有一个人在的区域。搞清楚系统的能力边界,部署的时候才能少踩坑。

5.3 天线方向和设备摆放的玄学影响

CSI对天线位置极度敏感。我做过一组对比实验:路由器天线从垂直方向旋转到水平方向,同一个跌倒样本的识别置信度直接掉了不少。另一个坑是金属物体——哪怕是一块不大的金属置物架,放在发射端和接收端之间,都会显著改变信号反射路径,导致模型特征分布发生偏移。

这个问题的处理没有太多花哨的技巧,就是靠部署规范来约束。我在部署检查清单里固定了几条:发射端和接收端之间尽量避免大件金属物体;天线保持垂直方向;设备不要贴着墙角放,至少要离开墙面30厘米;接收端和被测活动区域之间不要有大型绿植或者玻璃屏风。每次部署完,还要做一次"试跌"验证,用几次真实的模拟跌倒动作确认系统的响应正常,才算部署完成。

5.4 误报和漏报的取舍

做跌倒检测这种安全相关的应用,误报和漏报的权衡一定要想清楚。漏报的代价是致命的——老人真的摔倒了系统没反应,这绝对不能接受。所以我在阈值设计上,宁可多报也不要漏报。误报大不了让监护人员白跑一趟,漏报则是安全事故。

但在实际调参中我又发现,误报太多会导致"狼来了"效应——护工对报警越来越麻木,真正跌倒的时候反而没有第一时间处理。所以最终的阈值策略是做成了动态可调的:白天活动频繁时段,阈值适当调高以减少误报;夜间睡眠时段,阈值调低以保证任何疑似跌倒都能触发报警。这套策略在实测中取得了比较均衡的效果,既保证了夜间安全,又不会在白天把护工烦死。

5.5 与摄像头方案的融合思路

严格来说,WiFi感知和视觉感知不是替代关系,而是互补关系。WiFi最大的优点是隐私友好、穿透能力强、不受光照影响,缺点是空间分辨率低,无法区分"是张三跌倒还是李四跌倒"。摄像头正好相反,识别精度高但隐私敏感。

在实际产品化的时候,一个更稳妥的方案是"WiFi粗检测+摄像头精确确认"的两级联动:WiFi系统发现疑似跌倒事件,触发报警,同时唤醒房间里的摄像头拍一张照片或者录一段短视频,由监护人员做人工确认。这样既保留了隐私友好的常态监护,又能在关键时刻获得视觉信息辅助决策。这个思路我在和某机构交流的时候得到过很好的反馈,他们认为这才是WiFi感知技术在养老场景落地最务实的路径。

6. 写在最后的经验体会

这个项目做下来,我对"商用WiFi做感知"这件事的看法有了很大的变化。刚开始觉得挺神奇,原理也不复杂,但真正把系统做稳定,要在太多细节上下功夫。CSI数据的质量受硬件、环境、部署位置的影响太大了,同一个算法在这里跑得好好的,换一个环境就可能崩掉。所以如果你准备复现或者基于类似思路做开发,我强烈建议把至少一半的时间花在数据采集和预处理上,而不是急着去调模型参数。

还有一点切身体会:不要迷信指标。实验室环境下99%的准确率可能意味着在真实场景里一天误报好几次。做这类系统,一定要从用户的真实使用场景出发反推需求,把误报率、漏报率、响应延迟这些指标放在具体的环境中权衡,而不是只盯着论文里的一个数字。

另外,我也想顺带提一个方向上的思考。目前所做的都是"跌倒后检测",但从监护的角度,更有价值的是"跌倒前预测"——通过分析步态、平衡状态的微小变化,提前发现跌倒风险。这需要更长时间尺度的连续监测和更精细的动作模式分析,难度更大,但一旦做成,价值也更大。这个系统未来的演进方向,我会把一部分精力投向这里。

最后分享一个小技巧:调试CSI感知系统的时候,不要把CSI数据当成一串冰冷的数字,想办法把它可视化出来(画成波形图或者热力图),你在屏幕上亲眼看到"跌倒"在信号里呈现的形态之后,对特征设计、阈值选择都会有一种完全不同的直觉。这种"让数据说话"的习惯,帮我在排查问题时省下了大量时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询