ジェスチャー

WekinatorとLeap Motionによるハンドジェスチャー判定

note、初めての投稿になります🦄
日々の業務や研究開発などを通して獲得したTipsを、棚卸して管理していこうという魂胆のもと始めてみました。

サマリー

今回は、オープンソースの機械学習ツールであるWekinatorと、ハンドジェスチャー用モーションキャプチャデバイスであるLeap Motionを用いて、シンプルな3つのハンドジェスチャーを判定するシステムについてまとめています。
このシステムは、アート実験グループtkhssにて制作したメディアアート作品『(≪ S/O ≫(≪ O/S ≫)』の構成要素です。

今回利用するツール

Leap Motion 
Wekinator v2.1.0.4
MAX7aka.leapmotion , ジェスチャー判定パッチ[自作])
 ※MAX8が出ましたね👏

システム概要

画像1

1. Leap Motionにてジェスチャーをキャプチャします。
2. aka.leapmotionにてジェスチャー(手のひらの向き座標など)の変数を取得/転送(to Wekinator)します。
3. Wekinatorで変数を受信しジェスチャーを機械学習させます。
4. ジェスチャーの度合いを示す変数をWekinatorからMAXパッチに送り、閾値で切り分けてジェスチャーの判定をします。
 
WekinatorはOSCによって入出力を行います。今回は、Leap Motionからモーションデータを入力するために、赤松正行先生のaka.leapmotionを利用させて頂きました。Wekinatorでの学習結果を判定パッチ(MAX7)に送り、指定した閾値処理を通してジェスチャーを判定します。

Wekinatorに学習させる

[ aka.leapmotionの設定 ]
ジェスチャーをWekinatorに学習させるため、aka.leapmotionから送る変数は、PalmのPosition, Direction, Velosityの各x, y ,z、そしてballのPosition各x, y, z の計12個を利用します。
aka.leapmotionにudpsendオブジェクトを配置し、各変数をOSCを介してWekinatorに送信できるようにします。

[ Wekinatorの設定 ]

画像2

Receiving OSC-- 入力先のポート番号を設定します
※ aka.leapmotionで指定したudpsendのIPポート番号を入力します。
Inputs----------- インプットするOSC messageと変数の数を設定します
☆ PalmのPosition, Direction, Velosityの各x, y ,z、そしてballのPosition各x, y, z を学習させるために、変数の数は12で設定します。
Outputs--------- アウトプットするOSC messageと変数の数、IP、ポート番号を設定します。
☆ WekinatorからMax7の判定パッチに送り返す所の設定です。今回は3種のジェスチャーを判定するためOutputsの数は3で設定します。判定パッチについては後述します。

[ ジェスチャーの学習]
今回は3つのシンプルなハンドジェスチャーを学習させます。
(Gesture-1=上、Gesture-2=下、Gesture-3=横)

画像3

まず、outputs-1のスライダーを右端に持っていき、1に設定します。この状態でStart Recordingを押してレコードを開始します。
Leap Motionの上でGesture-1の状態を維持してランダムに動かし続けながらレコードしてください。

画像4

Leapmotionのジェスチャー検知範囲内をだいたい網羅できたらStop Recordingを押してレコードを停止します。
Gesture-2, 3も同様にoutputsを1にスライドし、Start Recordingを押して学習させていきます。
Gesture-1~3のモーションデータのレコードが完了したら、Trainを押して学習を開始します。
※メニューからInput Monitorを表示させることでOSC経由で正常にハンドジェスチャーの変数が送られているか確認できます。※メニューからInput Monitorを表示させることでOSC経由で正常にハンドジェスチャーの変数が送られているか確認できます。
※レコードするジェスチャーのoutputs(スライダー)を1にし、他のジェスチャーのoutputsは0に設定してください。

ジェスチャー判定の実行

[ 学習データの実行]
次にRunを押して、学習結果を実行します。
Leap Motionの上でGesture-1をすると、outputs-1のスライダーが1近くに移動していくのが確認できるかと思います。
※うまく動かない場合はジェスチャーのレコードを丁寧にやり直してみてください🌀
同様に、Gesture-2, 3のジェスチャーをすると、各スライダーのパラメータが振れているのが確認できます。

[ ジェスチャーの判定 ]
この3つのOutput結果をMAX7にて作成した「判定パッチ」に送信してジェスチャーの判定を行います。
Runを押して実行すると、WekinatorのOutputsで指定したポートに3つの変数の送信が開始されます。
判定パッチは、udpreceiveオブジェクトにて変数を受信し、指定した閾値を超えた場合、上、下、横と判定する。という構成です。

まとめ

Wekinatorはとても扱いやすく非常に便利だということが改めて分かりました。FaceOSCとかと組み合わせると、VTuber関連で使えそうですね。

🌸次回の投稿🌸
次回は、EMS制御システム(by 花形くん)と統合した、他者のハンドジェスチャーを強制的に再現するシステムについて記述します。

ありがとうございました。

#leapmotion #MAX7 #MAX8 #プロトタイピング #prototyping #machinelearning #wekinator #tech #note  

この記事が気に入ったらサポートをしてみませんか?