【MediaPipe】Multi Hand Trackingで3つ以上の手を骨格検出できなかった話

2020.05.28

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

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

前回は、プログラムやGraphを変更し、Multi Hand Trackingの検出データを抽出しました。

【MediaPipe】Multi Hand Trackingから検出データを抽出した

今回は、Multi Hand Trackingを利用して、3つ以上の手を検出したいと思います。今までMulti Hand Trackingを動かしてきましたが、検出する手の数は2つまでで、3つ以上の手が映っているときは、どれか2つがランダムに選ばれているような結果が出力されていました。これでは、複数人の手を同時に検出できません。そこで、3つ以上の手を同時に検出できるようにすることで、複数人に対応できるようにします。

結論として、設定を変更して実行したところ、”手そのものの検出”は3つ以上できましたが、手の骨格の検出は2つまでしかできませんでした。

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

【MediaPipe】投稿記事まとめ

作業・変更内容

変更するべき箇所を調べる

mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxtを見ると、以下のように書かれています。説明を読むと、こことmediapipe/graphs/hand_tracking/subgraphs/multi_hand_detection_gpu.pbtxtのClipVectorSizeCalculatorOptionsの設定を変更すると良さそうなことがわかります。multi_hand_detection_gpu.pbtxtとなっていますが、動かしているのはGPU版ではなくCPU版なので、multi_hand_detection_cpu.pbtxtになると推測されます。

(前回のようにこのファイルを変更している場合、行番号が異なりますので、ご注意ください)

mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxt

# Determines if an input vector of NormalizedRect has a size greater than or
# equal to the provided min_size.
node {
  calculator: "NormalizedRectVectorHasMinSizeCalculator"
  input_stream: "ITERABLE:prev_multi_hand_rects_from_landmarks"
  output_stream: "prev_has_enough_hands"
  node_options: {
    [type.googleapis.com/mediapipe.CollectionHasMinSizeCalculatorOptions] {
      # This value can be changed to support tracking arbitrary number of hands.
      # Please also remember to modify max_vec_size in
      # ClipVectorSizeCalculatorOptions in
      # mediapipe/graphs/hand_tracking/subgraphs/multi_hand_detection_gpu.pbtxt
      min_size: 2
    }
  }
}

指示された箇所を変更する

上の指示に合わせて以下のように変更します。設定を2->8にします。

mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxt

      min_size: 8

mediapipe/graphs/hand_tracking/subgraphs/multi_hand_detection_cpu.pbtxt

      max_vec_size: 8

実行した結果

プログラムを実行します。今までと同じくbuildし直して、実行します。

bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/multi_hand_tracking:multi_hand_tracking_cpu
./bazel-bin/mediapipe/examples/desktop/multi_hand_tracking/multi_hand_tracking_cpu \
--calculator_graph_config_file="./mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxt" \
--input_video_path="./in.mp4" \
--output_video_path="./out.mp4"

結果ですが、以下の動画のように、手の検出しているバウンディングボックスは4つの手に対して表示されているものの、骨格(Landmark)は2つの体に対してのみしか表示されていません。手もはっきり映っており、検出される手も時々入れ替わっていることから、動画の問題で検出できないということでもなく、どうやらプログラム側の問題のように思えます。

出力されるファイルの数を見ると、detection・handRect・palmRectは4つずつ出力されていますが、landmark・handRectFromLandmarkは2つずつしか出力されていません。Graphと合わせて見てみると、MultiHandLandmarkには4つのデータが届いているものの、内部で2つ分検出がとばされていると推測されます。もう少し詳細を調べる必要がありそうです。

まとめ

今回は、3つ以上の手を検出しようとして、設定ファイルの指示にしたがって変更しました。しかし、骨格検出の方が2つまでしかできませんでした。

次回は、この原因を探っていきたいと思います。

次↓

【MediaPipe】MediaPipeの仕様を詳しく調べてみた