この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
カフェチームの山本です。
前回は、プログラムや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になると推測されます。
(前回のようにこのファイルを変更している場合、行番号が異なりますので、ご注意ください)
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つまでしかできませんでした。
次回は、この原因を探っていきたいと思います。
次↓