動作追跡に失敗した場合に,欠損値を線形補間で穴埋めする方法

作成日: 2023年09月28日(木) 00:00
最終更新日: 2024年07月07日(日) 00:01
カテゴリ: コンピュータビジョン
タグ:  コンピュータビジョン AI MediaPipe 動作解析 手話認識

こんにちは.高山です.
以前の記事MediaPipeの全身追跡機能を指文字動画に適用する例を紹介しました.
記事内の実験で紹介したとおり,現在のMediaPipeは手話のように手が高速で動いている場合には追跡に失敗する場合があります.
今回は,追跡に失敗した場合に線形補間で後処理をすることでデータを穴埋めする方法について紹介したいと思います.

1. オリジナルの追跡点と補間結果

手法の細かい説明よりも先に,線形補間で欠損値を穴埋めしたらどのようになるかを見ていただきたいと思います.
図1は,オリジナルの追跡点結果と,それを線形補間を用いて欠損値を穴埋めした結果を示しています.

(a): 補間前
(b): 補間後
線形補間の効果

開始直後に腕を上げている箇所が分かりやすいのではないでしょうか.
図1(a) の補間前結果では手の追跡 (赤線) に失敗していますが,図1(b) の補間後結果では座標値が与えられていることが分かります.

2. 線形補間を用いた欠損値の穴埋め

本節では,線形補間処理について説明します.
図2は右手首のY座標をプロットしたグラフを示しています.

図2: 線形補間による欠損値の穴埋め
線形補間による欠損値の穴埋め

図2(a)と(b) は,補間前と補間後の座標値を示し,図2(a) 内に赤点線の円で示している空白箇所は欠損値を示しています.
線形補間は上手く得られている2箇所のデータを直線 (1次式) で補間する手法です.
これらのグラフに沿って説明しますと,線形補間処理は下記のような手順で行います.

  1. \(t\)\(y\) は,それぞれ動画フレームのインデクスと手首のY座標値を示します.
    図3に示すように,欠損箇所の直前フレーム \(t_0\) と直後のフレーム \(t_1\) から2点 \(p_0=(t_0, y_0), p_1=(t_1, y_1)\) を得ます.

    図3: 欠損領域の両隣を抽出
    欠損領域の両隣を抽出

  2. 図4に示すように,\(p_0, p_1\) を結ぶ直線の方程式を算出します.
    2点を結ぶ直線上の点 \(p=(t, y)\)\(p_0, p_1\) には下記の関係が成り立ちます.
    \((y - y_0) / (y_1 - y_0) = (t - t_0) / (t_1 - t_0)\) (1)
    図4 中央に描いてある三角形を見ると分かりやすいかもしれません.

    図4: 2点を結ぶ直線算出
    2点を結ぶ直線算出

  3. 図5に示すように,式(1) を変形すると次の式が出てきます.
    \(y = \alpha t + y_0 - \alpha t_0\),
    \(\alpha = (y_1 - y_0) / (t_1 - t_0)\)

  4. 具体的な値を当てはめると,\(y=-22.25t + 958\) が算出されます.
    補間したい動画フレームの \(t\) は分かっているので,後は具体的な値を代入すると座標値 \(y\) が求まります.
    図5: 式変形して値を算出
    式変形して値を算出

上記の処理を全ての欠損値に対して行うと,最終的に図2(b) のように補間された値が求まります.
また,上記の処理を全ての追跡点と座標値に対して行うと図1(b) で示した補間結果が得られます.


今回は線形補間を用いて追跡点の欠損値を穴埋めする方法を紹介しましたが,如何でしたでしょうか?
線形補間は単純な処理で高速に動作します.
図1(b) で示したとおり,単純な処理ながら"それらしい座標値"を得ることができます.

"それらしい座標値"と強調させていただきましたが,線形補間は可視化などには便利である一方で,補間したデータが認識アプリケーションなどにおいて精度が向上する保証は無い点に注意してください.

例えば,認識モデルに欠損値を無視したり重み付け (いわゆるアテンション機構など) する機能がある場合は,補間することで逆にうまく追跡できている真のデータに対する重み付けが弱くなってしまう場合もあります.

この点に関しては,データやアプリケーション,およびモデルの特性に依存します.
実際に使用する場合は色々と試して検証してみてください.

今回紹介した話が,欠損値の取り扱いに悩んでいる方に何か参考になれば幸いです.