Pythonパッケージ版のMediaPipeが超お手軽 + 簡易なMLPで指ジェスチャー推定


MediaPipe(Pythonパッケージ版)

Pythonパッケージ版のMediaPipeが超お手軽です。

pip install mediapipe

pipでインストールして、、、

import mediapipe as mp

importして、、、

mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
    min_detection_confidence=0.7,
    min_tracking_confidence=0.5,
)

インスタンス作って、、、

image = cv2.imread('XXXXXXXX.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = hands.process(image)

process()に画像投げ込んだら、手のランドマークをゲット🦔!

※別途、描画処理が必要です。

CPU動作でもかなり早い!
むしろGPU対応していない気がする(ドキュメントのどっかに非対応な旨が書いてあるはあず、、、

MediaPipe(Pythonパッケージ版)がサポートする機能(2020/12/17時点)

Pythonパッケージ版のMediaPipeは、現時点で以下の4機能をサポートしています。

Hands

Pose

Face Mesh

Holistic(Pose, Face Mesh, Handsを一度に推定)

MediaPipe(Pythonパッケージ版)サンプルプログラム

上記のサンプルプログラムは以下で公開しています。

おまけ:簡易なMLPで指ジェスチャー推定

あまりにも簡単に手のランドマークが取れるようになったので、
簡易なMLPと組み合わせて、以下のようなプログラムも作ってみました。
せっかくMediaPipe自体の動作が早いので、なるべく邪魔しないようにTensorflow-Lite
で作っています。

手のランドマーク座標を入力に3分類(パー、グー、指差し)するモデルと、
指差し時の軌跡を入力に4分類(静止、時計回り、反時計回り、移動)するモデルを
組み合わせて動かしています。

「パー」「グー」「指差し」の分類


手のランドマークのIDはこんな感じ↑なので、、、


こんな感じに前処理して、、、(ID:0が最終的に0,0になっているの少々無駄ですが、、、)


こんな感じの簡易なMLPにぶち込んでます🦔

「静止」「時計回り」「反時計回り」「移動」の分類


人差指の座標履歴を16点ほど取って、こんな感じに前処理して、、、(T-15が最終的に0,0になっているの少々無駄ですが、、、)


こんな感じの簡易なMLPにぶち込んでます🦔

プログラム

上記のプログラムもGithubで公開しています。
適当MLPなので、もっとイカした構造にすると、もっと精度が上がります🦔