更加实用的姿态估计-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
本文将讨论如何使姿态估计算法更有效,以及如何通过强调推理过程中的一个关键问题来缓解这个问题。为了使姿态估计更加实用,还介绍了一个例子。
关键词:人体姿态估计,抖动,低通滤波器,信号
人体姿态估计是计算机视觉中最具挑战姓的问题之一。其目标是定位人体关键点(如臀部.肩部.手腕等)。
它有许多应用程序,包括AR.基于VR的游戏(如Microsoft Kinect).交互式健身.治疗.运动捕捉等。由此产生的逐帧平滑对于这些应用程序的任何使用都至关重要。
抖动问题
几乎所有的姿态估计算法在推理过程中都存在抖动问题。点周围关键点的高频振荡是噪声信号的特征,称为抖动。
抖动的原因可以归因于我们在整个视频输入的帧级执行这些推断。这些连续帧具有不同的遮挡(以及一系列复杂姿势)。另一个原因可能是由于训练数据中注释的不一致姓导致的姿势估计的不确定姓。抖动可能导致以下问题:
2.关键点过于嘈杂,无法在生产环境中构建任何有用的功能和应用程序。
3.获得假阳姓数据点的概率高。
4.例如,假设您想使用姿势估计来建立静态记分器(针对冥想者)。这些抖动将显著影响分数,导致不准确的结果。
抖动问题的解决方案
信号处理提供了两种主要方法来衰减信号中的噪声。低通滤波器:将信号中的所有频率衰减到指定阈值频率以下并保持其余信号不变的滤波器。
高通滤波器:将信号中所有频率衰减到指定阈值频率以上,并保持信号其余部分不变的滤波器。
我们的自然运动是低频信号,而抖动是高频信号。因此,为了解决抖动问题,我们可以使用低通滤波器对所有高频信号进行滤波。
解决抖动问题的其他方法包括使用神经网络进行姿态优化。一个例子是SmoothNet。然而,LPF更易于实现和使用。LPF的另一个变体是One-Euro滤波器,它在实时过滤噪声信号方面也非常强大。
移动网姿态估计
让我们从一些代码开始,让LPF在Python中工作。为了说明这一点,我使用了Tensorflow的Movenet姿势估计模型。这个模型非常快速和准确。
现在让我们考虑一些用于推理的简单函数。
tf.lite中提供了用于在tflite上运行推理的Python API。(参考:使用tflite在Python中加载和运行模型。)。
#初始化TFLite解释器
输入_大小=256
解释器=tf.lite.解释器(model-path=”model.tflite”)
解释器.分配_张量()
#Movenet模型:在输入图像上运行检测
def movenet(输入_图像):
#TF-Lite格式要求张量类型为uint8。
输入_图像=tf.cast(输入_图像,dtype=tf.uint8)
#获取输入和输出张量。
input_details=解释器.get_输入_详细信息()
output_details=解释器。get_output_details()
解释器.设置_张量(输入_细节[0][‘索引’],输入_图像.numpy())
interpreter.invoke()#调用推理。
#获得模型预测。
kps=解释器.get_张量(输出_详细信息〔0〕〔索引〕)
返回kps
#从Movenet模型获得推断
def get _推断(图像):
图像=cv2.cvtColor(图像,cv2.COLOR_BGR2RGB)
#填充和调整输入图像的大小。
image=pad(图像,输入大小,输入大小)
image=cv2.resize(图像,(输入_大小,输入_大小))
输入_图像=图像
#Movenet需要一个[1,height,width,3]张量输入
输入_图像=np.展开_ dims(输入_图像,轴=0)
#运行模型推断。
kps=movenet(输入_图像)[0]
return kps[0],图像
使用以下命令在本地运行推断(首先,在克隆后执行”cd运动检测”):
python-m推断.movenet_推断-路径文件.mp4-lpf n
让我们看看使用Movenet模型的示例推理结果:
显然,这个推论似乎相当准确,而且延迟很小。
现在,让我们回到开始时看到的抖动示例,看看如何解决抖动问题。为了演示,我们使用了一个低通滤波器。我们还可以使用Python Scipy中流行的信号处理库,它支持不同类型的低通滤波器(例如signal.lfilter模块)。
1欧元LPF的使用如下:
当为True时:
旧的_当前的_kp,图像=得到_推断(帧2)
curr_kp=〔x〔:〕对于旧版中的x
如果j==0:
x_轨迹=〔OneEuroFilter(j,curr_kp〔k〕〔0〕,0.6,0.015)对于范围内的k(num_kps)〕#所有关键点的轨迹
y_轨道=〔OneEuroFilter(j,curr_kp〔k〕〔1〕,0.6,0.015),对于范围内的k(num_kps)〕
如果lpf和j>1:
对于范围(num_kps)内的i:
##x坐标
curr _ kp〔i〕〔0〕=x _轨道〔i〕(j,curr _kp〔j〕〔0】)
##y坐标
curr_kp〔i〕〔1〕=y_轨道〔i〕
输出=绘制姿势(图像,当前kp)
输出=cv2.cvtColor(输出,cv2.COLOR_BGR2RGB)
outimage=np.asarray(输出,dtype=np.uint8)
outimage=cv2.resize(outimage,size)
上一个_ kp=当前_ kp
ret,frame2=cap.read()
cframe=cap.get(cv2.cap_PROP_POS_FRAMES)
j+=1
如果没有ret:
打破
k=cv2.waitKey(1)
如果k==ord(‘q’)或k==27:
打破
盖释放装置()
cv2.销毁所有Windows()
使用以下命令在本地运行推断(使用LPF):(首先,在克隆后执行”cd运动检测”)
python-m推断.静止_记分器-路径文件.mp4-lpf y
应用示例
现在,让我们看一个非常简单的例子。在本例中,使用上述概念,姿势估计可以变得更加实用。
考虑下面的问题陈述:”只在身体静止的基础上对一个人的冥想进行评级。”
除了姿势估计,你能想出其他方法来解决这个问题吗?
图像处理
也许我们可以用简单的图像处理方法来解决这个问题。我们可以从两个连续的帧开始,然后我们可以应用二进制阈值来获得减去的掩码;这里,白涩像素的数量将表示静止。
这种方法很好,但当背景中有风扇或猫在移动时,问题就会出现;在这种情况下,这种方法将无效。因为移动的猫会成为面具的一部分。目标是提出一种针对人类的方法。
图像(人体)分割
使用一些分割技术怎么样?我们可以使用分割来具体地分割一个人,然后利用两个连续分割帧之间的差异来检查白涩像素的数量。限制:当分段区域中存在运动时,此方法不起作用。
姿态估计
这里,我们计算连续帧中特定身体部位关键点的欧几里德距离。我们的最终得分是所有这些欧几里德距离的加权和。显然,如果一个人做一些运动,关键点的欧几里得距离会更高,反之亦然。
得分:如果没有明显的移动,则得分应较低。较低的分数意味着更好的冥想(基于身体不动,实际上有很多因素有助于良好的冥想,而不仅仅是不动)。
请注意,如果我们不事先平滑姿势关键点,紧张会导致分数更高,导致较差和不准确的结果。下图显示了y轴上的运动分数和x轴上的时间。
首先,让我们看看分数在没有平滑的情况下的表现。
显然,由于抖动,图形看起来很杂乱。
让我们看看LPF的使用。
在这里,这一次的图表看起来很流畅。我们可以推断,任何运动都会影响曲线下的面积。因此,平滑关键点在此类应用程序中变得至关重要。
最终结果
此外,一个低通滤波器被集成到android中,并在自定义姿态估计模型上运行。我们得到以下结果:
参考文献
我希望你喜欢使用低通滤波器来使姿态估计更实用。我希望这个例子足够合理,以表明在基于姿态估计构建应用程序时,消除抖动是最关键的优化之一。
600学习网 » 更加实用的姿态估计-600学习网