【MediaPipe】Multi Hand Trackingの左手右手の判定を取り出してみた、そしたら左右逆だった(v0.7.5)

2020.06.11

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

以前の記事で、MediaPipe Multi Hand Trackingのv0.7.5を動かし、変更点を調べました。そこで、新しく右手左手の判定が加わっていることを確認しました。

【MediaPipe】v0.7.4 → v0.7.5 の変更点を調べて、Android APKを動かしてみた

今回は、この右手左手の判定をGraphから取り出しました。また、結果を見てみたところ、判定が左右が逆になっていることがわかりました。

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

【MediaPipe】投稿記事まとめ

Graph・プログラムを変更

Landmarkのデータを取り出したときと同様にプログラムを変更していきます。判定結果のデータ形式はClassficationListでした。

変更内容は以下のdiffのとおりです。

https://github.com/cm-yamamoto-hiroki/mediapipe/compare/ffd3821f2bcfcee7c84c8f503f6928f2307f4661...6cd3d8a0356c63d65c98118c2962e6669b2cde4b

以下では、上のリンクの内容を説明します。

Graphの変更

HandLandSubgraph

すでに、v0.7.5の変更で、HandLandSubgraphにhandednessというoutput_streamが追加されているので、特に変更する必要はありません。

MultiHandLandmarkSubgraph(mediapipe/graphs/hand_tracking/subgraphs/multi_hand_landmark.pbtxt)

HandLandSubgraphからhandednessを受け取るための、EndLoopClassificationListCalculatorとFilterClassificationListCollectionCalculatorを追加します。

このクラスはすでに定義されている(mediapipe\calculators\core\end_loop_calculator.cc、mediapipe\calculators\util\filter_collection_calculator.cc)ため、プログラム側の変更は必要ありません。

MultiHandTrackingGraph(mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxt)

MultiHandLandmarkSubgraphから取り出したデータを、外部に出力するためのストリームを追加し、接続します。

プログラムの変更

メインプログラム(mediapipe/examples/desktop/multi_hand_tracking_cpu.cc)

classificationのProtocol Bufferヘッダファイルへのパスを追加します。また、handednessを取り出すためのPollerをGraphに使える処理と、データを取り出す処理を追加します。

bazelのビルドファイル(mediapipe/examples/desktop/BUILD)

classificationのProtocol Bufferヘッダファイルへの依存関係を追加します。

変換スクリプト(scripts/convertProtobufToJson.py)

classificationのProtocol Bufferヘッダファイルへのパスを追加し、変換処理を追加します。

Handednessデータの確認

検出結果

  • 左手で確認

{
  "classification": [
    {
      "index": 1,
      "score": 0.99975175,
      "label": "Right"
    }
  ]
}
  • 右手で確認

{
  "classification": [
    {
      "index": 0,
      "score": 0.9990681,
      "label": "Left"
    }
  ]
}

分析

右手と左手が逆になっています(画像の貼り間違えではありません)。同じ動画の他のフレームでも同じような結果になっており、また、他の動画でも左右が逆になっていました。

この理由としては、v0.7.5において、この検出結果がAndroid アプリのHand Detection(https://google.github.io/mediapipe/solutions/hand の Example Apps > Mobile > MAIN EXAMPLE)のみで使われているからだと思われます。このアプリでは、左右を反転した映像に対して手を認識しているので、これに合わせて、検出結果も反転した状態で出力されるようになっているように思われます。

Handednessの結果を利用する際には、左右を反転させて利用する必要がありそうです。

まとめ

今回は、v0.7.5で追加されたHandedness(手の左右の判定)のデータを取り出しました。データを見てみると左右が逆になっていることがわかりました。