【MediaPipe】Multi Hand Trackingで誰が商品を取ったか判別する

2020.06.02

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

前回は、MediaPipeのプログラムを修正し、複数人の手を同時に検出できるようになりました。

【MediaPipe】Multi Hand Trackingで3つ以上の手を骨格検出する(解決編2)

今回は、修正したプログラムを利用して、カフェのウォークスルーにおいて、2人が並んでいるときにどちらが商品を取ったかを判別(=紐付け)する方法を考え、その性能を検証します。

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

【MediaPipe】投稿記事まとめ

概要

今回は、以下のような方式で紐付けが行えないか実験で確認しました。

前提

以下のようにデータが取れていることを仮定します

  • (カフェに設置している)デプスセンサによって、各ユーザがいる位置が特定できている
  • (カフェに設置している)重量センサによって、どの商品が取られたかわかっている かつ その商品の位置がわかっている
  • それぞれの座標が変換され、1つの空間にマッピングされている

紐付け方式

取られた商品とユーザを紐付けるために、商品-手、手-ユーザの2段階に分けることを考えました。

  • 商品-手:商品が取られた時刻に、その商品と距離が一番小さい手を、商品を取った手とみなす
  • 手-ユーザ:商品に紐付けられた手の向き(角度)を検出する。各ユーザと手を結ぶ直線の角度を計算し、手の向きに近い角度になるユーザを、その手をもつユーザとみなす

実験

利用データ

以下のような条件で撮影した動画を用意しました

  • カフェで撮影
  • 2人のユーザが1m程度離れている状態
  • それぞれが自由に行動している

この動画から以下の7つの動画を切り出し、対象データとしました。

判定方法

以下のすべて満たしていれば、紐付けできたとみなすこととしました。

  • 骨格検出ができている(誤検出を防ぐため)
  • ユーザを正しく紐付けできている(下の方法によって判定)

手とユーザの紐付け方法は、以下のようにしました。

  • 商品を取った手に関して、検出結果のバウンディングボックスの角度を取得
  • 各ユーザに対して、ユーザから見た手の相対位置を求め、角度を計算
  • 全ユーザのうち、相対位置の角度 と 手の角度 の差分が最も小さいユーザを、商品を取ったユーザであると判定する

(今回は簡単のため、ユーザの位置の計算や紐付けは目視で行いました)

結果

検出結果の動画

今回はMediaPipe v0.7.4 を使用しています。

紐付け判定の結果

商品を手にとったフレームを取り出し、角度を計算しました(1動画につき2フレーム取り出している場合があります)。それぞれの線と文字の意味は以下の通りです。

なお、角度は、12時方向が0°、6時方向が±180°であり、右側が+、左側が-になっています。

  • 赤線(実線):商品と手にとったユーザ   ー 手 を結ぶ線
  • 赤線(点線):商品と手にとってないユーザ ー 手 を結ぶ線
  • 赤文字:ユーザ - 手 を結ぶ線の角度(user0, user1)
  • 紫文字:手の角度(hand)
  • 黒文字:手の角度と 結線の角度 の差分(補正済み)(dif0, dif1)

算出結果をまとめると、下の表のようになります。表中の言葉の意味は、以下のとおりです。

  • user0:商品を手にとっているユーザ  → 手 の角度
  • user1:商品を手にとっていないユーザ → 手 の角度
  • hand:手の向いている角度
  • dif0:user0 と hand の差分
  • dif1:user1 と hand の差分
  • 判定:紐付けられたユーザ = dif0 と dif1 のどちらか小さい方
シーンID user0 user1 hand dif0 dif1 判定
1 -178 -131 -155 22 25 user0
2 138 -135 137 1 88 user0
3 -115 156 -115 0 89 user0
4 -144 -101 -152 8 51 user0
5 -101 135 -76 25 149 user0
6 -107 178 -99 8 83 user0
7 163 -140 177 15 43 user0
8 -169 124 -173 4 63 user0
9 -136 161 -146 10 54 user0

分析

良い点

  • すべてのシーンにおいて、正しいユーザに紐付けができている

悪い点

  • シーン1:dif0とdif1の値が近い(誤判定が発生しそう)

画像を見てみると、正面の商品を手を縦にして取っている様子が見て取れます

商品を取る前までは、手が横になっていて、想定どおりの角度が検出されています

  • シーン5:dif0が比較的大きい(判定の精度が低くなりそう)

こちらも、手を縦にして商品を取っている様子がみられます

全体的な問題点

動画全体の問題として、以下のようなことがありました。

  • 骨格の検出が途切れるときがある

特に商品を取った後、検出されなくなるケースが多かったです

※ 編注:MediaPipe v0.7.5だと、ほぼすべてのフレームで骨格が検出され、途切れることがかなり減りました

まとめ

今回、複数人いる場合でも商品とユーザを紐付けするために、Multi Hand Trackingで検出した手の角度を用いる判定方式の精度を実験で確認しました。今回用意した動画ではすべて正しく紐付けできましたが、判定が失敗しそうになりそうなケースもみられました

次回は、今回の方式がどのようなケースに失敗するのかを確認するため、もう一度実験します。