运动分类与异常检测
概述
交通运输是全球商业的支柱。每天有数百万个集装箱通过船舶、卡车、火车等多种方式运往世界各地。保障这些集装箱安全高效地运输是一项巨大挑战,而 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 库 。

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

采样频率的定义
选择合适的采样频率对于捕捉目标运动特征至关重要。Nyquist-Shannon 采样定理指出,采样率应至少为信号最高频率分量的两倍,才能完整还原信号。对于运输场景的运动分类与异常检测,采样频率选择需考虑:
- 运动特性:不同运输方式(陆运、海运等)涉及的运动频率范围不同,快速运动需更高采样率。
- 硬件限制:Nicla Vision 及其传感器的最大采样速率有限。
- 计算资源:采样率越高,数据量越大,对 TinyML 设备计算资源要求越高。
- 电池寿命:高采样率耗电更多,若为电池供电需权衡。
- 数据存储:高频采样需更多存储空间,嵌入式设备内存有限。
在人类活动识别任务中,常用采样率为 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 组数据。

注意:Nicla 静置桌面(摄像头朝下)时,$z$ 轴约为 9.8 m/s$^2$,符合地球重力加速度。
案例分析:集装箱运输场景模拟
为增强实践性,我们将模拟集装箱(或包裹)在不同运输场景下的运动。利用 Nicla Vision 板载加速度计,手动模拟以下情景并采集数据:
- 陆运(公路/铁路)——水平方向运动
- 海运——三轴混合运动
- 叉车垂直搬运——$z$ 轴为主
- 仓库存放(静止)——无运动

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

数据采集
实际应用中,设备可直接安装于集装箱,通过 SD 卡(SPI 连接)或蓝牙等方式采集并存储数据(如 Sensor DataLogger 项目 )。采集到的 .CSV 文件可用 CSV Wizard 工具 上传至 Studio。
参考此 视频 了解更多数据上传方式。
设备连接 Edge Impulse
本项目将 Nicla 直接连接 Edge Impulse Studio,进行数据预处理、模型训练、测试与部署。可选:
- 下载最新固件,直接连接
Data Collection
。 - 使用 CLI Data Forwarder 工具,将传感器数据转发至 Studio。
推荐方式 2,更灵活可自定义采样率。操作步骤:
- 安装 Edge Impulse CLI 和 Node.js 。
- 上传前述采集代码至 Nicla。
- 用 CLI Data Forwarder 采集加速度计数据并发送至 Studio:

首次运行:
edge-impulse-data-forwarder --clean
输入 EI 账号,选择项目、变量(如 accX、accY、accZ)、设备名(如 NiclaV):

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

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

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

可见 $Y$ 轴(绿色)为主,$Z$ 轴(蓝色)约 -10 m/s$^2$(摄像头朝上)。
依次采集四类场景数据:
海运(船舶,三轴混合运动):

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

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

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

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

本例数据分布良好,但 PCA 显示海运(绿)与叉车(橙)有重叠,因海运有时也为垂直运动。
Impulse 设计
下一步定义 Impulse,将原始数据信号处理后提取特征,作为 learning block 输入进行分类。进入 Impulse Design
,创建 Impulse,并添加第二个 Learning Block 用于 Anomaly Detection
。

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

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

数据预处理概述
数据预处理即从加速度计原始数据中提取特征。加速度计测量 $X$、$Y$、$Z$ 三轴加速度,可反映运动模式与振动。
原始数据常含噪声,需滤波、归一化等预处理。数据分割为窗口有助于聚焦具体事件,窗口大小与滑动步长需结合实际运动周期设定。
50Hz 采样、2 秒窗口,每轴 100 个点,共 300 个特征。每 200ms 滑动一次,生成大量样本。

常见特征包括:
- 时域特征:均值、中位数、标准差、偏度、峰度、过零率等
- 频域特征: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]
:

顶部菜单选择 Generate Features
,每个 2 秒窗口生成 63 维特征。
特征可视化用 UMAP 降维,2D 展示各类分布。
特征生成后各类分布良好,说明分类器效果可期。可进一步分析各特征对分类的贡献。

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

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

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

测试
用采集阶段预留的 20% 数据测试模型,准确率近 95%。可分析错误样本,若为特殊情况可补充进训练集后重训。
分类默认置信度阈值为 [0.6]
,异常检测为 [0.3]
。四分类输出和为 1.0,可自定义有效类别阈值(如 0.4),在 Classify all
按钮旁三点菜单设置。

也可用设备实时采集数据进行 Live Classification(模型实际运行在 Studio 端)。
注意:此时模型未部署在设备本地,推理在 Studio 端完成。
部署
现在可将预处理与训练模型一并部署到 Nicla。Studio 会打包所需库、预处理函数和模型,下载为 Zip 文件。选择 Arduino Library
,底部可选 Quantized (Int8)
或 Unoptimized (float32)
,点击 [Build]
。

在 Arduino IDE Sketch
菜单选择 Add.ZIP Library
,导入下载的 Zip 文件,终端提示 Library installed
。
推理
现在可完全脱离 Studio 进行推理测试。以 Nicla_vision_fusion
示例为例:

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。
模拟不同运动(与采集阶段一致),在串口监视器观察推理结果:
- 静止与叉车:

- 海运与陆运:

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

此时 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 。

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