实战 | 使用姿态估计算法构建简单的健身训练辅助应用程序

2024-10-29 08:30   重庆  

点击下方卡片,关注“机器视觉与AI深度学习

视觉/图像重干货,第一时间送达!

姿态估计简介
    姿势估计是一个研究深入的领域,可应用于动作识别、活动跟踪、增强现实、动画、游戏等。姿势估计的目标是检测图像或视频中人体部位(如关节和四肢)的位置和方向。
    姿态估计主要有两种方法:单人姿势估计和多人姿势估计。单人姿势估计可以找出图像中一个人的姿势。它知道这个人在哪里,以及要寻找多少个关键点,这是一个回归问题。多人姿势估计则有所不同。它试图解决一个更难的问题,即图像中有多少人,他们的位置都是未知的。
    单人姿势估计可以进一步分为两种框架:基于直接回归和基于热图。基于直接回归的框架从特征图中预测关键点。基于热图的框架生成图像中所有关键点的热图,然后使用其他方法构建最终的火柴人图。
寻找正确的关键点检测模型
    目前可用的一些最佳模型(例如OmniPose)拥有令人印象深刻的准确性。同样引起我注意的是OpenMMLab 的姿势估计工具箱。它为与姿势估计相关的所有内容提供了一个全面而强大的框架,包括用于比较不同模型的基准。
    我一直在寻找一个简单而轻量级的解决方案,因此我决定使用 Google 的 MoveNet。MoveNet 是一个紧凑而高效的姿势估计模型,非常适合移动和嵌入式设备。MoveNet 只有约 4M 个参数,而 OmniPose 有约 68M(精简版约 20M)。它的小巧和简单使其成为我项目的理想选择,让我可以快速进行实验和原型设计,而无需大量计算资源。虽然它可能无法提供与某些更高级模型相同的准确度,但它是我项目的绝佳起点。
MoveNet
    MoveNet 是如何工作的呢?简而言之,MoveNet 使用热图来准确定位人体关键点。这是一个自下而上的估计模型,这意味着它首先检测一个人的人体关节,然后将这些关节组装成姿势。
    MoveNet 架构由两个主要组件组成:
    1. 特征提取器:带有附加特征金字塔网络的 MobileNetV2。MobileNetV2 是一种轻量级卷积神经网络,非常适合移动和嵌入式设备。特征金字塔网络允许 MoveNet 以多种尺度捕获特征,这对于检测距离摄像头不同距离的关键点非常重要。
    2. 预测器头:一组预测器头连接到特征提取器。这些预测器头负责预测:
    • 实例(人)的几何中心
    • 该人的完整关键点
    • 所有关键点的位置
    • 从每个输出特征图像素到每个关键点的精确子像素位置的局部偏移
    MoveNet 可在 TensorFlow Hub 上使用,并附带大量教程、文档和随附代码,让我的入门尽可能顺利。但真正让我印象深刻的是,MoveNet 甚至可以在浏览器中运行,在大多数现代设备(包括智能手机)上实现 30+ FPS。这使其成为健身、健康和保健应用的理想选择,因为实时反馈和低延迟至关重要。
https://www.tensorflow.org/hub/tutorials/movenet
提取关键点
    MoveNet 可检测全身从鼻子到脚踝的 17 个关键点。该模型输出一个 17x3 的张量,其中每行代表关键点的标准化 X 和 Y 坐标以及置信度分数。
    我对记录的结果进行了定性分析,对关键点检测的质量感到满意。该模型能够准确地检测出我身体上的关键点,但我的记录光线充足,角度清晰。该模型提供的置信度分数也很好地表明了检测的可靠性,让我能够过滤掉任何置信度低的关键点。
    总的来说,MoveNet 模型的性能给我留下了深刻的印象,并发现它是从我的记录中提取关键点的可靠工具。
从帧到序列——对齐记录
    虽然从单个帧中提取关键点是至关重要的一步,但这对于实际应用来说还不够。我们必须把眼光放得更远,而不仅仅是单个帧,还要考虑到记录可能不完全对齐的事实。在这种情况下,逐帧比较关键点会产生错误的结果。如果一个记录比另一个记录早几分之一秒开始,那么两个记录中的关键点就不会匹配,即使动作相同。为了让分数真正有用,我必须对齐每个记录的帧。
    为了实现这一点,我在视频编辑软件中手动完成了大部分工作。我修剪和调整了录音,以确保它们同步。为了进一步完善对齐,我使用了动态时间扭曲 (DTW)。这是一种允许比较可能具有不同长度或时间的序列的技术。DTW 有助于微调对齐,确保每个录音的关键点尽可能准确地匹配。
    在我的简单用例中,使用 DTW 细化进行手动对齐是可行的。这是一项劳动密集型工作,因此,对于实际应用来说,这不是一个可扩展的解决方案。对于此类应用,对齐记录的过程必须自动化。这是另一个挑战,也是一篇完全独立的文章的主题。自动对齐需要开发能够准确同步记录的算法,即使在存在噪声、可变性和其他现实世界复杂性的情况下也是如此。
比较动作
    现在我已经对齐了序列,我需要将我的动作与专业人士的动作进行比较。为此,我使用了余弦相似度,这是姿势估计问题领域中广泛使用的度量。
    余弦相似度是两个向量之间相似度的度量,计算两个向量之间角度的余弦。在姿势估计中,它通常用于比较两组关键点(例如身体关节或面部特征点)之间的相似度。余弦相似度指标之所以被广泛使用,是因为它对比例和旋转变化具有很强的鲁棒性,非常适合比较姿势。
    这个简单的指标还有许多变体,我尝试了其中几个来查看它们的表现。结果和想法如下。
    我录了两次自己的动作——第一次我尽可能正确地做这个练习(下面 GIF 的左侧)。第二次我尝试做错(下面 GIF 的右侧)——注意在动作的第一阶段我的背部前倾太多。做这个练习的专业人士在中间(参考)。
左:我正确地做运动,中:专业人士,右:我错误地做运动。
简单余弦相似度
    我能想到的最简单的衡量标准就是一次性查看整个动作。我只需将所有关键点连接成一个形状为[num_frames * 17 (num_keypoints) * 2 (coordinates)]的向量,然后计算我和专业人士之间的余弦相似度。结果是:
    • cos_sim(correct_movement, professional) = 0.8409
    • cos_sim(incorrect_movement, professional) = 0.8255
    显然,第二次运动与参考运动的相似度较低,但差异的幅度(0.0154)并不大。
逐帧计算并平均
    我的第二种方法是利用帧对齐的事实,计算相应帧上的关键点(在相应的运动阶段)的余弦相似度并取平均值。

左:我正确地做运动,中:专业人士,右:我错误地做运动。
图表展示逐帧余弦相似度。
    看看上面的图表,我可以得出这样的结论:右侧的运动与参考运动不太相似(因此更糟糕)。右侧的分数一直下降到 0.79,并且(几乎)总是低于左侧的分数。
    平均分数几乎与第一种方法相同:
    • mean cos_sim(correct_movement, professional) = 0.8411
    • mean cos_sim(incorrect_movement, professional) = 0.8256
    • median cos_sim(correct_movement, professional) = 0.8399
    • median cos_sim(incorrect_movement, professional) = 0.8257
加权相似度
    我还没有利用 MoveNet 返回的第 3 个分数——关键点置信度分数。

参考记录上的关键点置信度
    一些关键点(如左肘)在参考记录中几乎看不见。当我尝试从类似的角度进行记录时,我的记录也是如此。
    在计算加权余弦相似度时,我使用置信度分数作为权重。它应该会更多地关注两个记录中清晰可见的关键点。这种方法得出了以下分数:
    • mean cos_sim(correct_movement, professional) = 0.8135
    • mean cos_sim(incorrect_movement, professional) = 0.7976
    分数可以证实,第二次动作比第一次动作差,但差别很小。对于生产用途,必须进一步调整指标。

未来的改进

    当我回顾我的项目时,我发现有两个主要方面可以改进:
    从技术角度来看,有几种方法可以增强姿势估计算法。例如,改进和调整比较指标可以更准确地评估运动形式。另一种方法可能是专注于分析骨骼或整个肢体,而不仅仅是关节,这可能会提供对运动的更全面理解。此外,确保算法不受摄像机角度、光照条件和其他环境因素的影响将使其更加稳健和可靠。
    第二个需要改进的领域是生产化。为了创造无缝的用户体验,我需要完全自动化整个过程,这需要投入更多时间进行预处理和对齐数据。这将涉及弄清楚如何简化工作流程,处理潜在的技术问题,以及设计直观的界面。此外,建立一个具有各种设置(例如不同的摄像机角度和环境)的综合练习库对于为用户提供多种练习选项和场景至关重要。

—THE END—

觉得有用,麻烦给个赞和在看 

机器视觉与AI深度学习
专注于机器视觉、AI、深度学习等技术最新资讯、实战内容及应用案例的分享,交流!
 最新文章