1. IMU 数据
一般由 6 轴或者 9 轴数据组成,单位是 g ,也是是重力加速度单位 1g=9.81 m/s2 。例子如以下所示:
csv
,Acc_x,Acc_y,Acc_z,Gyro_x,Gyro_y,Gyro_z,Mag_x,Mag_y,Mag_z,label
0,-0.109497,-0.130493,-1.009521,-21.827697,2.431869,-17.713546,-45.6501,46.182479,-7.128815,Eating/Drinking
1,-0.109985,-0.087036,-1.02417,-18.714904,2.187729,-18.018722,-44.1501,46.632476,-4.578812,Eating/Drinking
2,-0.133423,-0.087036,-1.01001,-5.470276,-1.470566,-18.445968,-44.750106,47.532485,-4.428818,Eating/Drinking
1.1 三轴加速度 Acc_x,Acc_y,Acc_z
测量物体直线方向上的加速度,永远包含地球重力。它的作用如下:
- 判断倾斜角度(俯仰、横滚)
静止的时候,重力在三个轴上分配不一样。手机倾斜,Acc‑z、Acc‑x 读数就变,就能算出板子歪了多少度。
局限:只有静止 / 慢速时角度才准;一动起来有运动加速度,角度就不准了。
- 检测震动、冲击、跌落
突然摔下去,加速度会剧烈变化。比如猫咪跌倒检测、手环计步、碰撞报警。 - 计步、运动识别
走路、跑步时身体上下晃动,Acc_z 周期性起伏,就能数步数。 - 理论积分得到速度、位移(不推荐单用)
加速度积分 → 速度;速度再积分 → 位置。
❌ 致命缺点:噪声会快速累积漂移,几秒位置就完全跑偏。不能单独用 Acc 做定位。
加速度每列字段的含义:
| 字段 | 数值 > 0 | 数值 < 0 | 数值 ≈ 0 | 数值突然很高 |
|---|---|---|---|---|
| Acc_x | 沿 X 轴正向加速(如板子向右倾) | 沿 X 轴负向加速(如板子向左倾) | X 方向无重力分量、无加速度 | 冲击 / 震动方向偏向 X 轴 |
| Acc_y | 沿 Y 轴正向加速(如前倾) | 沿 Y 轴负向加速(如后倾) | Y 方向无重力分量、无加速度 | 冲击 / 震动方向偏向 Y 轴 |
| Acc_z | Z 轴朝上,静止≈+9.81 | Z 轴朝下,静止≈‑9.81 | 失重 / 自由下落瞬间 | 跳跃落地、撞击、剧烈抖动(如 20‑40) |
1.2 三轴陀螺仪 Gyro_x,Gyro_y,Gyro_z
测量绕 X/Y/Z 轴转得有多快(角速度),作用如下:
-
捕捉瞬间旋转动作
快速扭头、翻身、转身,陀螺仪立刻读到转速。
例:猫咪快速甩头、无人机快速转弯。
-
积分算出旋转角度
角速度 × 时间 = 转过多少角度。
例:Gyro_x=50°/s,持续 0.2s → 绕 X 轴转了 10°
- 短时间内姿态非常精准
转动的一瞬间,陀螺仪比加速度计靠谱得多。
测量绕轴旋转的角速度,单位 rad/s 或 °/s;静止理想值≈0,正负代表转向
| 字段 | 数值 > 0 | 数值 < 0 | 数值 ≈ 0 | 数值突然很高 |
|---|---|---|---|---|
| Gyro_x | 绕 X 轴正向旋转(向前翻滚) | 绕 X 轴反向旋转(向后翻滚) | 无绕 X 轴转动 | 快速翻滚、翻身 |
| Gyro_y | 绕 Y 轴正向旋转(抬头) | 绕 Y 轴反向旋转(低头) | 无绕 Y 轴转动 | 猛地抬头 / 低头 |
| Gyro_z | 绕 Z 轴正向旋转(顺时针转头) | 绕 Z 轴反向旋转(逆时针转头) | 无水平转向 | 快速转头、转身 |
1.3 Acc 加速度和 Gyro 陀螺仪的融合
加速度计 Acc: 适合计算生物是否为 active(剧烈 Active 或者轻轻 Active,运动步数,摔倒次数,横移速度);
- 个人运动计划也是这么来的;
陀螺仪 Gyro: 适合计算翻滚、掉头这些内容;
| 行为 | 依靠什么信号 |
|---|---|
| 猫咪安静趴着不动 | Acc_z≈1g,所有 Gyro≈0 |
| 猫咪抬头低头 | Gyro_y 出现峰值,Pitch 角度变化 |
| 猫咪左右扭头 | Gyro_z 出现峰值,Yaw 变化 |
| 猫咪翻身打滚 | Gyro_x 剧烈变化,Roll 大幅度摆动 |
| 猫咪奔跑跳跃 | Acc 出现剧烈波动、冲击尖峰 |
2. IMU 数据预处理
2.1 下采样多数类
数据有一种情况,数据集天然不平衡,A 类目样本极多;B 类目样本极少。模型容易偷懒:一直预测大类,小类识别很差。
- Resting 只留下原数据 10%;Walking 留下 30%
python
# 下采样 Resting - 保留 10%
resting_mask = df['label'] == 'Resting'
resting_df = df[resting_mask].sample(frac=0.1, random_state=42)
# 下采样 Walking - 保留 30%
walking_mask = df['label'] == 'Walking'
walking_df = df[walking_mask].sample(frac=0.3, random_state=42)
2.2 过采样少数类
少数类样本太少,复制重复已有样本扩充数量
⚠️ 缺陷:简单重复过采样容易过拟合,模型死记硬背少数样本;更好方案:SMOTE 时序增强、窗口随机抖动、数据增强,而不是单纯复制。
json
pooping_mask = df['label'] == 'Pooping/Urinating'
running_mask = df['label'] == 'Running'
scratching_mask = df['label'] == 'Scratching'
pooping_df = df[pooping_mask]
running_df = df[running_mask]
scratching_df = df[scratching_mask]
# 过采样(重复采样)
pooping_oversampled = pooping_df.sample(n=len(pooping_df)*4, replace=True, random_state=42) # 5倍
running_oversampled = running_df.sample(n=len(running_df)*6, replace=True, random_state=42) # 7倍
scratching_oversampled = scratching_df.sample(n=len(scratching_df)*2, replace=True, random_state=42) # 3倍
结论: 这没啥用,容易直接过拟合;
2.3 取出 IMU 特征 + 标准化
对训练数据进行重采样:
如果你只用单独一行 6 个数字喂给模型,你只看见了某一个瞬时角速度,看不到上升、下降的完整波形,神经网络根本无法区分:抬头 / 低头 / 身体抖动。所以我们需要 window 来选取数据序列:
- window_size = 40 代表:
一条训练样本 = 连续 40 行 IMU 数据
样本形状:
(40, 6)
一条样本的时间间隔依靠 IMU 的采样率(我们的设备):
- IMU 数据的采样率
40Hz(每秒采集 50 次),一条数据间隔0.025s;
所以,我们需要对 50Hz 的数据进行重采样,保证推理和训练的时间尺度一致: