作为一名健身爱好者,我一直对探索改善锻炼习惯的方法很感兴趣。一个一直让我着迷的领域是使用计算机视觉和机器学习来分析和纠正锻炼过程中的姿势。在本文中,我将分享我使用姿势估计算法构建一个简单的健身房训练辅助应用程序的历程。
NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割
1、问题陈述
当我开始在家锻炼时,我意识到如果没有私人教练或教练,保持正确的姿势是一项挑战。我希望在健身房里放镜子能有所帮助,但这还不够。我想找到一种方法来分析我的动作并收到关于我的姿势的反馈。作为一个对指标和数字非常痴迷的人,我渴望找到一种方法来量化我的进步并跟踪我随着时间的推移而取得的进步。我知道这可能无法完美地转化为像训练这样的实时活动,但我希望有一些具体的东西来让我的头脑清醒。
1.1 高级计划
我的目标是构建一个应用程序,可以分析我锻炼的视频并提供关于我的姿势的反馈。以下是我的方法的高级概述:
- 使用关键点检测模型分析锻炼视频
- 将我的动作与专业人士的动作进行比较
- 想出某种指标来告诉我锻炼是否正确。它还应突出显示需要改进的地方。
1.2 要求
当我开始探索潜在的解决方案时,我心中有几个关键要求。我想要一个易于实现的东西。我还希望它运行速度快,最好在我的 MacBook Pro M1 上运行,这样我就可以使用它并快速迭代,而无需花大价钱购买高端 GPU。我的目标是找到一种解决方案,让我能够试验和改进我的方法,而不会陷入技术细节或昂贵硬件的泥潭。考虑到这些要求,我开始探索姿势估计算法和计算机视觉的世界。
2、姿势估计简介
姿势估计是一个研究深入的领域,可应用于动作识别、活动跟踪、增强现实、动画、游戏等。姿势估计的目标是检测图像或视频中人体部位(例如关节和四肢)的位置和方向。
姿势估计。来源:2d pose estimation
姿势估计主要有两种方法:单人和多人。单人姿势估计在图像中找到一个人的姿势。它知道这个人在哪里,以及要寻找多少个关键点,这是一个回归问题。多人姿势估计则不同。它试图解决一个更难的问题,即图像中的人的数量和位置都是未知的。
单人姿势估计可以进一步分为两个框架:基于直接回归和基于热图。基于直接回归的框架从特征图中预测关键点。基于热图的框架生成图像中所有关键点的热图,然后使用其他方法构建最终的火柴人。
3、寻找正确的关键点检测模型
当我沉浸在姿势估计的世界中时,我对众多可用的关键点检测模型并不感到惊讶。目前最好的一些模型,例如 OmniPose,拥有令人印象深刻的准确性。OpenMMLab 的姿势估计工具箱也引起了我的注意。它为与姿势估计相关的所有内容提供了一个全面而强大的框架,包括比较不同模型的基准。
我一直在寻找一个简单而轻量级的解决方案,所以我决定使用 Google 的 MoveNet。MoveNet 是一个紧凑而高效的姿势估计模型,非常适合移动和嵌入式设备。MoveNet 只有约 4M 个参数,而 OmniPose 有约 68M(或精简版约 20M)。它的小巧和简单使它成为我项目的理想选择,让我可以快速进行实验和原型设计,而无需大量计算资源。虽然它可能无法提供与一些更先进的模型相同的准确度,但它是我项目的绝佳起点。
4、MoveNet
但 MoveNet 是如何工作的呢?简而言之,MoveNet 使用热图来准确定位人体关键点。这是一个自下而上的估计模型,这意味着它首先检测一个人的人体关节,然后将这些关节组装成姿势。
MoveNet 架构由两个主要组件组成:
a、特征提取器:带有附加特征金字塔网络的 MobileNetV2。MobileNetV2 是一种轻量级卷积神经网络,非常适合移动和嵌入式设备。特征金字塔网络允许 MoveNet 以多种尺度捕获特征,这对于检测距离相机不同距离的关键点非常重要。
b、预测器头:一组预测器头连接到特征提取器。这些预测器头负责预测:
- 实例(人)的几何中心
- 人的完整关键点集
- 所有关键点的位置
- 从每个输出特征图像素到每个关键点的精确子像素位置的局部偏移量使用 MoveNet 提取的关键点示例。
使用 MoveNet 提取的关键点示例。来源:MoveNet:超快速和准确的姿势检测模型
MoveNet 在 TensorFlow Hub 上可用,并附带大量教程、文档和随附代码,使我的开始尽可能顺利。但真正让我印象深刻的是,MoveNet 甚至可以在浏览器中运行,在大多数现代设备(包括智能手机)上实现 30+ FPS。这使其成为健身、健康和保健应用的理想选择,因为实时反馈和低延迟至关重要。
5、提取关键点
MoveNet 可检测全身从鼻子到脚踝的 17 个关键点。该模型输出一个 17x3 张量,其中每行代表关键点的标准化 X 和 Y 坐标以及置信度分数。
我正在做划船练习
我对我的录音结果进行了定性分析,对关键点检测的质量感到满意。该模型能够准确检测我身体上的关键点,但我的录音光线充足,角度清晰。该模型提供的置信度分数也很好地表明了检测的可靠性,让我能够过滤掉任何低置信度检测的关键点。
总体而言,我对 MoveNet 模型的性能印象深刻,并发现它是从我的录音中提取关键点的可靠工具。
7、从帧到序列 — 对齐记录
虽然从单个帧中提取关键点是至关重要的一步,但对于实际应用来说这还不够。我们必须将眼光放得更远,而不仅仅是单个帧,并考虑到记录可能并非完全对齐的事实。在这种情况下,逐帧比较关键点会产生不正确的结果。如果一个记录比另一个记录早几分之一秒开始,那么两个记录中的关键点将不匹配,即使动作相同。为了让分数真正有用,我必须对齐每个记录的帧。
为了实现这一点,我在视频编辑软件中手动完成了大部分工作。我修剪和调整了记录以确保它们同步。为了进一步完善对齐,我使用了动态时间扭曲 (DTW)。这是一种允许比较可能具有不同长度或时间的序列的技术。DTW 有助于微调对齐,确保每个记录中的关键点尽可能准确地匹配。
DTW 与欧几里得匹配。来源:Wikipedia
对于我的简单用例,使用 DTW 细化的手动对齐很有效。它是劳动密集型的,因此不是现实世界应用的可扩展解决方案。对于此类应用,对齐记录的过程必须自动化。这是另一个挑战,也是一篇完全独立的文章的主题。自动对齐需要开发能够准确同步记录的算法,即使在存在噪声、可变性和其他现实世界复杂性的情况下也是如此。
对齐的记录。左图:我,右图:专业人士
8、比较动作
现在我已经对齐了序列,我需要将我的动作与专业人士的动作进行比较。为此,我使用了余弦相似度,这是姿势估计问题空间中广泛使用的度量。
余弦相似度是两个向量之间相似度的度量,用于计算它们之间角度的余弦。在姿势估计的背景下,它通常用于比较两组关键点(例如身体关节或面部标志)之间的相似度。余弦相似度度量之所以被广泛使用,是因为它对比例和旋转的变化具有鲁棒性,非常适合比较姿势。
这个简单的度量也有很多变体,我尝试了其中的一些来查看它们的表现。结果和想法如下。
我录了两次自己的动作——第一次尽可能正确地做这个练习(下面 GIF 的左侧)。第二次我尝试做错了(下面 GIF 的右侧)——注意在动作的第一阶段我的背部向前倾斜太多。做这个练习的专业人士在中间(参考)。
左图:我正确地做运动,中图:专业人士,右图:我做运动不正确
8.1 简单的余弦相似度
我能想到的最简单的度量标准是一次性查看整个动作。我只需将所有关键点连接成一个形状为 [num_frames * 17 (num_keypoints) * 2 (coordinates)]
的向量,并计算我和专业人士之间的余弦相似度。结果是:
cos_sim(correct_movement, professional) = 0.8409
cos_sim(incorrect_movement, professional) = 0.8255
显然,第二个动作与参考动作不太相似,但差异幅度 (0.0154) 并不大。
8.2 逐帧并取平均值
我的第二种方法是利用帧对齐的事实,计算相应帧上关键点的余弦相似度(在相应的运动阶段)并取平均值。
左图:我正确地做运动,中图:专业人士,右图:我做运动不正确
逐帧余弦相似度
看上面的图表,我可以得出结论,右侧的运动与参考运动不太相似(因此更差)。右侧的分数一直下降到 0.79,并且(几乎)总是低于左侧的分数。
平均得分与第一种方法几乎相同:
- 平均 cos_sim(正确移动,专业)= 0.8411
- 平均 cos_sim(不正确移动,专业)= 0.8256
- 中位数 cos_sim(正确移动,专业)= 0.8399
- 中位数 cos_sim(不正确移动,专业)= 0.8257
8.3 加权相似度
我还没有使用 MoveNet 返回的第 3 个分数——关键点置信度分数。
参考记录中的关键点置信度
一些关键点(如左肘)在参考记录中几乎不可见。我的记录也是如此,因为我试图从类似的角度进行记录。
在计算加权余弦相似度时,我使用置信度分数作为权重。它应该更多地关注在两个记录中都清晰可见的关键点。这种方法产生了以下分数:
- 平均 cos_sim(正确移动,专业)= 0.8135
- 平均 cos_sim(不正确移动,专业)= 0.7976
再次,分数证实,第二个动作比第一个动作更差,但差异很小。对于生产用途,必须进一步调整指标。
9、未来的改进
当我反思我的项目时,我可以看到两个可以改进的主要领域。让我们深入研究它们中的每一个。
- 推进核心 CV/AI 技术
从技术角度来看,有几种方法可以增强姿势估计算法。例如,改进和调整比较指标可以更准确地评估锻炼形式。另一种方法可能是专注于分析骨骼或整个肢体,而不仅仅是关节,这可能提供对运动的更全面理解。此外,确保算法不受摄像机角度、光照条件和其他环境因素的影响,将使其更加稳健和可靠。
- 生产化和用户体验
第二个需要改进的领域是生产化。为了创造无缝的用户体验,我需要完全自动化整个过程,这需要投入更多时间进行预处理和对齐数据。这将涉及弄清楚如何简化工作流程,处理潜在的技术问题,以及设计直观的界面。此外,建立一个具有各种设置(例如不同的摄像机角度和环境)的综合练习库对于为用户提供多种练习选项和场景至关重要。
帮助我制作这篇文章的 Jupyter Notebook 可在此处获得。
原文链接:基于姿态估计的健身应用 - BimAnt