【MediaPipe ✕ Cubemos SDK】骨格検出した身体と手を対応付ける(3DCG編)

2020.06.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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

今までは、MediaPipeのMulti Hand Trackingで検出したLandmarkのデータのみをもとに、商品を取ったことの検出、手のポーズの認識、を行ってきました。

【MediaPipe】投稿記事まとめ

今回は、カフェチームの他のメンバーが取り組んでいる、Cubemos SDKによる身体の骨格検出のデータと組み合わせることを考えます。

結論としては、身体の骨格がある程度正確に検出されていれば、手と身体を紐付けられることがわかりました。

目的

現在、カフェチームでは、MediaPipeを用いた手の骨格検出と、Cubemos SDKを用いた身体の骨格に取り組んでいます。今回は、これら2つの情報を組み合わせるため、それぞれ検出した骨格同士を紐付けたいと思います。具体的には、まず、Cubemos SDKで身体の骨格を検出します。その情報をもとに、手の骨格を検出して、それらの手がどの身体のものであるか(誰の手であるか)を判定します。

実験

利用データ

画像データ

今回利用したのは、3DCGの画像です。これは、同じくカフェチームの宮島がUnreal Engineで作成したものです。詳しい内容はこちらの記事をご覧ください。

身体の骨格データ

CubemosのSDKにかけると、以下のように身体の骨格が検出されます。

出力されるデータは、人ごとに、身体の18点ごとの、画像におけるx,y座標と検出の確信度(confidence)が得られます。上の画像では、確信度が高い点は緑、確信度が中の点は黄色、確信度が低い点は赤、で描画しています。SDKについては、同じくカフェチームの清野が執筆したCubemos SDKに関する記事をご覧ください。

方法

今回はCubemos SDKによる身体の骨格検出データを前提として、以下のように身体と手を紐付ける方法を試します。

  • (上記で検出された身体ごとに、以下を繰り返す)
  • 骨格検出データのうち、手首(左手首・右手首)の座標を取り出す(上図の5・8番の点)
  • 元の入力画像のうち、手首の座標の周辺を切り出す
  • 切り出した画像をMulti Hand Tracking(MediaPipe)にかける
  • 検出された手のうち、手の骨格中の手首の位置が、身体の骨格の手首の位置と最も近いものを、その身体の手として紐付ける

結果

身体の骨格の手首を中心に切り出した画像と、Multi Hand Trackingで手の骨格を検出した画像を並べて表示します。また、それぞれの手首の位置の距離も示します(単位は、画像の一辺の長さを1としています)。手が複数検出された場合は、距離も複数示しています。確信度は、Cubemos SDKの出力した、その手首の位置の確信度をそのまま示します。

正しく紐付けできているかを目視で確認しました。

正しく紐付けできたもの

  • 結果1(確信度:0.820、距離:0.0988)

  • 結果2(確信度:1.001、距離:0.0587)

  • 結果3(確信度:0.966、距離:0.0726・0.446)

  • 結果4(確信度:0.971、距離:0.0531)

  • 結果5(確信度:0.713、距離:0.152)

  • 結果6(確信度:0.443、距離:0.0816・0.384)

  • 結果7(確信度:0.220、距離:0.114・0.569)

  • 結果8(確信度:0.334、距離:0.0799・0.113)
  • (Cubemos SDKで左の白青の服の人の左手首と判定されている位置)

正しく紐付けできなかったもの

  • 結果9(確信度:0.915、距離:0.030・0.126)
  • 右の黄色い服の人の右手首と判定されている位置だが、左の人の手を紐付けられている

  • 結果10(確信度:0)
  • そもそも、手首の位置を検出できていない

分析

おおよそ正しく紐付けできています。各結果を細かくみると、以下のようなことがわかります。

  • 結果1~結果4のような、確信度が高い場合は、手首同士の距離が近く、正しく紐付けしやすい
  • 結果5~結果7のような、確信度が低い場合でも、紐付けができる。逆に手の位置から、身体の手首の位置を補正することもできる
  • 結果8では正しく紐付けられているが、そもそも手首の位置がずれているので、偶然成功したといえる。結果9では、確信度が高くても、正しく紐付けができていない。そのため、結果8、結果9のように、身体の骨格検出の時点で、腕がクロスしていたり、手首が近くにある場合は、紐付けには工夫や補正が必要
  • 結果10に関しては、そもそも身体の骨格検出の精度を上げることが必要。もしくは、手を全部検出し、手に対して身体を紐付ける方法(今回とは逆)も検討してみるのも良さそうです。

結果8、9の問題に対する工夫の例として、(MediaPipeはv0.7.5では、検出した手が右手・左手かの判定を出力するため)右手首には右手のみを、左手首には左手のみを紐付けの対象にすることが考えられます。

(上の方法によって、今回利用した画像では正しく判定できますが、左手が2つ写った場合など、対応できない状況もまだあります。)

まとめ

今回は、Cubemos SDKによる身体の骨格検出の結果をもとに、MediaPipeによる手の骨格検出の結果と紐付けする方法を試しました。3DCGで確認したところ、おおよそ正しく紐付けできることがわかりました。

今後は、今回紐付けできなかったケースに対応する方法を考えます。