web-dev-qa-db-ja.com

ポーズ推定のジッターを除去するためにスムージング手法を使用するにはどうすればよいですか?

OpenPoseを使用してビデオからポーズデータを抽出すると、多くのジッターが発生します。これは不自然に見え、私の結果は自然で人間的に見えません。

OpenPoseモデルから取得したデータは、私が処理しなければならないものであり、モデルの品質を向上させることはできません。ビデオクリップ全体が処理され、15の解剖学的キーポイントがデータベースに保存されます。このデータを平滑化するために、いくつかの信号処理を使用したいと思います。このジッターを取り除くにはどうすればよいですか?

enter image description here

7
Stephen Meschke

Savgolフィルターを使用してデータを平滑化します。

using a savgol filter to smooth pose estimation

Gif on Imgur

さまざまなレベルの平滑化を示すビデオ。

ビデオはフレームごとに処理されているため、データにジッターがあります。 OpenPoseモデルは優れていますが、一貫性がありません。モデルはランダムに間違っている傾向があります。これにより、体の部分の位置が真の値の周りで跳ね返ります。

幸い、このデータは正規値の周りに正規分布しています。これは、Savgolフィルターを使用してデータを平滑化し、ノイズの多いデータから正確な値を生成できることを意味します。

スムージングの最初のステップは、ビデオ全体のポーズデータを収集し、それを.csvファイルに保存することです。 save_pose_data.py

モデルが向きを変えることがあります。次のステップでは、左側が常に左側になるようにボディパーツを交換します。 swap_body_parts.py

体の部分#9は左膝で、体の部分#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のポーズデータを抽出するには、コンピューターに数分かかりました。

16
Stephen Meschke