【MediaPipe ✕ Cubemos SDK】骨格検出した身体と手を対応付ける(その2:3D動画編)
カフェチームの山本です。
前回は、1枚の画像で、Cubemos SDKで検出した骨格とMediaPipe Multi Hand Trackingで検出した手の対応づけを試し、結果を確認しました。
今回は、もう詳しく様子を確認するため、動画で同様の対応づけを行い、結果を確認しました。また、手の左右を区別して対応付けを行い、結果を確認しました。
(MediaPipeに関連する記事はこちらにまとめてあります。)
結論としては、今回の方法ではうまく対応づけできない状況があることがわかりました。
実験1
動画でどのような結果になるかを確認するため、実験しました。
方法1
検出した骨格と手を紐付ける方法は、前回と同様で、以下のような手順でした。
- 手順1:Cubemos SDKで骨格を検出する
- 手順2:骨格の手首が検出されていれば(検出の確信度が0でなければ)、手首(左手首・右手首)の座標を取り出す
- 手順3:手首周辺の画像を切り出し、MediaPipe Multi Hand Trackingで手を検出する
- 手順4:検出した手のうち、手の骨格中の手首の位置が、身体の骨格の手首の位置と距離が最も近いものを、その骨格の手として対応づける
(今回は、動画から1フレームずつキャプチャした画像に対して、繰り返し処理を行いました)
結果1
結果は、下の動画のようでした。手順1で検出した骨格ごとに色を定めて色付けして描画しました。関節は、丸で示しており、確信度が高い順に、緑・黄色・赤で描画しました。また、手順4で対応付けた手は、その骨格の色で描画しました。
分析1
良い点
前回の結果と同様、おおまかには正しく対応付けができました。
悪い点
- 悪い点1:近くにある別の手があると、誤判定される
下の図のように、左から2番目の人物と3番目の人物の間にある手が、2人のどちらの手でもあると判定される場合がありました。理由としては、2番目の人物の手は検出されていたものの、3番目の人物の手の方が距離が近かったため、そちらに対応づけられました。
このとき、左から2番目の骨格の手首の位置は正しく検出されず、左から3番目の骨格の手首の位置は正しく検出されました。それにも関わらず、2番目の方が確信度が高く、3番目の方が確信度が低くなっていました。
- 悪い点2:手が検出されないと、誤判定される
下の図のように、左から1番目の手に対して、左から2番目の骨格が対応付けられる場面がありました(左から1番目の人の骨格も、同じ手に対応付けられていました)。理由としては、2番目の人物の手が検出されず、1番目の人物の手が検出されたため、そちらに対応づけられていました。
実験2
上の悪い点1を改善するため、対応付けの方法を修正して、結果をみました。
方法2
方法1と同様に、骨格を検出し、周辺を切り出して、手を検出しました(手順1~3)。
対応付けの際に、骨格の手首の左右と同じように判定された手だけを対象として、最も距離が近いものを対応づけました(右手首には右手と判定された手のみを、左手首には左手と判定された手のみを、それぞれ対応づけました)(手順4)。このとき、こちらの記事で分析したように、MediaPipeのHandLandmarkSubgraphからは手の左右は逆になって出力される(v0.7.5の場合)ため、反転して利用しました。
結果2
結果は、下の動画のようでした。描画方法は結果1と同様です。
分析2
悪い点
- 手の左右が間違っていると、誤判定される
下の図のように、左から2番目の人物の左手が3番目の人物の右手に、左から3番目の人物の右手が2番目の人物の左手に、それぞれ対応付けられています。これは、手の左右の判定が間違っていたためでした。
MediaPipeの左右の判定の精度はあまり高くなく、かなりこのケースが多く見受けられました。
考察
今回の方法では、骨格を検出し、その情報をもとに対応づけをする、という方法を取りましたが、この方法では、以下のような問題がありそうです。
- 骨格の検知にミスがあると、対応付けのミスにそのまま繋がる
- 骨格の間で判定を考慮していない。そのため、同じ手に2つの骨格が対応付けられてしまう、といったことが起きる。
まとめ
今回は、骨格と手の対応付けを、動画に対して行い、結果を見てみました。今回の方法では、あまりうまく対応付けできないことがわかりました。
今後は、考察に挙げた問題を解決する方法を考えます。