R&D チームの徳田(@dakuton)です。好きなHand Poseはメロイックサインです。
先日、2019年度のインターン事例として、EdgeTPU向けの全身姿勢推定をご紹介しました。今回は別の事例として、MediaPipeを用いたモバイル向けのリアルタイム手指推定+トラッキングを動かしてみた件についてご紹介します。
前回記事は以下です。
MediaPipeとは?
TensorFlowまたはTensorFlow Liteでパイプライン推論を実現(複数のモデル、必要となる前処理、条件分岐などを組み合わせて高度な推論を実現)するためのフレームワークです。
下記GitHub Issueによれば、NVIDIA Deep Stream、ひいてはGStreamer(マルチメディアフレームワーク、Edge TPU向けPoseNetサンプルでも用いられている)に着想を得ているようです。
Hand Trackingサンプルざっくり解説
例えば、今回ご紹介する手のトラッキングでは2つのTensorFlow Liteモデルを組み込んで実現しています。
- 手のBounding Box検出(palm_detection.tflite)
- 手の関節検出(hand_landmark.tflite)
この2つのモデルのつなぎこみで必要となる画像のクリッピング・画像回転補正や、モデルだけでは対応しきれない過去画像フレームを用いたトラッキングをサポートしています。 MediaPipe Visualizerを用いた図でいうと該当部分は以下のとおりです。
参考: Google AI Blog: On-Device, Real-Time Hand Tracking with MediaPipe
検証結果
前回インターン紹介記事(PoseNet)でスクリーンショット出演した、同じチームのエンジニアの手を借りました。(物理的な意味で借りました)
実行スクリーンショット
実行動画
利点
- 回転に強い
- 物体検出ベースで手を検出したあと、回転補正をかけてから手の関節を検出しているため、近距離でのハンドサイン検出漏れは少ないです。
- 立体検出に対応している
- 2D用と3D用のTensorFlow Liteモデルが用意されており、差し替えることで利用可能です。
- トラッキング性能が高い
- 欠点で後述する点もありベンチマーク測定はできていない(Pixel 3実動作の感覚値)ですが、一度検出してしまえば撮影範囲内で指を素早く動かしても問題なく追跡されます。
欠点
調査時点での情報であり、今後解消される可能性があります。関連するIssueのcloseをお待ちください。
- 複数検出は非対応
- トラッキング実現手法で考えれば仕様ともいえます。
- サンプルのままだとモバイルGPU対応環境以外では動作させることができない
- 手のBounding Box検出に利用しているTensorFlow LiteモデルがモバイルGPU専用のカスタムオペレーターを用いているため、GPU対応したモバイル環境以外で動かすためには自前で用意したモデルに差し替える必要があります。(TensorFlow Lite Interpreterを用いてPCで動かそうとするとクラッシュします)
- デスクトップ版については準備中のようです。(具体的時期は不明)
- ビルド、デバッグ難易度が高め
- 例えばAndroid向けバイナリをビルドする場合Dockerfileに配置されているOpenJDK 11ではAndroid SDKの更新に失敗します。Bazel実行とは別バージョンのJDKを用意する必要があります。
- サンプルだと関節がレンダリング済みの画像が直接出力として取得されます。よって、例えばうまく検出されなかった場合など解析したい場合、MediaPipe Visualizerなどを見ながら中間ノード(Packet)を出力として追加したものに差し替えて再ビルド検証する必要があります。
あとがき
今回、軽い気持ちで使ってもらってみたら、思ってた以上に環境構築まわりでうまくできない問題が多く動かすだけでも大変でした。 ただ、動かして現状何ができるのか?を確認するところまでは1週間以内で到達できたのでよかったと思います。
- 1週目で対応したこと
- handtracking(SSDベース)による手の検出
- Mediapipeにて利用しているネットワークモデルの調査
- 領域クリッピング有無による検出精度変化の確認
- 2週目で対応したこと
- Coming Soon
今年度の夏季インターン募集については、まもなく終了となります。検討中の方はお急ぎください。(R&Dコースは応募者多数につき2次にて締め切らせていただきました)
インターン以外でも募集中です。