【MediaPipe】手の形状検出をやってみた
カフェチームの山本です。
今回は、手の形状をRGBカメラで検出するために、こちらのGoogle AIページに掲載されている内容を元に、公開されているスマホアプリを動かし性能を見ていきます。今回のアプリで手の検出をしている様子は下の動画のようでした。
MediaPipeに関連する記事はこちらにまとめてあります。
概要
今回利用するのは、Google ResearchのエンジニアであるValentin Bazarevsky氏らがCVPR2019で発表した、MediaPipeで実装された手の形状検出のモデルです。モデルやライブラリの内部には立ち入らず、利用できるアプリを動かし大まかな性能を見ていきます。名製のソースコードはGitHubのページに公開されています。(Google AIのページ下部の「code, here」にリンクされているものです)
結論は(最後にも書きますが)RGBカメラだけにも関わらず十分使える性能だと思いました。
MediaPipeとは、オープンソースのメディアデータ向け機械学習用フレームワークのようです(今回は手検出のモデルを動かすことが目的なので、あまり詳しくは立ち入らず、次回以降にしたいと思います。以下のドキュメントが参考になりそうです)。
- https://github.com/google/mediapipe/blob/master/mediapipe/docs/concepts.md
- https://github.com/google/mediapipe/blob/master/mediapipe/docs/install.md
- https://github.com/google/mediapipe/blob/master/mediapipe/docs/visualizer.md
今回は利用しませんが、同様にMediaPipeで実装されたもので複数の手を検出するモデルも公開されています。
動かし方
用意するもの:AndroidかiOSのスマートフォン
先程のGithubのページの「Android」か「iOS」に記載されている指示に従ってインストールすれば実行できます。Androidの場合は、先程のページのAPKのリンクをクリックしてダウンロードし、インストールするだけで動きます。
2D版と3D版があり、2D版では手の検出結果は2次元座標ですが、3D版では手の形状から奥行きも推定して出力するようです。ただし、画像内のデプスではなく、あく手の中での奥行きが検出されているようです(間違っていたら申し訳ありません)。アプリだと点の大きさと色(大きい/白が手前、小さい/黒が奥)で表現されています。
結果
今回はAndroidのバージョンを手元のスマートフォンで動かしました。利用した機種はASUS Zenfone 4です。
実際に利用する状況を想定して動かしてみた結果、以下のような性能であることがわかりました。(画像はアプリの画面をキャプチャしたものです。また、画像中の左や下の赤丸は、対象アプリではなく、キャプチャアプリによるものです)
良かった点
- スマホで動かしても遅延なく、高FPS(体感20fps程度、正確な測定はしていません)で検出できた
- 手を早く動かしたり振ったりしても検出できた。(ただし、あまりに早く動かして、撮影画像時点で手が映っているとは言えないようなときは検出できなかった)
- 手の形状を変化させても検出(追跡)できた。また、手の角度(撮影の方向)を変えても検出できた
- 手の一部であっても検出できた
- 手とカメラの距離が約20cm、30cm、1.2m、2.5mのとき検出できた(2.5mでも検出結果が安定していたため、もう少し距離を伸ばしても検出できるかもしれません)
- 部屋を暗くしても検出できた(昼間に、カーテンを閉じて、電気を消した状態)
悪かった点
- まれにではあるが、 誤検出(手が映っていないのに手として検出される、False Positive)される場合があった。ただし、逆の誤検出(手が映っているのに、手がないとして判断される、False Negative)は、下2つのような状況以外には、今回は確認できなかった。
- 手とカメラの距離が15cmよりも近い距離だと検出できなかった(手が画面いっぱいに映っている状態、もしかしたら画像がボケていることが影響しているかもしれません)。ただし、30cmで検出させてから、15cmに近づけると検出が継続された(追跡するような機能がある?)
- 指の間を閉じて真横・真上から撮影するなど、特殊な手の形だと検出ができなかったり、検出結果が不安定になった。ただし、少し手を斜めにすれば安定した検出が元にもどった。
結論
悪い点はあるものの、通常の利用範囲では問題になりそうではなく、RGBカメラだけでも十分精度良く手の形状を検出できそうだとわかりました。今後は検出されたデータを取り出して利用するために、ソースコードの中身を理解していこうと思います。
次↓
参考にさせていただいたページ・資料
On-Device, Real-Time Hand Tracking with MediaPipe(Google AI Blog) https://ai.googleblog.com/2019/08/on-device-real-time-hand-tracking-with.html
MediaPipe Hand Tracking with mobile GPU(GitHub) https://github.com/google/mediapipe/blob/master/mediapipe/docs/hand_tracking_mobile_gpu.md
余談
デプスカメラやCGによって大量の学習データと正解データを作成しモデルを学習することで、RGB画像だけで色々な認識ができるようになって、どんどん便利になっていくんだなと思いました。