我正在尝试构建一个基于姿态估计的模型,该模型能够识别相对于预定义动作的错误动作。例如,执行深蹲、引体向上、瑜伽等运动。如果用户没有按照指示进行动作,我需要找出姿态中的那些点。
到目前为止我尝试过的:构建了基于规则的逻辑来识别两个关节/线之间的方向和角度,并提供纠正建议。
但问题是我们无法为动作序列中的所有帧编写规则。因此,我在寻找更好的解决方案。
回答:
如果动作的时间和顺序不重要,这个想法可能会奏效。这也假设你知道正在尝试的动作(虽然这也可以修改为一种蛮力分类):
创建一种记录连续动作的方式,如你所描述的(索引关节的角度)。然后为了训练一个新的动作,收集一个“黄金集合”,其中该动作被尽可能完美地执行几次(5-10次,如果你能确保高质量的样本,1次也可以)。将这些集合合并(连接它们,不要平均或其他操作)。你可以将每个数据点视为一个高维数据点,就像xyz一样,但包含你跟踪的关节角度。如果速度/优化是一个关注点,你可能需要对这些数据进行排序以改进后续的搜索。
这取决于你关注哪些关节,但如果某些关节的移动比其他关节大得多,你可能需要对每个关节的角度数据进行归一化(即,不使用它们的原始值,而是用它们的原始值除以它们在动作中的总范围)。这样做的好处是可以防止一个移动幅度大的关节压倒一个移动幅度小但仍然重要的关节。需要注意的是,对于移动幅度非常小的关节要小心,因为归一化它们可能会显著增加噪音,所以你应该可能将任何在动作中低于某个范围的关节归零。
现在当某人正在执行动作时,获取用户数据的实时样本(关节角度,如果你进行了归一化,则与黄金数据相同的方式归一化每个关节),并在你合并的黄金样本中找到“最接近”的点。从最简单的意义上来说,“接近度”可以是一个高维距离估计。然后在比较实时数据与最接近的黄金数据时,你可以告知用户他们的当前姿势在哪些方面不准确。可以使用平方距离,因为它仅用于排序,所以你只需要找到每个维度的差异,即(angle1Difference, angle2Difference, angle3Difference,…)并求和它们的平方:即distSq = a1D x a1D + a2D x a2D +a3D x a3D…
请注意,对于给定的数据点,你需要一起捕获所有你关心的关节(独立的数据集意义较小,因为它可能允许正确的运动范围,但顺序或协调错误)