python - 如何使用平滑技术消除姿势估计中的抖动?

标签 python opencv scipy signal-processing openpose

<分区>

我在使用 OpenPose 从视频中提取姿势数据时遇到很多抖动。这看起来不自然,我的结果看起来不自然和人性化。

我从 OpenPose 模型中获得的数据是我必须处理的,我无法提高模型的质量。处理整个视频剪辑并将 15 个解剖学关键点存储在数据库中。我想使用一些信号处理来平滑这些数据。如何消除这种抖动?

enter image description here

最佳答案

使用 Savgol 过滤器平滑数据。

using a savgol filter to smooth pose estimation

Gif on Imgur

Video showing different levels of smoothing.

数据中存在抖动,因为视频是逐帧处理的。 OpenPose 模型很好,但并不一致。该模型往往以随机方式出错。这会导致 body 部位的位置在真实值附近反弹。

幸运的是,这些数据在真值周围呈正态分布。这意味着 Savgol 过滤器可用于平滑数据,并从嘈杂的数据中生成准确的值。

平滑的第一步是收集整个视频的姿势数据,并将其存储在 .csv 文件中。 save_pose_data.py

有时模型会被翻转。在下一步中,交换 body 部位,使左边始终在左边。 swap_body_parts.py

body 部位 #9 是左膝, body 部位 #12 是右膝。有时模型会混淆左右膝盖的位置。我必须确保:

x_coord for body part #9 < x_coord for body part #12

因此,如果 #9 离开 #12,我将交换这些位置。

left_and_right_knees

最后是应用平滑的时候了。对于 60 fps,我发现 window_length 参数的值介于 9 和 31 之间(越低平滑度越低,越高平滑度越高)。 smooth_with_savgol.py

在此 gif 中,右手肘(绿色)已被平滑,而左手肘(粉红色)尚未平滑。

elbow with smoothing

通常,流畅的结果来自跟踪,而不是检测。检测第一帧视频中的姿势,然后使用光流跟踪关键点。跟踪比检测快 100 倍(光流与 OpenPose)。

此方法仅适用于后期制作。在应用平滑算法之前,必须知道所有帧的姿势数据。提取这个 .gif 的姿势数据花了我几分钟的时间。

关于python - 如何使用平滑技术消除姿势估计中的抖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52450681/

相关文章:

python - 在基于 celery+flask 的应用程序中,我需要为 Redis 安装什么?

image-processing - 如何测量图像中的距离?

c++ - 我们如何更准确地检测人脸

python - 在 Matplotlib.pyplot.imshow() 中显示来自 OpenCV 的二维数组

python - 在矩阵上使用 scipy.fsolve

python - 一个简单的命令 - "np.save",也许我误解了

python - 扭曲 - Python3 类型错误 : __init__() missing 1 required positional argument: 'factory'

python - TensorFlow:如何通过复制张量之一来连接张量?

python - 创建多行输出文件 (Python)

python - 为什么通过 Cholesky 分解反转正定矩阵比使用 numpy 进行常规反转慢?