【MediaPipe】画面を分割することでMulti Hand Trackingの検出精度を高める

2020.06.22

カフェチームの山本です。

前回は、Cubemos SDKで検出した骨格とMediaPipe Multi Hand Trackingで検出した手の対応づけを動画で試しました。結果として、前回考えた方式ではうまく対応付けできない状況があることがわかりました。

【MediaPipe ✕ Cubemos SDK】骨格検出した身体と手を対応付ける(その2:3D動画編)

今回は、対応付けの方式を修正するための前段階として、画面全体に映っている手をすべて検出するための方法を考えます。

結論としては、画面を分割してMulti Hand Trackingを実行し、最後に結果を統合することで、画面全体の手を検出できることを確認できました。

(MediaPipeに関連する記事はこちらにまとめてあります。)

【MediaPipe】投稿記事まとめ

対象動画

今回は、前回用いた3DCGの動画を対象として、映っている手をすべて検出することをゴールとします。

前提

今回の方式では、簡単のため、手のサイズは既知(固定)であることを前提としています。手のサイズが既知でない場合には、例えば、Cubemos SDKと組み合わせて、検出した骨格の大きさから手のサイズを推定する、という方法が利用できます。

このページでは、手のサイズを下のように表記します。

[latex]d_{hand}[/latex]

課題

MediaPipeのMulti Hand Trackingで精度良く検出するには、手が入力する映像の画面に映る大きさに割合(画面割合)を1/8以上にする必要があります。対象動画に映っている手はそれよりも小さいため、そのままMulti Hand Trackingにかけると精度が低くなることが問題となりそうです。

詳しくは、こちらの記事をご参照ください。

【MediaPipe】Multi Hand Trackingの性能を検証するため実験してみた

このページでは、画面割合を下のように表記します。

[latex]r_{hand}[/latex]

検出方式

上記の課題を解決するため、以下の3ステップで検出する方法を考えました。

ステップ1:分割する

動画を以下の図のように切り出します。(画像から正方形の領域で等間隔に切り出します)

図中の要素はそれぞれ以下のとおりです。(水平方向・垂直方向で別々に計算します)

切り出しサイズ

画像を切り出すサイズを指します。前提とした手のサイズが、Multi Hand Trackingで検出できる画面割合になるようにするため、以下のように計算します。(これは水平方向・垂直方向で同じです)

[latex]\frac{d_{hand}}{d_{crop}}= r_{hand} \Leftrightarrow d_{crop} = \frac{d_{hand}}{{r_{hand}}}[/latex]

オーバーラップサイズ

切り出す領域が隣接する領域とかぶさるサイズを指します。切り出すときに、隣接する動画同士で重なりがないと、境界部で検出が途切れることが予想されます。これを防ぐため、オーバーラップする領域ができるように切り出します。サイズとしては、手のサイズ以上になるようにします。

[latex]d_{overlap} \geq d_{hand}[/latex]

切り出し数

上記のサイズから、動画を切り出す数は以下のように計算できます。右辺の[]のような表記は、ceil関数(切り上げ)を表します。

[latex]n_{crop}=\lceil (d_{image} - d_{overlap} )/(d_{crop} - d_{overlap}) \rceil[/latex]

ステップ2:それぞれで手を検出する

それぞれの領域で手を検出します。今回使用したのはMediaPipeのMulti Hand Tracking v0.7.5を、3つ以上手を検出できるように改良したものです。詳しくはこちらの記事をご覧ください。

検出結果は切り出した動画内での座標で出力されます。元の動画内での座標に戻すため、それぞれの検出結果を変換します。描画すると以下のようになります。手の検出はできていますが、同じ手に複数の検出がされていることがわかります。

ステップ3:統合する

同じ手に対して、複数回検出されている箇所を取り除くため、検出結果を統合します。今回は、検出された手のバウンディングボックスについて、以下の条件に合うとき同じものとみなして、片方を排除します。

2つのバウンディングボックスについて

  • 中心位置の距離が、小さい方のサイズの、0.5倍以下
  • サイズの差異が、小さい方のサイズの、0.3倍以下
  • 角度の差異が、30度以下

結果

ステップ1~3を実装して、動画を入力した結果は以下のようになりました。

分析

良い点

画面全体の手を検出できており、ステップ2で重複して検出結果も、大部分は排除できています。

悪い点

いくつか重複した検出を排除できていないところがあります。下の図のように、距離やサイズは近いものの、角度が異なっているため、違う手として判定されたようです。

これを改善するには、バウンディングボックスの重なりが大きい場合は、小さい方を排除するといった方法が考えられます。

まとめ

画面全体に映っている手をすべて精度高く検出するために、画面を分割してMulti Hand Trackingを実行し、最後に結果を統合する方法を考えました。動画に対して処理をおこない、画面全体の手を検出できることを確認できました。

次回は、今回方式を修正して検出した手と、骨格を紐付ける方法を検討します。