mediaPose-python实现细节
概述
介绍
BlazePose可以启用的应用程序之一是健身。更具体地说-姿势分类和重复计数。在本部分中,我们将提供有关在Colabs的帮助下构建自定义姿势分类器的基本指南,并将其包装在ML Kit快速入门应用程序中的简单健身演示中。俯卧撑和蹲坐是最常见的练习,用于演示目的。
我们选择了k最近邻算法(k-NN)作为分类器。一开始很简单。该算法根据训练集中最接近的样本确定对象的类别。
To build it, one needs to:
- 收集目标运动的图像样本并对其进行姿势预测,
- 将获得的姿势界标转换为适合k-NN分类器的表示形式,并使用这些Colabs形成训练集,
- 执行分类本身,然后进行重复计数(例如,在ML Kit快速入门应用中)。
训练集(Training Set)
为了建立一个好的分类器,应该为训练集收集适当的样本:每个练习的每个最终状态约有几百个样本(例如,俯卧撑的“上”和“下”位置)。收集的样本必须涵盖不同的相机角度,环境条件,身体形状和运动方式,这一点很重要。
要将样本转换为k-NN分类器训练集,可以使用“Pose Classification Colab”(“Basic”)和“Pose Classification Colab”(“Extended”)。他们使用Python Solution API 在给定图像上运行BlazePose模型,并将预测的姿势界标转储到CSV文件中。此外,Pose C;assification Colab(Extended)提供了有用的工具,可通过将每个样本与整个训练集进行分类来查找异常值(例如,错误预测的姿势)和代表性不足的类别(例如,未涵盖所有摄像机角度)。之后,您就可以在Colab中的任意视频上测试分类器。
分类器(Classification)
Pose Classication Colab(Extended)和ML Kit快速入门应用程序中都提供了分类器的代码。请参考他们以了解以下方法的详细信息。
用于姿势分类的k-NN算法需要每个样本的特征向量表示和一个度量来计算两个这样的向量之间的距离,以找到最接近目标样本的姿势样本。
要将姿势界标(pose landmarks)转换为特征向量,我们使用姿势关节的预定义列表之间的成对距离,例如手腕和肩膀,脚踝和臀部之间的距离以及两个手腕。由于该算法依赖于距离,因此在转换之前将所有姿势标准化为具有相同的躯干大小和垂直躯干方向。
为了获得更好的分类结果,请使用不同的距离度量两次调用k-NN搜索:
- 第一,要滤除与目标样本几乎相同但在特征向量中只有几个不同值的样本(这意味着弯曲的关节不同,因此还有其他姿势类别),则将最小每坐标距离(minimum oer-coordinate)用作距离度量。
- 第二,使用平均每坐标距离(average per-coordinate)在第一次搜索中找到最近的姿势聚类(pose cluster)。
最后,我们应用指数移动平均(EMA)平滑技术(exponential moving average smoothing)来平整来自姿态预测或分类的任何噪声。为此,我们不仅搜索最近的姿势聚类,而且还计算了每个姿势聚类的概率,并将其用于随时间的平滑。
重复计数(Repetition Counting)
为了计算重复次数,该算法监视目标姿势类别的概率。让我们以“ up”和“ down”终端状态进行俯卧撑:
- 当“down”姿势类的概率首次超过某个阈值(threshold)时,该算法会标记为输入了“down”姿势类的概率。
- 一旦概率降至阈值以下,该算法将标记“down”姿势类别已退出并增加计数器。
未来工作(Future Work)
我们正在积极致力于改善 BlazePose GHUM 3D’Z prediction 。这将使我们能够在特征向量中使用关节角度,这些角度更加自然且易于配置(尽管距离对于检测身体部位之间的触摸仍然有用),并且可以对姿势进行旋转归一化(rotation normalization)并减少所需的摄像机角度数量用于准确的k-NN分类。