Microsoftが提供している Visual Gesture Builder を用いて、ジェスチャの識別器を機械学習によって生成することができます。 生成されるファイルの拡張子は .gbd または .gba です。
Visual Gesture Builder では、一つのソリューションの中に複数のプロジェクトが存在する形式となっており、 各プロジェクトを Build すると .gba ファイルが得られ、 ソリューション全体を Build すると.gbd ファイルが得られます。 すなわち、個別のジェスチャ識別ファイルの拡張子は ".gba" に、 複数のジェスチャをまとめたファイルの拡張子は ".gbd" になります。
Kinect for Windows SDK 2.0 ではVisual Gesture Builderのジェスチャ認識に関しては次のように定義されています。
Kinect for Windows SDK 2.0 の Kinect.VisualGestureBuilder.h(抜粋) |
---|
typedef enum _GestureType GestureType; enum _GestureType { GestureType_None = 0, GestureType_Discrete = 1, GestureType_Continuous = 2 }; |
ジェスチャには Discrete(離散的) と Continuous(連続的)の2種類があり、 前者では confidence(確信度)、後者では progress(進捗度)という0.0から1.0までの 数字が付加されます。
Discreteジェスチャは AdaBoostアルゴリズム によって判定され、結果は真偽値で返ります。 confidenceの値を参照することで判断基準を変更することができます。
Continuousジェスチャは Random Forest アルゴリズム によって判定され、 結果は進捗状況が実数値で返ります。この値が progress です。
USE_GESTURE 定数を define してから NtKinect.h を include する と NtKinect のジェスチャ認識関係のメソッドや変数が有効になります。
Visual Gesture Builder で生成した ジェスチャの識別用ファイル .gbd を利用して Kinect V2 でジェスチャ認識をする ことができます。
返り値の型 | メソッド名 | 説明 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
void | setGestureFile(wstring& path ) | version1.5以降。 ジェスチャーを定義したファイル(*.gbd)へのパスpath を設定する。デフォルトでは L"SampleDatabase.gbd" に設定されている。 |
|||||||||||||||
void | setGesture() | version1.5以降。 setSkeleton()を呼び出した後に呼び出すことでジェスチャー認識を行う。 次のメンバ変数に値が設定される。
|
|||||||||||||||
string | gesture2string(const CComPtr<IGesture>& gesture ) | version1.5以降。 引数で指定されたジェスチャの名前を返す |
型 | 変数名 | 説明 |
---|---|---|
vector<pair<CComPtr<IGesture>,float>> | discreteGesture | version1.5以降。 認識したDiscreteジェスチャを、ジェスチャそのものと信頼度のペア pair<CComPtr<IGesture>,float> であらわす。複数の骨格の複数のジェスチャーを同時に認識するので vector<pair<CComPtr<IGesture>,float>> となる。 |
vector<UINT64> | discreteGestureTrackingId | version1.5以降。 Discrete ジェスチャに対応する骨格の trackingId のベクタ。 |
vector<pair<CComPtr<IGesture>,float>> | continuousGesture | version1.5以降。 Continuous ジェスチャは、ジェスチャそのものと進捗度のペア pair<CComPtr<IGesture>,float> で表される。 複数の骨格の複数のジェスチャーを同時に認識するので vector<pair<CComPtr<IGesture>,float>> となる。 |
vector<UINT64> | continuousGestureTrackingId | version1.5以降。 Continuous ジェスチャに対応する骨格の trackingId のベクタ。 |
「誰が行った動作であるか」など、認識されたジェスチャ i と骨格 j の 対応を取りたい場合は、
ジェスチャがDiscrete のとき kinect.discreteGestureTrackingId[i] == kinect.skeletonTrackingId[j] ジェスチャがContinuous のとき kinect.continuousGestureTrackingId[i] == kinect.skeletonTrackingId[j]で判定できます。
ソリューションエクスプローラ内のプロジェクト名(この例では KinectV2 )をクリックで選択してから、右ドラッグででプロパティを選択します。
Kinect20.VisualGestureBuilder.lib |
「構成プロパティ -> ビルドイベント -> ビルド後イベント -> コマンドライン」 で次の2行を追加する。
xcopy "$(KINECTSDK20_DIR)Redist\VGB\x64" "$(OutDir)" /e /y /i /r if exist "$(ProjectDir)\*.gbd" ( copy "$(ProjectDir)\*.gbd" "$(OutDir)" /y ) |
この例では、Kinect for Windows SDK v2.0 で配布されている以下の .gbd ファイルを用いています。
$(KINECTSDK20_DIR)Tools\KinectStudio\databases\SampleDatabase.gbd
まず最初に NtKinect 型の変数 kinect を宣言します。
kinect.setGestureFile(string)を呼び出して、検出すべきジェスチャの定義ファイルを設定します。
kinect.setSkeleton()メソッドを呼び出してから kinect.setGesture()メソッドを呼び出します。 ジェスチャが認識された場合は、kinect.discreteGesture や kinect.continuousGesture に設定されます。
main.cpp |
|
RGB画像の上方に、認識されたジェスチャが表示されます。 discrete ジェスチャは信頼度と共に左上に、continuous ジェスチャは進捗度と共にその右に表示されます。
上記のzipファイルには必ずしも最新の NtKinect.h が含まれていない場合があるので、 こちらから最新版をダウンロードして 差し替えてお使い下さい。
$(KINECTSDK20_DIR)bin\Database\Seated.gbd
まず Kinect Studio を用いて「所定のジェスチャを行っている場合と行っていない場合の両方を含む」動画を撮影します。
"Record"で記録する項目 o Nui Body Frame x Nui Body Index <--いらないのでcheckをはずす o Nui Depth o Nui IR o Nui Nui Sensor Telemetry x Nui Title Audio <--いらないのでcheckをはずす x Nui Uncompressed Color <--いらないのでcheckをはずす
次に、Visual Gesture Builder を用いて、動画からジェスチャ検出用ファイルを生成します。 ユーザが手動で、 動画のうち「左手を肩よりも上に上げる動作」をしている部分を positive 、 他の部分を negative な状態として定義し、Visual Gesture Builder に機械学習 させると結果として ジェスチャ検出用ファイル LeftHandUp.gba が生成されます。
ちなみに、このファイルの名前は "LeftHandUp.gbd" ではなく "LeftHandUp.gba"です。
本稿の Visual Studio のプロジェクトのジェスチャーの定義ファイルを、 今回生成した LeftHandUp.gba に差し替えて実行してみましょう。
kinect.setGestureFile(L"LeftHandUp.gba");「左手だけを肩より上に上げる」動作をdiscrete gestureとして認識し 「右手だけを肩の上に上げる」動作や「両手を肩の上に上げる」動作は 認識しないことを確認して下さい。