使用智能手机进行人类活动识别

2025 年 6 月 20 日 | 19 分钟阅读

HAR(人类活动识别)使用手机或可穿戴设备的数据来识别某人正在进行的身体运动。这个问题很棘手,因为需要处理大量数据;数据不断流动,传感器感知到的东西与实际发生的事情之间的关系往往是间接的。传统方法通过手动创建特征,使用固定的时间窗口和决策树集成等模型,这需要领域知识才能应用。

相反,最近的技术,如循环神经网络 (RNNs) 和一维卷积神经网络 (1D CNNs),在 HAR 任务上取得了创纪录的结果,即使没有特征工程,这使得它们更容易应用于更多情况。

在本教程中,我们将使用智能手机活动识别 (ARUOS) 数据集,该数据集常用于时间序列分类研究。您将掌握以下能力:

  • 将数据集提供给程序进行检查。
  • 尝试使用折线图、直方图和箱线图查看运动数据。
  • 清晰地概述问题,整理数据,使用深度学习模型并检查它们的表现如何。

理解人类活动识别

HAR 意味着使用传感器数据来判断一个人正在进行的活动。通常,此类活动指的是进行典型的运动,例如坐、站、走、跳或在室内上下楼梯。通常,放置在身体某处(通常是可穿戴设备或智能手机)的加速度计传感器会记录沿所有三个轴(x、y、z)的运动数据。

HAR 旨在确保计算机能够分析人类行为并做出适当的响应。

由于没有一套固定的通用规则将传感器信息与活动类型联系起来,因此 HAR 是一个复杂的过程。它还依赖于管理大量时间序列数据,并且在过去,主要由人们通过运用他们对行业的理解来创建特征。

使用深度学习进行 HAR 的数据分析取得了成功,它自动发现有用的模式和特征,因此工程师无需为这些系统设计复杂的输入。

用于活动识别的智能手机数据

2012 年,意大利热那亚大学的 Davide Anguita 及其同事创建了智能手机活动识别数据集,该数据集已成为衡量人类活动识别的流行工具。您可以在他们 2013 年的论文《用于人类活动识别的智能手机公共领域数据集》中阅读完整的解释,而他们 2012 年的研究将其建模为多类别、硬件高效的支持向量机 (SVM)。

“UCI 机器学习库”免费提供该数据集。

数据收集

数据来自 30 名年龄在 19 到 48 岁之间的参与者。

在进行六项活动时,所有受试者都将三星 Galaxy S II 智能手机佩戴在腰部。

  • 走路
  • 上楼
  • 下楼

带有加速度计和陀螺仪的智能手机每秒以 50 赫兹的速率收集传感器数据(沿三个轴的加速度数据和沿 x、y 和 z 轴的旋转速度数据)。

每次任务都在手机处于不同位置的情况下进行测试,总是先左后右。

所有活动都通过视频捕获,之后进行双重检查和标记以确保准确性。

数据预处理

数据集不包含传感器捕获的所有原始信息。它不发送原始数据;它首先通过一系列步骤处理数据

  • 对来自加速度计和陀螺仪的数据添加噪声过滤器。
  • 将数据分成 2.56 秒的窗口(每个窗口 128 个读数),并确保下一个窗口与前一个窗口重叠 50%。
  • 将加速度计数据分成运动和重力对身体的影响。
  • 使用常用的时域和频域方法从每个窗口中提取了 561 个特征。

数据集格式

在数据集中,70% 用于训练,30% 用于测试,这种划分基于 20 名参与者(21 名用于训练,9 名用于测试)的数据和 ID,保证每个参与者只出现在一个集合中。

建模的目的是根据工程特征预测未来 2.56 秒内将发生什么活动。

初步结果

通过应用适合移动设备的 SVM(采用定点算术),作者在测试集上取得了 89% 的准确率,他们的结果与传统 SVM 实现的结果相似。

这些数据现已成为检查机器学习和深度学习技术在人类活动识别任务中表现的主要指导方针。

下载数据集

人们可以通过从 UCI 机器学习库下载智能手机活动识别数据集来获取它。

它以 ZIP 压缩包(58 MB)的形式提供:UCI HAR Dataset.zip 文件

下载完成后,将所有内容放入您的工作目录中名为“HARDataset”的文件夹中。

文件结构中的文件夹是如何创建的?

收集完成后,数据集包含以下内容

一个 README.txt 文件,详细解释了数据集包含的内容以及每个文件的信息。

有一个 features.txt 文件,包含所有 561 个工程特征的描述。

Bin 和 Networking 是两个主要文件夹

  • 将数据分成 70% 用于训练(训练/验证集)。
  • 在测试期间(使用 30% 的数据),将模型的预测与正确答案进行比较,以了解模型处理从未见过的数据的能力。

每个文件夹内都有一组文档

  • X_train.txt / X_test.txt:由每个条目的多个特征创建的数据。
  • y_train.txt / y_test.txt:数据集中每个活动被赋予的标签(1-6)。
  • 这些文件中包含受试者 ID(1-30)。
  • 惯性信号/(原始能量数据):来自传感器的经过处理的信息。

惯性信号列表

在 Inertial Signals 子目录中,您将找到每组(训练/测试)九个文件

  • 总加速度(重力 + 身体运动)
  • 身体加速度(仅运动)
  • 身体陀螺仪(角速度)

每个文件都有以空格分隔的列,并且值在 -1 到 1 之间,如 README.txt 中所述。

本研究的特殊之处

本教程将重点介绍 Inertial Signals 文件夹中发现的原始、预处理的传感器数据。这些文件可以直接用于训练机器学习模型,这意味着您无需自己进行特征工程。

将数据加载到数据库

我们将在此处编写代码,将 HAR 数据集加载到内存中,以便进行建模。

步骤 1:打开单个文件

我们可以通过使用 pandas.read_csv() 并设置 header=None 和 delim_whitespace=True 来加载单个传感器数据文件,因为这些文件是空格分隔且没有标题的

示例用法

输出

 (7352, 128)

每行有 128 个样本用于每个特征,这代表一个 2.56 秒的时间窗口。

步骤 2:同时上传多个文件

要加载多变量时间序列数据,例如来自同一传感器的 x、y 和 z 轴,我们可以使用 NumPy 的 dstack() 沿着第三轴堆叠数据数组

示例用法

输出

 (7352, 128, 3)

步骤 3:加载整个数据集(训练或测试)

接下来,我们将使用辅助函数加载一组(训练或测试)的所有九个信号及其对应的活动标签

步骤 4:加载训练集和测试集

有了这个功能,我们现在可以加载训练集和测试集。

所有数据点都是 128 个时间步长,由 9 个特征(来自所有传感器轴)组成。每个样本都分配有标准类别中的活动标签。

HAR 数据集类别平衡检查

在训练任何模型之前,我们还需要确保数据集是平衡的(即,每个活动类别以大致相同的示例数量表示)。平衡数据集之所以被使用,是因为它有助于避免训练过程中的偏差,或者例如,提供更好的泛化能力。

30 名受试者应该已经完成了所有六项活动。检查此假设还可以确保我们在数据加载步骤中没有遗漏任何内容。

总结类别分布函数

我们定义一个辅助函数 class_breakdown(),它

  • 将 NumPy 数组作为输入并将其转换为 Pandas DataFrame
  • 从按类别标签区分的数据创建组。
  • 它打印每个类别的计数和百分比。

加载标签并检查平衡

现在,我们加载训练和测试标签,并单独总结类别分布,然后检查组合的细分。

输出

 Train Dataset
Class=1, total=1226, percentage=16.676
Class=2, total=1073, percentage=14.595
Class=3, total=986,  percentage=13.411
Class=4, total=1286, percentage=17.492
Class=5, total=1374, percentage=18.689
Class=6, total=1407, percentage=19.138

Test Dataset
Class=1, total=496,  percentage=16.831
Class=2, total=471,  percentage=15.982
Class=3, total=420,  percentage=14.252
Class=4, total=491,  percentage=16.661
Class=5, total=532,  percentage=18.052
Class=6, total=537,  percentage=18.222

Combined Dataset
Class=1, total=1722, percentage=16.720
Class=2, total=1544, percentage=14.992
Class=3, total=1406, percentage=13.652
Class=4, total=1777, percentage=17.254
Class=5, total=1906, percentage=18.507
Class=6, total=1944, percentage=18.876

绘制单个受试者的时间序列数据

鉴于人类活动识别 (HAR) 数据集以时间序列作为数据,因此有必要审查原始信号。这证实了数据的质量,并发现了与不同体育锻炼相关的规律性。

数据样本的 50% 传感器读数通过从前一个样本中获取而重复,因此必须小心去除这些重复点。

步骤 1:加载训练数据

使用名为 load_dataset() 的辅助函数加载训练集中的所有数据。

步骤 2:加载机身之后,加载您的主题映射。

数据集中的每个主题都在不同的行中。文件通过 load_file() 加载,并提取唯一主题。

步骤 3:从单个主题数据中获取信息

有一个名为 data_for_subject() 的函数,它过滤数据集以仅提供来自已保存主题的样本。

步骤 4:组合重叠窗口以创建一条平面序列

因为我们不想要重复内容,所以我们使用 to_series() 将每个窗口的第二部分转换为一维序列。

步骤 5:显示每个传感器通道及其记录内容的图表

plot_subject() 函数创建了 10 个垂直堆叠的子图

  • 有九个传感器通道(所有三种加速度和所有三个陀螺仪)。
  • 1 用于使用的活动标签序列。

完整示例

输出

Human Activity Recognition Using Smartphone

绘制每个受试者的直方图

在这项工作中,一些个体的数据用于训练,其他受试者的数据用于测试。确保所有受试者的传感器数据彼此相似,特别是由于原始数据已标准化为 -1 到 1 之间。

受试者的相似活动应该产生几乎相同的传感器信号。通过查看多个受试者中所有传感器通道的直方图,我们可以更好地检查这一点。

此函数为每个受试者绘制一个直方图,显示他们某种传感器类型(如总加速度)的数据分布情况。对于每个主题

  • 它绘制了该传感器类型附带的三个核心轴(X、Y、Z)的直方图。
  • 使用一百个 bin 可以更轻松地显示数据。
  • 所有图都使用 -1 到 1 的通用 x 轴范围进行比较。

示例

输出

Human Activity Recognition Using Smartphone

绘制每个活动的直方图

了解运动数据区分不同活动能力的一种方法是检查当受试者在活动之间切换时数据模式如何变化。

如果数据点的分布因活动而异,则意味着模型很可能会发现它们之间的差异。

我们可以在以下情况下做到这一点

  • 按您正在做的事情对时间窗口进行分组。
  • 为每个不同的活动制作总加速度矢量(X、Y、Z)的直方图。

它向我们展示了当一个人从一项活动切换到另一项活动时,即使是同一个人参与了这两项活动,传感器信息也会如何变化。

步骤 1:按活动分组数据

此函数接收 XData 并对其进行组织,以便每个活动 ID 都链接到正确的数据窗口。

步骤 2:为每个活动制作直方图

示例

输出

Human Activity Recognition Using Smartphone

绘制活动持续时间箱线图

理解活动数据取决于检查每个人活动标签的平衡程度。

如果受试者使用某些活动比其他活动多得多,模型可能会偏向频繁的活动。

这可以通过以下方式进行检查

我们跟踪每个受试者进行每项活动的数据窗口(样本)数量。

下一步是将数据显示为箱线图,它说明了

  • 箱子中有一条线代表中位数持续时间
  • 箱线图中的箱子显示四分位距 (IQR)。
  • “须”是分布的窄端(最小值和最大值)。
  • 以及任何不符合一般趋势的点(有时称为离群值)。

示例

输出

Human Activity Recognition Using Smartphone

建模方法

本节阐述了使用活动识别数据集的重要策略,并按项目的主要组成部分(如问题框架、数据准备、模型构建和评估)对它们进行分组。

问题框架

目标是根据从其他数据集学习到的运动窗口来判断受试者正在做什么。这种测试方式类似于人们实际使用应用程序的方式。框架的其他方法可以是只使用一个时间点、一系列窗口或注意到活动转换。有些可视化可能不完全正确,但它们在查看数据时提供了有用的线索。

数据准备

尽管数据是 [-1, 1],但仍然存在有用的预处理技术。您需要标准化或规范化您的信号(对于每个受试者或全局),选择要保留的特征(按轴或传感器类型),并消除异常值。通过过采样或欠采样以及平衡采样率来改变样本数量是提高学习能力的另一种方法。

预测建模

这是一个处理时间序列数据的多类分类问题。最初的工作开始于使用工程特征和 SVM 进行比较。其他值得尝试的机器学习方法包括常规机器学习算法、MLP、1D CNN、LSTM 和混合风格,如带有 LSTM 的 CNN,特别是用于处理原始数据。

模型评估

数据集最初被划分为 70% 用于训练,其余用于测试。更好的交叉验证方法是按受试者划分,因为这允许分析所有受试者。准确率和混淆矩阵应该是评估的一部分,因为这些显示了哪些活动被错误地分类为其他活动。

结论

您使用智能手机活动识别数据集对时间序列数据进行分类,并了解了如何为建模准备数据。您能够下载和加载运动数据集,并使用折线图、直方图和箱线图来查看数据的结构和排列。最后,您掌握了如何在建模过程中继续前进的技能,这意味着构建问题、准备数据、选择最佳模型并评估其结果。