使用 OpenPose 从视频中提取姿势数据时,我得到了很多抖动。这看起来不自然,我的结果看起来既不自然也不人性化。
我从 OpenPose 模型中获得的数据是我必须使用的,我无法提高模型的质量。处理整个视频剪辑,并将 15 个解剖关键点存储在数据库中。我想使用一些信号处理来平滑这些数据。如何摆脱这种抖动?
使用 OpenPose 从视频中提取姿势数据时,我得到了很多抖动。这看起来不自然,我的结果看起来既不自然也不人性化。
我从 OpenPose 模型中获得的数据是我必须使用的,我无法提高模型的质量。处理整个视频剪辑,并将 15 个解剖关键点存储在数据库中。我想使用一些信号处理来平滑这些数据。如何摆脱这种抖动?
使用 Savgol 过滤器来平滑数据。
数据中存在抖动,因为视频正在逐帧处理。OpenPose 模型很好,但并不一致。该模型往往以随机方式出错。这会导致身体部位的位置围绕真实值反弹。
幸运的是,这些数据通常围绕真实值分布。这意味着 Savgol 过滤器可用于平滑数据,并从嘈杂的数据中生成准确的值。
平滑的第一步是收集整个视频的姿势数据,并将其存储在 .csv 文件中。保存姿势数据.py
有时模型会掉头。在下一步中,交换身体部位,使左侧始终在左侧。swap_body_parts.py
身体部位#9 是左膝,身体部位#12 是右膝。有时模型会混淆左右膝盖的位置。我必须确保:
x_coord for body part #9 < x_coord for body part #12
所以,如果#9 是#12 的左边,我将交换这些位置。
最后是时候应用平滑了。对于 60 fps,我发现 9 到 31 之间的值对于 window_length 参数效果很好(较低的平滑度较低,较高的平滑度较高)。 smooth_with_savgol.py
在这个 gif 中,右肘(绿色)已经平滑,而左肘(粉红色)没有。
通常,平滑的结果来自跟踪而不是检测。检测视频第一帧的位姿,然后用光流跟踪关键点。跟踪比检测快 100 倍(光流与 OpenPose)。
这种方法只适用于后期制作。在应用平滑算法之前,必须知道所有帧的位姿数据。提取这个 .gif 的姿势数据花了我的电脑几分钟。