【MediaPipe】Multi Hand Trackingで3つ以上の手を骨格検出できなかった話
カフェチームの山本です。
前回は、プログラムやGraphを変更し、Multi Hand Trackingの検出データを抽出しました。
今回は、Multi Hand Trackingを利用して、3つ以上の手を検出したいと思います。今までMulti Hand Trackingを動かしてきましたが、検出する手の数は2つまでで、3つ以上の手が映っているときは、どれか2つがランダムに選ばれているような結果が出力されていました。これでは、複数人の手を同時に検出できません。そこで、3つ以上の手を同時に検出できるようにすることで、複数人に対応できるようにします。
結論として、設定を変更して実行したところ、”手そのものの検出”は3つ以上できましたが、手の骨格の検出は2つまでしかできませんでした。
(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になると推測されます。
(前回のようにこのファイルを変更している場合、行番号が異なりますので、ご注意ください)
# 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にします。
min_size: 8
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つまでしかできませんでした。
次回は、この原因を探っていきたいと思います。
次↓