运动分类与异常检测

概述

交通运输是全球商业的支柱。每天有数百万个集装箱通过船舶、卡车、火车等多种方式运往世界各地。保障这些集装箱安全高效地运输是一项巨大挑战,而 TinyML 正是实现这一目标的现代技术之一。

本实践教程将聚焦于解决运输相关的实际问题。我们将基于 Arduino Nicla Vision 板卡、Arduino IDE 和 Edge Impulse Studio,开发一个运动分类与异常检测系统。通过本项目,你将了解集装箱在陆运、海运、叉车垂直搬运、仓库存放等不同阶段所经历的各种力和运动。

学习目标

  • 配置 Arduino Nicla Vision 板卡
  • 数据采集与预处理
  • 构建运动分类模型
  • 实现异常检测
  • 实际测试与分析

完成本教程后,你将拥有一个可用于运输过程运动分类与异常检测的原型系统。这些知识也为后续更复杂的 TinyML 振动类项目打下基础。

IMU 安装与测试

本项目将使用加速度计。正如 Nicla Vision 配置 实践中所述,Nicla Vision 板载 6 轴 IMU(3D 陀螺仪 + 3D 加速度计),型号为 LSM6DSOX 。请确认已安装 LSM6DSOX IMU 库

图 1: Arduino IDE 安装 IMU 库界面
图 1: Arduino IDE 安装 IMU 库界面

接着,进入 Examples > Arduino_LSM6DSOX > SimpleAccelerometer,运行加速度计测试。可通过 IDE 串口监视器或绘图仪查看数据,单位为 g(地球重力),默认量程为 ±4g:

图 2: 加速度计测试结果
图 2: 加速度计测试结果

采样频率的定义

选择合适的采样频率对于捕捉目标运动特征至关重要。Nyquist-Shannon 采样定理指出,采样率应至少为信号最高频率分量的两倍,才能完整还原信号。对于运输场景的运动分类与异常检测,采样频率选择需考虑:

  1. 运动特性:不同运输方式(陆运、海运等)涉及的运动频率范围不同,快速运动需更高采样率。
  2. 硬件限制:Nicla Vision 及其传感器的最大采样速率有限。
  3. 计算资源:采样率越高,数据量越大,对 TinyML 设备计算资源要求越高。
  4. 电池寿命:高采样率耗电更多,若为电池供电需权衡。
  5. 数据存储:高频采样需更多存储空间,嵌入式设备内存有限。

在人类活动识别任务中,常用采样率为 50~100 Hz。本项目模拟运输场景,运动频率不高,50~100 Hz 是合理起点。

以下为 50 Hz 采样频率的数据采集示例代码:

/*
 * 基于 Edge Impulse 数据转发示例 (Arduino)
  - https://docs.edgeimpulse.com/docs/cli-data-forwarder
 * 开发者 M.Rovai @11May23
 */

/* 包含的库 ------------------------------------------- */
#include <Arduino_LSM6DSOX.h>

/* 常量定义 ---------------------------------- */
#define CONVERT_G_TO_MS2 9.80665f
#define FREQUENCY_HZ        50
#define INTERVAL_MS         (1000 / (FREQUENCY_HZ + 1))

static unsigned long last_interval_ms = 0;
float x, y, z;

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!IMU.begin()) {
    Serial.println("IMU 初始化失败!");
    while (1);
  }
}

void loop() {
  if (millis() > last_interval_ms + INTERVAL_MS) {
    last_interval_ms = millis();
    if (IMU.accelerationAvailable()) {
      IMU.readAcceleration(x, y, z);
      float ax_m_s2 = x * CONVERT_G_TO_MS2;
      float ay_m_s2 = y * CONVERT_G_TO_MS2;
      float az_m_s2 = z * CONVERT_G_TO_MS2;
      Serial.print(ax_m_s2);
      Serial.print("\t");
      Serial.print(ay_m_s2);
      Serial.print("\t");
      Serial.println(az_m_s2);
    }
  }
}

上传代码后,在串口监视器可见每秒采集 50 组数据。

图 3: 50Hz 采样数据示意图
图 3: 50Hz 采样数据示意图

注意:Nicla 静置桌面(摄像头朝下)时,$z$ 轴约为 9.8 m/s$^2$,符合地球重力加速度。

案例分析:集装箱运输场景模拟

为增强实践性,我们将模拟集装箱(或包裹)在不同运输场景下的运动。利用 Nicla Vision 板载加速度计,手动模拟以下情景并采集数据:

  1. 陆运(公路/铁路)——水平方向运动
  2. 海运——三轴混合运动
  3. 叉车垂直搬运——$z$ 轴为主
  4. 仓库存放(静止)——无运动
图 4: 四种运输场景示意图
图 4: 四种运输场景示意图

如上图所示,主要 $x$/$y$ 轴运动归为“陆运”,$z$ 轴为“叉车”,无运动为“静止”,三轴均有运动为“海运”。

图 5: 运动类别与轴向定义
图 5: 运动类别与轴向定义

数据采集

实际应用中,设备可直接安装于集装箱,通过 SD 卡(SPI 连接)或蓝牙等方式采集并存储数据(如 Sensor DataLogger 项目 )。采集到的 .CSV 文件可用 CSV Wizard 工具 上传至 Studio。

参考此 视频 了解更多数据上传方式。

设备连接 Edge Impulse

本项目将 Nicla 直接连接 Edge Impulse Studio,进行数据预处理、模型训练、测试与部署。可选:

  1. 下载最新固件,直接连接 Data Collection
  2. 使用 CLI Data Forwarder 工具,将传感器数据转发至 Studio。

推荐方式 2,更灵活可自定义采样率。操作步骤:

  1. 安装 Edge Impulse CLI Node.js
  2. 上传前述采集代码至 Nicla。
  3. 用 CLI Data Forwarder 采集加速度计数据并发送至 Studio:
图 6: 数据转发流程图
图 6: 数据转发流程图

首次运行:

edge-impulse-data-forwarder --clean

输入 EI 账号,选择项目、变量(如 accXaccYaccZ)、设备名(如 NiclaV):

图 7: 终端配置界面
图 7: 终端配置界面

在 EI 项目 Devices 区域确认设备已连接(绿点):

图 8: 设备连接状态
图 8: 设备连接状态

可克隆本项目: NICLA Vision Movement Classification

数据采集流程

Data Acquisition 区域,确认 [NiclaV] 已连接,传感器为 [sensor with 3 axes (accX, accY, accZ)],采样频率 [50 Hz],建议采样时长 [10000] ms(10 秒)。设置标签(如 [terrestrial]),点击 [Start Sample],水平移动设备采集数据:

图 9: 采集陆运数据界面
图 9: 采集陆运数据界面

陆运(卡车/火车,水平方向运动)采集结果:

图 10: 陆运数据采集结果
图 10: 陆运数据采集结果

可见 $Y$ 轴(绿色)为主,$Z$ 轴(蓝色)约 -10 m/s$^2$(摄像头朝上)。

依次采集四类场景数据:

海运(船舶,三轴混合运动):

图 11: 海运数据采集结果
图 11: 海运数据采集结果

叉车(垂直搬运,$z$ 轴为主):

图 12: 叉车数据采集结果
图 12: 叉车数据采集结果

静止(仓库存放,无运动):

图 13: 静止数据采集结果
图 13: 静止数据采集结果

建议每类采集 2 分钟(12 组 10 秒样本),共 8 分钟。用 three dots 菜单将部分样本划为测试集,或用 Train/Test Split tool 自动划分。最终数据集如下:

图 14: 数据集分布界面
图 14: 数据集分布界面

采集完成后,可用 Data Explorer 可视化数据,发现异常或标签错误。该工具用 PCA 或 t-SNE 降维,2D 展示数据分布。

图 15: 数据可视化与异常检测
图 15: 数据可视化与异常检测

本例数据分布良好,但 PCA 显示海运(绿)与叉车(橙)有重叠,因海运有时也为垂直运动。

Impulse 设计

下一步定义 Impulse,将原始数据信号处理后提取特征,作为 learning block 输入进行分类。进入 Impulse Design,创建 Impulse,并添加第二个 Learning Block 用于 Anomaly Detection

图 16: Impulse 设计界面
图 16: Impulse 设计界面

第二个模型采用 K-means 聚类。若某样本无法归入已知类别,则视为异常(如集装箱落海或叉车跌落)。

图 17: 异常检测聚类示意图
图 17: 异常检测聚类示意图

采样频率应自动识别,若无则手动输入 [50]Hz。窗口大小建议 2 秒([2000] ms),滑动窗口 [20]ms。即每 2 秒为一窗口,每隔 200ms 滑动一次,生成更多样本,每个样本含 300 个原始特征(3 轴 × 2 秒 × 50Hz)。

图 18: 窗口滑动与特征提取示意图
图 18: 窗口滑动与特征提取示意图

数据预处理概述

数据预处理即从加速度计原始数据中提取特征。加速度计测量 $X$、$Y$、$Z$ 三轴加速度,可反映运动模式与振动。

原始数据常含噪声,需滤波、归一化等预处理。数据分割为窗口有助于聚焦具体事件,窗口大小与滑动步长需结合实际运动周期设定。

50Hz 采样、2 秒窗口,每轴 100 个点,共 300 个特征。每 200ms 滑动一次,生成大量样本。

图 19: 数据窗口与特征提取流程图
图 19: 数据窗口与特征提取流程图

常见特征包括:

  • 时域特征:均值、中位数、标准差、偏度、峰度、过零率等
  • 频域特征:FFT、功率谱、主频、谱熵等
  • 时频特征:STFT、DWT 等

特征过多易过拟合,可用互信息、相关性、PCA 等方法降维。Studio 支持特征重要性分析。

EI Studio 谱特征

嵌入式机器学习预处理难度大,Edge Impulse 提供 Spectral Features Block 进行数字信号处理(DSP),适合加速度计等周期性运动分析。

本项目采用 FFT(如长度 [32]),每轴/通道提取:

  • 时域特征:RMS、偏度、峰度(各 1 个)
  • 频域特征:谱功率(16 个,FFT 长度/2)、偏度、峰度(各 1 个)

即每轴 21 个特征,共 63 个。

详细计算过程见 Edge Impulse - Spectral Features Block Analysis TinyML under the hood: Spectral Analysis

特征生成

理解预处理后,进入 Spectral Features 参数设置,定义 [FFT] 长度为 [32],点击 [Save Parameters]

图 20: 参数设置界面
图 20: 参数设置界面

顶部菜单选择 Generate Features,每个 2 秒窗口生成 63 维特征。

特征可视化用 UMAP 降维,2D 展示各类分布。

特征生成后各类分布良好,说明分类器效果可期。可进一步分析各特征对分类的贡献。

图 21: 特征可视化与重要性分析
图 21: 特征可视化与重要性分析

模型训练

分类器为全连接神经网络(DNN),输入层 63 个神经元,2 个隐藏层(20、10 个神经元),输出层 4 个神经元(对应四类):

图 22: DNN 结构示意图
图 22: DNN 结构示意图

超参数:学习率 [0.005],批量 [32],验证集 [20]%,训练 [30] 轮。训练后准确率 98.5%,内存与延迟极低。

图 23: 训练结果与资源消耗
图 23: 训练结果与资源消耗

异常检测采用特征重要性排序前几项及 accZ RMS,聚类数 [32],Studio 自动推荐:

图 24: 异常检测模型训练界面
图 24: 异常检测模型训练界面

测试

用采集阶段预留的 20% 数据测试模型,准确率近 95%。可分析错误样本,若为特殊情况可补充进训练集后重训。

分类默认置信度阈值为 [0.6],异常检测为 [0.3]。四分类输出和为 1.0,可自定义有效类别阈值(如 0.4),在 Classify all 按钮旁三点菜单设置。

图 25: 模型测试与阈值设置界面
图 25: 模型测试与阈值设置界面

也可用设备实时采集数据进行 Live Classification(模型实际运行在 Studio 端)。

注意:此时模型未部署在设备本地,推理在 Studio 端完成。

部署

现在可将预处理与训练模型一并部署到 Nicla。Studio 会打包所需库、预处理函数和模型,下载为 Zip 文件。选择 Arduino Library,底部可选 Quantized (Int8)Unoptimized (float32),点击 [Build]

图 26: 模型部署界面
图 26: 模型部署界面

在 Arduino IDE Sketch 菜单选择 Add.ZIP Library,导入下载的 Zip 文件,终端提示 Library installed

推理

现在可完全脱离 Studio 进行推理测试。以 Nicla_vision_fusion 示例为例:

图 27: 推理代码示例选择界面
图 27: 推理代码示例选择界面

Edge Impulse 示例代码采用 sensor fusion,即 IMU(加速度计、陀螺仪)与 ToF 结合。开头包含相关库:

/* Includes ---------------------------------------------- */
#include <NICLA_Vision_Movement_Classification_inferencing.h>
#include <Arduino_LSM6DSOX.h> //IMU
#include "VL53L1X.h" // ToF

实际项目可仅保留所需库,示例代码可直接测试。

上传代码,按两次 [RESET] 进入 boot 模式(断开 Studio 连接),上传 sketch。

模拟不同运动(与采集阶段一致),在串口监视器观察推理结果:

  • 静止与叉车
图 28: 静止与叉车推理结果
图 28: 静止与叉车推理结果
  • 海运与陆运
图 29: 海运与陆运推理结果
图 29: 海运与陆运推理结果

上述各类 anomaly score 均小于 0。尝试未见过的运动(如翻滚、倒置),模拟集装箱落海或事故:

  • 异常检测
图 30: 异常检测推理结果
图 30: 异常检测推理结果

此时 anomaly 大于 1.00,异常明显。

后处理

模型验证通过后,建议修改代码,实现 NiclaV 脱机(电池/充电宝/独立 5V 供电)时的 LED 指示:

  • 检测到 terrestrial,点亮绿灯
  • 检测到 maritime,点亮红灯
  • 检测到 lift,点亮蓝灯
  • 检测到 idle,全灭
  • 检测到异常,可点亮白灯(全亮)

总结

本教程相关 notebook 与代码见 GitHub

运动分类与目标检测可广泛应用于各行业,以下为部分典型场景:

应用案例

工业与制造

  • 预测性维护:检测机械运动异常,提前预警故障
  • 质量控制:监控流水线/机械臂运动精度,检测偏差
  • 仓储物流:自动化管理货物运动,异常搬运检测

医疗健康

  • 患者监护:检测老人/行动不便者跌倒或异常动作
  • 康复训练:监控康复患者运动模式,评估恢复进度
  • 活动识别:健身/健康应用中的运动类型分类

消费电子

  • 手势控制:通过特定动作控制设备,如挥手开灯
  • 游戏:增强体感游戏体验

交通与物流

  • 车辆远程监控:检测急刹、急转、事故等异常行为
  • 货物监控:运输途中异常运动检测,防止破坏/篡改

智慧城市与基础设施

  • 结构健康监测:检测建筑/桥梁振动,预警故障
  • 交通管理:分析人流/车流,优化城市出行

安防与监控

  • 入侵检测:识别异常运动模式,防范安全事件
  • 野生动物监测:检测偷猎或动物异常活动

农业

  • 设备监控:跟踪农机运行状态
  • 动物行为分析:监测牲畜健康与压力

环境监测

  • 地震活动:检测地震前异常运动
  • 海洋观测:研究波浪/海洋运动

Nicla 3D 外壳案例

实际应用中可为设备加装外壳。Eoin Jordan(Edge Impulse)开发了适用于 Nicla 系列的可穿戴/机器健康外壳,支持磁吸、螺丝、绑带固定,适合人/机健康场景。详见: Arduino Nicla Voice and Vision Wearable Case

图 31: Nicla 3D 外壳实物图
图 31: Nicla 3D 外壳实物图

运动分类与异常检测应用广泛,Arduino Nicla Vision 以低功耗、边缘计算、小巧高效等优势,非常适合便携、远程、实时处理等场景。

参考资源

文章导航

章节完成

恭喜完成本章节!下一章节即将开始。下一章节:Seeed XIAO ESP32S3 微控制器实验

章节概览

评论区