MediaPipeを使ってみた

公式ページを参考にMediaPipeのデモを使ってみます
どれも試してみたいですが、とりあえず使ってみたいのはMediaPipe Handsです

環境

macOS 10.14.4 Desktop (HandsにはAndroid, iOS, Desktop, Webの環境がある)

インストール

MediaPipeのページが詳しいのでそのまま進めていきます

Hello Worldの実行でエラーがでました

bazel run --define MEDIAPIPE_DISABLE_GPU=1   mediapipe/examples/desktop/hello_world:hello_world
ERROR: Analysis of target ‘//mediapipe/examples/desktop/hello_world:hello_world’ failed; build aborted: Either the path attribute of android_sdk_repository or the ANDROID_HOME environment variable must be set.
INFO: Elapsed time: 0.161s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (0 packages loaded, 0 targets configured)
FAILED: Build did NOT complete successfully (0 packages loaded, 0 targets configured)
  currently loading: @rules_foreign_cc//tools/build_defs/shell_toolchain/toolchains
  Fetching @local_config_cc_toolchains; fetching

公式ページのAndroidのところに

MediaPipe recommends setting up Android SDK and NDK via Android Studio (and see below for Android Studio setup). However, if you prefer using MediaPipe without Android Studio, please run setup_android_sdk_and_ndk.sh to download and setup Android SDK and NDK before building any Android example apps.

とあるので入れてみました

再度実行すると無事表示Hello World実行できました!

I20200918 14:23:55.252943 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254393 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254407 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254418 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254428 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254437 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254446 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254456 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254465 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254477 380831168 hello_world.cc:56] Hello World!

こちらにしたがって進めていきます

デモ実行

どれも問題なく実行できて、サンプル画像の通りの結果になりました

Face Detection

6つのランドマークとマルチフェイスサポートを備えた超高速の顔検出ソリューション

実行コマンド

bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/face_detection:face_detection_cpu
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/face_detection/face_detection_cpu \
  --calculator_graph_config_file=mediapipe/graphs/face_detection/face_detection_desktop_live.pbtxt

横を向いても追従してきます
ちなみにマスクをしてみても追従してきました
顔を画面からはみ出させても追従してきます
画面に顔が一つもない状態で顔が認識されるということがありました
判定されたものは小物だったりバッグだったり、目鼻口に見えるものがあったわけではありません

Face Mesh

リアルタイムで468の3D顔ランドマークを推定する顔ジオメトリソリューション

実行コマンドはFace Detectionを参考にファイル名を変更するだけです

f:id:filot_nextd2:20200930173509p:plain:w100 f:id:filot_nextd2:20200930181357p:plain:w100 f:id:filot_nextd2:20200930181519p:plain:w100
こちらもマスク着用で判定され、少し横を向いても横から覗き込んでも追従してきました
真横になると判定できないようです
f:id:filot_nextd2:20201001170026p:plain:w80
複数顔が写った画像も試してみましたが1人しか認識されませんでした ついでに目と鼻っぽい3点があれば認識されるのだろうかと思ってプーさんに登場してもらいました
f:id:filot_nextd2:20201001175506p:plain:w100

顔として認識されているようですが、やっぱり人間とは違っておかしいです

ついでに会社のマスコットキャラのトドも試してみました
f:id:filot_nextd2:20201001175559p:plain:w100

こちらは顔とすら認識されませんでした

Iris

虹彩、瞳孔、目の輪郭を含むランドマークをリアルタイムで追跡

f:id:filot_nextd2:20201001155705p:plain:w80f:id:filot_nextd2:20201001155753p:plain:w80 f:id:filot_nextd2:20201001160010p:plain:w100f:id:filot_nextd2:20201001155837p:plain:w100 f:id:filot_nextd2:20201001160024p:plain:w130

目の輪郭を追跡ということでしたが、顔の認識もしてくれてるのでこちらもマスクをしてみました
見えていない鼻と口が多少ゆがんでます 片目を隠した状態でも同じように歪みましたが画面に写ってる目はしっかり追跡されました
f:id:filot_nextd2:20201001161729p:plain:w70
目をつむった場合はちゃんと目の輪郭が一本になりました

こちらもプーさんに登場してもらいました
かろうじて顔として認識されていますが、やはり目鼻口の位置はわからないようです
Faceの枠は表示されたり消えたりするので顔としての認識は怪しいです またトドも登場させてみましたが認識されませんでした 鼻と口の問題なのでしょうか。。

Hands

画像全体を操作し、方向付けられた手のバウンディングボックスを返す手のひら検出モデル

f:id:filot_nextd2:20201001150604p:plain:w100 f:id:filot_nextd2:20201001150320p:plain:w100f:id:filot_nextd2:20201001150340p:plain:w100f:id:filot_nextd2:20201001150407p:plain:w100f:id:filot_nextd2:20201001150450p:plain:w100
手の表裏と左右、指が見えないように縦にしたりしてみました すべて右手なのですが、掌がわからない状態だとLeftになる場合がありました
はじめに掌か手の甲を見せて認識させて動かすと良いようです 早い動きにも問題なく付いてきます

f:id:filot_nextd2:20201001161058p:plain:w100f:id:filot_nextd2:20201001161309p:plain:w90

指が5本見える状態で手の向きなどを変えた場合は問題なく認識されました

Pose

BlazePoseの調査を利用して、RGBビデオフレームから25の2D上半身ランドマークを推測する、忠実度の高い上半身ポーズ追跡用のMLソリューション

上半身のポーズ追跡をやってみました カメラから遠ざかるのでスクショはできませんでしたが、サンプル通りの結果になりました
画面から顔や体を半分はみ出させても追従されます アクロバティックにY字バランスポーズなどもやってみましたが足が手と認識されることはありませんでした
横向きは認識されなかったり、奥側にまわる腕の認識が点滅したりしてました
後ろ向きはでも認識され、目もそれっぽいところに配置されていました

広い部屋(後ろに何もない場所)で試してみると横向きになっても奥に位置する腕も認識されました

Hair Segmentation

DesktopはLinux対応なようなので、webで実行しました
f:id:filot_nextd2:20201002141657p:plain:w110 f:id:filot_nextd2:20201002141735p:plain:w100 f:id:filot_nextd2:20201002142014p:plain:w100
RGB(0,0,255)に設定されてます 少し下を向くと全体青くなりました
跳ねてる髪まで色が変わってますが前髪は変化しないときもありました
赤と緑もしてみました
青にしたときより黒髪が目立つ気がします
f:id:filot_nextd2:20201002142449p:plain:w100 f:id:filot_nextd2:20201002142839p:plain:w100 f:id:filot_nextd2:20201002151828p:plain:w100 f:id:filot_nextd2:20201002151848p:plain:w90

ついでにEdge Detectionもやってみました
f:id:filot_nextd2:20201002143104p:plain:w100
細かい髪の毛まで検出されてます こちらは参考にしてるページに詳細が載ってません

Object Detection

f:id:filot_nextd2:20201001185159p:plain:w100 f:id:filot_nextd2:20201001185314p:plain:w100

机にあったものが黒や青しかなかったせいなのか、ペンしか認識されませんでした
手を横から入れてみるとノートも認識されました プーさんは認識率が良いですね テディベアとして認識されています

会社の棚も撮ってみました
f:id:filot_nextd2:20201002150543p:plain:w150
ボトルはどれも似てるから判定されると思ったのですがそうでもないようです

デスクの上を動画に撮って認識させてみましたが、イヤホンやメガネははさみとして認識されました
ファイルはmp4で試しました
角度や背景にもコツが必要なのかもしれません
ボトルが並んでるところもmp4で試してみましたがどれも認識されませんでした
mp4で認識させると認識率が下がる気がします

Box Tracking

personやcell phoneは認識されますが、ペンは認識されませんでした
イヤホン(結んだ状態)は認識されるときもありましたがすぐ外れました
ノートも認識されるノートとされないノートがありました
こちらはなかなかコツが必要そうです

Face Tracking

ちょうどこの記事を書こうとしていたときにMediaPipeを使ったセミナーがあったので参加してみました

顔に画像を貼り付けて追従させるものです
会社のマスコットであるトドフェイスを貼り付けてみました

f:id:filot_nextd2:20201001200717j:plain:w100 f:id:filot_nextd2:20201001195446p:plain:w80

サンプル画像として用意されていた画像(目鼻口がちゃんと人の顔の通りになっている)だとやはりいい感じでした

これだけ簡単で正確に認識できるのでMediaPipeを使って色々遊べそうです
Hands機能を使ってハンドジェスチャーの認識をやってみたいです