042、Edge Impulse的实时推理与数据流
Edge Impulse的实时推理与数据流:从一次现场部署翻车说起
去年秋天帮客户调试一个工业振动监测项目,现场传感器数据通过Edge Impulse部署到STM32上,推理结果却总是滞后两秒。客户指着屏幕说“你们这模型是不是在睡觉?”我盯着串口日志看了半小时,发现数据流管道里有个缓冲区在偷偷攒数据——Edge Impulse的实时推理,远不是“模型跑起来”那么简单。
数据流管道的三个暗坑
Edge Impulse的推理引擎默认会维护一个内部环形缓冲区,用于处理滑动窗口特征。这个设计在离线测试时表现完美,但一旦接入真实传感器流,问题就暴露了。
第一个坑是时间戳对齐。传感器以100Hz采样,但Edge Impulse的推理线程可能被其他中断抢占。你从ei_get_serial_data()拿到的数据包,时间戳可能已经漂移了5毫秒。我习惯在数据进入推理管道前,手动打一个微秒级时间戳,用DWT->CYCCNT寄存器读CPU周期数,比任何软件定时器都准。
第二个坑是缓冲区水位。Edge Impulse的run_classifier()函数默认等待缓冲区填满才触发推理。如果你的特征窗口是128个点,采样率100Hz,那意味着每1.28秒才输出一次结果。现场客户要的是“振动异常立即报警”,不是“1.28秒后告诉你刚才坏了”。解决方案是修改ei_classifier_inferencing.h里的EI_CLASSIFIER_S
