指文字動画に対してMediaPipeの全身追跡 (Holistic) を試しました

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

こんにちは.高山です.
以前の記事MediaPipeの顔追跡機能について書きましたが,MediaPipeには全身の骨格点を追跡する機能 (Holistic modeと呼びます) もあります.
今回は,指文字中の動画に対してMediaPipeの全身追跡機能を適用して,挙動を調査しました.

Kaggleの手話単語認識コンテストでは,入力データとしてMediaPipeの全身追跡を用いて得た追跡点が用いられています.
データを見てみるとかなりノイジーな追跡結果が多く,どのような状況で撮影したのかが気になって調査してみることにしました.

1. 検証環境

検証環境は下記のとおりです.

  • OS: Ubuntu 20.04.5 LTS (on WSL2 with docker)
  • Python: 3.8.10
  • MediaPipe: 0.10.0

なお,GPUは今回の検証では使用していません.

2. 入力動画

検証には図1に示す3種類の動画を用いました.

(a): 1人, 遠距離
(b): 1人, 近距離
(c): 3人, 遠距離
指文字動画

カメラからの距離や映っている身体部位によって,追跡精度がどのような影響を受けるかを検証したかったので,遠距離と近距離から撮影した動画を用いています.

また,複数人が映っている場合の挙動を確認したかったので,3名が映っている状況を合成した動画も用意しました.

3. Holisticモードを制御パラメータ

MediaPipeの全身追跡機能のパラメータは下記のとおりです.

static_image_mode
bool
Trueの場合,全身領域の検出と追跡点の生成を各フレームで追跡を行います.
Falseの場合,最初のフレームで全身領域の検出と追跡点の生成を行い,次フレーム以降では追跡点を生成だけを行います.
model_complexity
int
モデルの種類を指定します.軽量モデル:0,標準モデル:1,高精度モデル:2 の3種類のモデルが選択できます.
smooth_landmarksbool Trueの場合,追跡点のジッタ (信号の時間方向に対する乱れを指します) を減らすために平滑化を行います.この設定は static_image_mode=True の場合は無視されます.
enable_segmentation
bool
Trueの場合,画像中の身体領域を示すマスク信号を生成します.
smooth_segmentation
bool
Trueの場合,身体領域のジッタを減らすために平滑化を行います.この設定は static_image_mode=True の場合は無視されます.
refine_face_landmarks
bool
Trueの場合,眼と口周辺の追跡点を補正します.さらに,眼の虹彩周辺の追跡点を生成します.
min_detection_confidence
float
全身領域の検出と追跡に成功したとみなすしきい値を指定します.
min_tracking_confidence
float
追跡点の生成に成功したとみなすしきい値を指定します.この設定は static_image_mode=True の場合は無視されます.

今回の実験では static_image_modemodel_complexity 以外はデフォルトのパラメータを用いました.
より詳細な内容については,公式のマニュアルをご参照ください.

4. 追跡結果 (遠距離)

まずは,遠距離から撮影した動画の追跡結果を示します.

4.1 静止画モード (Static mode)

図2は,static_image_mode=True とした場合の,各モデルの追跡結果を示しています.

(a): 軽量モデル
(b): 通常モデル
(c): 高精度モデル
静止画モード使用時の遠距離動画追跡結果

映っていない部位も追跡する

まず一目で気づくことは,画面に映っていない脚なども追跡されている点です.
これらの部位の値は信頼できるものではありませんが,それらしい値は持っているということは知っておく必要があります.
例えば,何も考えずに座標値に対してMin-Max正規化などを施してしまうと,これらの部位の影響で想定外の値になってしまう可能性があります.

モーションブラーに弱い

次に注目してほしいのは1秒目前後で腕を上げている途中の箇所です.
どのモデルでも右手の追跡 (赤色) ができていないことが分かります.
これは高速で動くことで手の部分にボケ (モーションブラーと言います) が発生していることが原因です.

手の追跡にはMediaPipeの手追跡モデルが使われていますが,現在のモデルはモーションブラーが起きている状況には対処できないようです.
モデルの性能ということもありますが,そもそも学習に使われている画像にモーションブラー中の手画像があまり含まれていないことが予想されます.

追跡部位が重なると,追跡が不安定になる

最後に,今回の動画のように前腕と上腕が重なる状況では腕の追跡が不安定になる傾向があります.
これは軽量モデルでは特に顕著です.
手話中の動画を正面から撮影した場合は,部位同士が重なる場面が多く発生します.
MediaPipeの追跡機能を手話解析に用いる場合は上記の特性を考慮して設計を行うことが重要です.

4.2 動画モード (Non-static mode)

図3は,static_image_mode=False とした場合の,各モデルの追跡結果を示しています.

(a): 軽量モデル
(b): 通常モデル
(c): 高精度モデル
動画モード使用時の遠距離動画追跡結果

動画モードでは滑らかな追跡結果が得られる

図2の場合と比べて,追跡がかなり滑らかになっています.
内部の平滑化処理によってジッタが軽減されている効果です.

動画モードでも誤追跡の除去は難しい

しかしながら,部位の重なりによる誤追跡は除去できておらず,この問題に関しては撮影設定の調整など別の対処方法が必要であることが分かります.
なお,モデルの改善ができれば一番良いですが,現状では追跡機能向けにモデルを学習・調整する機能は公開されていません.

5. 追跡結果 (近距離)

次に,近い距離から撮影した動画の追跡結果を示します.

5.1 静止画モード (Static mode)

図4は,static_image_mode=True とした場合の,各モデルの追跡結果を示しています.

(a): 軽量モデル
(b): 通常モデル
(c): 高精度モデル
静止画モード使用時の近距離動画追跡結果

画面外の部位は追跡が不安定

特に注目したいのは,前腕部が大きく映っているにも関わらず誤追跡が発生していることです.
これは肘が画面から見切れて追跡が不安定になっていることが原因と思われます.

つまり現状のMediaPipeは,映っていない部位の追跡の不安定さが他の部位の追跡に影響を及ぼす傾向があることが分かります.

手追跡結果は身体追跡結果の影響を受ける

また,身体追跡モデル (緑色) の手追跡がズレると連動して手追跡モデル (赤色) の追跡も失敗していることが分かります.
これは,身体追跡モデルの手追跡箇所周辺に対して手追跡モデルを適用する,という処理手順になっているためです.

5.2 動画モード (Non-static mode)

図5は,static_image_mode=False とした場合の,各モデルの追跡結果を示しています.

(a): 軽量モデル
(b): 通常モデル
(c): 高精度モデル
静止画モード使用時の近距離動画追跡結果

図3の場合と同じく,内部の平滑化処理によってジッタはかなり改善されています.
一方,図4の説明で述べたような現象は変わらず発生しています.

6. 追跡結果 (複数人)

最後に,複数人が映っている動画の追跡結果を図6に示します.
ここでは標準モデルを用いています.

(a): 静止画モード
(b): 動画モード
複数人動画の追跡結果

全身追跡モードは複数人の追跡不可

まず,現在の全身追跡モードは複数人の追跡に対応しておらず,1名だけが追跡されることが分かります.

静止画モードではフレーム毎に検出と追跡を行うため,検出信頼度が最も高い人物の追跡結果が得られます.
結果として,追跡人物の切り替えが頻繁に発生しています.

動画モードでは最初の検出以降では,前フレームの結果を利用して追跡を行うため,追跡人物の切り替えが発生しませんでした.


今回はMediaPipeの全身追跡機能を用いて指文字動画を追跡した結果を紹介しましたが,如何でしたしょうか?
手話動画は正面から撮影される場合が非常に多いです (そのこと自体にも色々と検討の余地はありますが).
MediaPipeの追跡機能を手話解析に応用する場合は,今回紹介したような現象が発生することを考慮して検討を行っていく必要がありそうです.

今回紹介した話が,これから手話解析を行う方に何か参考になれば幸いです.