OpenPoseを使用してビデオからポーズデータを抽出すると、多くのジッターが発生します。これは不自然に見え、私の結果は自然で人間的に見えません。
OpenPoseモデルから取得したデータは、私が処理しなければならないものであり、モデルの品質を向上させることはできません。ビデオクリップ全体が処理され、15の解剖学的キーポイントがデータベースに保存されます。このデータを平滑化するために、いくつかの信号処理を使用したいと思います。このジッターを取り除くにはどうすればよいですか?
Savgolフィルターを使用してデータを平滑化します。
ビデオはフレームごとに処理されているため、データにジッターがあります。 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の残りの場合、それらの位置を交換します。
最後に、スムージングを適用します。 60 fpsの場合、window_lengthパラメーターには9〜31の値が適切に機能することがわかりました(低いほど平滑化が少なく、高いほど平滑化されます)。 smooth_with_savgol.py
このgifでは、右肘(緑)は滑らかになっていますが、左肘(ピンク)は滑らかになっていません。
一般に、スムーズな結果は、検出ではなく追跡から得られます。ビデオの最初のフレームでポーズを検出してから、オプティカルフローでキーポイントを追跡します。追跡は検出よりも100倍高速です(オプティカルフローとOpenPose)。
この方法は、ポストプロダクションにのみ適しています。平滑化アルゴリズムを適用する前に、すべてのフレームのポーズデータを知っておく必要があります。この.gifのポーズデータを抽出するには、コンピューターに数分かかりました。