1. 项目概述
在嵌入式系统和物联网设备日益普及的今天,如何在资源受限的微控制器(MCU)上实现高效的异常检测成为一个关键挑战。传统基于云计算的解决方案面临着延迟高、隐私风险大和网络依赖性强等问题。本文介绍的基于Z-Score的TinyML异常检测系统,提供了一种完全在MCU上自主运行的解决方案。
这个系统通过采集电器设备的电流消耗数据,计算其RMS(均方根)值,并利用轻量级的Z-Score统计方法进行异常检测。整个流程包括数据采集、特征提取、模型训练和异常检测全部在STM32微控制器上完成,无需任何外部计算资源或网络连接。这种全自主的设计使其特别适合部署在网络条件不佳或对隐私要求高的环境中。
2. 系统架构设计
2.1 硬件组成
系统采用STM32 NUCLEO-F446RE作为主控芯片,这款基于ARM Cortex-M4内核的微控制器提供了足够的计算能力,同时保持低功耗特性。电流测量使用ACS712霍尔效应电流传感器,这种非侵入式传感器可以直接串联在电路中,通过测量电流产生的磁场来获取电流值,避免了传统分流电阻带来的功率损耗和隔离问题。
为减少噪声干扰,系统还包含一个简单的电阻网络用于稳定传感器输出。数据存储方面采用MicroSD卡模块,用于记录运行日志和异常事件,便于后续分析。整个硬件设计遵循"够用就好"的原则,在满足功能需求的前提下尽可能简化,以降低成本和功耗。
2.2 软件工作流程
系统软件采用模块化设计,主要包含以下几个关键组件:
数据采集模块:通过STM32的ADC以高频率采样电流传感器输出,每1000个样本组成一个处理窗口。
RMS计算模块:对每个样本窗口计算RMS值,公式为:
RMS = √(1/N * Σ(x_i²))其中N=1000,x_i为第i个采样值。RMS值能有效反映交流电流的有效值,是表征设备功耗的关键指标。
状态分类模块:根据RMS值将设备状态分为"运行"(ON)和"停止"(OFF)两种。通过实验确定冰箱压缩机运行时RMS值在0.86-0.88A之间,停止时约为0.07A。
训练与检测模块:系统启动后先进入训练模式,收集正常运行的统计数据;之后自动切换至检测模式,使用Z-Score方法识别异常。
3. Z-Score异常检测模型
3.1 模型原理
Z-Score是一种经典的统计异常检测方法,通过计算数据点与均值的偏差程度来识别异常。其计算公式为:
z = (x - μ)/σ其中μ是均值,σ是标准差。Z-Score的绝对值越大,表示该数据点偏离正常范围越远。
选择Z-Score作为基础算法主要基于以下考虑:
- 计算简单,适合资源有限的MCU
- 内存占用极小(只需存储均值和标准差)
- 执行时间确定,适合实时系统
- 结果可解释性强,便于调试
3.2 特征工程
为提高检测精度,系统使用了五维特征向量:
- 当前RMS值
- 滑动窗口内的RMS均值
- RMS值的标准差
- RMS变化斜率
- 压缩机运行时长(ON duration)
每个特征都独立计算Z-Score,最终异常分数取五个Z-Score绝对值的平均值。这种多特征融合的方法比单特征更能全面捕捉异常模式,同时保持了计算效率。
3.3 训练阶段实现
训练阶段持续收集正常运行的样本,逐步计算各特征的均值和标准差。为节省内存,采用增量式计算方式:
μ_new = μ_old + (x - μ_old)/n σ²_new = σ²_old + (x - μ_old)(x - μ_new)其中n为已收集的样本数。这种方法无需存储全部历史数据,非常适合内存受限的MCU。
训练时长需要根据具体应用确定。在冰箱监测案例中,作者收集了足够多的正常周期(通常需要覆盖多个启停循环)来建立可靠的基线。
3.4 检测阶段实现
检测阶段对每个新样本计算五维特征的Z-Score,当综合异常分数超过阈值(本系统设为2.5)时触发报警。阈值选择基于实验观察,在正常和异常样本间提供了良好的区分度。
为提高鲁棒性,系统还实现了"异常连续计数"机制,只有当异常持续一定时间才最终确认,避免瞬时干扰导致的误报。
4. 优化与实现细节
4.1 内存优化策略
在STM32F446RE上,系统总内存占用仅约3.3KB SRAM和63KB Flash。这是通过以下优化实现的:
采样缓冲区复用:ADC采样和RMS计算共用同一块内存,避免重复缓冲。
增量式统计计算:训练阶段不存储历史数据,只维护累加变量。
精简数据结构:使用最小够用的数据类型,如32位浮点而非64位。
模块化设计:各功能模块按需加载,减少同时驻留内存的代码量。
4.2 实时性保障
系统通过以下措施确保实时性:
中断驱动采样:ADC采样使用定时器触发,保证采样间隔精确。
优先级调度:关键任务(如采样)赋予更高中断优先级。
计算负载均衡:将RMS计算等耗时操作分散到多个采样间隔中完成。
性能监测:实时跟踪CPU利用率,确保有余量处理突发负载。
实测表明,Z-Score推断仅需20-40μs,完全满足实时性要求。
4.3 日志与调试
系统提供多种调试支持:
MicroSD日志:记录时间戳、RMS值、Z-Score和异常标志。
状态指示灯:通过LED显示系统状态(训练/检测)和异常报警。
串口调试接口:可选地输出详细运行信息供开发阶段使用。
日志采用CSV格式,便于直接导入分析工具。为避免频繁写操作影响SD卡寿命,采用缓冲写入策略。
5. 实际应用与性能评估
5.1 实验设置
作者在家庭冰箱上进行了为期14天的连续监测,收集了超过40,000个RMS样本。为评估系统性能,人为引入了三类异常:
温控器调整:调高设定温度,导致压缩机长时间运行。
开门事件:保持冰箱门开启,增加热负荷。
电源干扰:模拟断电情况,观察系统恢复行为。
5.2 检测性能
在所有测试场景中,系统表现出色:
准确率:精确度(Precision)和召回率(Recall)均达到1.0,即所有真实异常都被检出,且没有误报。
响应速度:从异常出现到被检测到的延迟很短,满足实时性要求。
稳定性:连续运行14天无故障,资源使用保持稳定。
特别值得注意的是,系统成功检测到了温控器调整导致的压缩机长时间运行(约5小时)和开门事件导致的异常模式(约15分钟)。
5.3 资源使用
详细的资源占用情况如下:
- 内存:约3.3KB SRAM (含1KB采样缓冲区)
- 存储:约63KB Flash
- CPU利用率:平均<10%,峰值<30%
这样的资源占用使得系统可以在完成主要功能的同时,留有足够余量处理其他任务或未来扩展。
6. 应用扩展与改进方向
6.1 适用场景扩展
虽然本文以冰箱监测为例,但该方案可广泛应用于:
工业设备监测:电机、泵等设备的异常检测。
智能家居:空调、洗衣机等家电的故障预警。
能源管理:识别电路异常或能效问题。
关键是根据具体应用调整特征选择和阈值设置。
6.2 可能的改进
自适应阈值:根据环境变化动态调整检测阈值。
多设备协同:多个监测节点间的信息共享。
模型融合:结合其他轻量级算法如移动平均、变化点检测等。
功耗优化:进一步降低系统功耗,延长电池供电时的使用时间。
这些改进可以在保持MCU本地处理的前提下,进一步提升系统性能。
7. 开发经验与注意事项
在实际开发中,有几个关键点需要特别注意:
传感器校准:ACS712传感器需要精确校准,特别是零点和灵敏度。建议使用已知负载进行多点校准。
采样同步:对于交流信号,采样率应与工频同步或为其整数倍,避免频谱泄漏。
状态判定:设备ON/OFF状态的阈值需要根据实际测量确定,不同设备差异可能很大。
训练数据:确保训练阶段收集的数据覆盖各种正常工况,避免将正常变化误判为异常。
异常处理:设计完善的异常恢复机制,防止系统因偶发错误而崩溃。
在调试过程中,建议先使用串口输出详细运行数据,验证各模块功能正常后再优化为生产版本。