Kinect for Windows で表情認識

Kinect for Windows Developer Toolkit には、フェイス トラッキングおよび表情認識の機能が含まれています。
今回は、Kinect for Windows で表情認識を利用するための方法について説明します。

フェイス トラッキングを利用するには、以下の DLL が必要になります。

  • Microsoft.Kinect.dll
  • Microsoft.Kinect.Toolkit.FaceTracking.dll
  • FaceTrackData.dll (ネイティブ)
  • FaceTrackLib.dll (ネイティブ)

下の 3 つの DLL は、32 ビット版と 64 ビット版に分かれます。
ちなみに、Microsoft.Kinect.Toolkit.dll はフェイス トラッキングとは直接には関係がありません。

 

■ DLL の作成

さて、なぜか SDK には、ビルド済みの Microsoft.Kinect.Toolkit.FaceTracking.dll が含まれていません。
まずはこの DLL を自分で作成する必要があります。

Microsoft.Kinect.Toolkit.FaceTracking.dll のソースコードを入手するには、
Developer Toolkit Browser を起動し、「Face Tracking Basics-WPF」の [Install] をクリックします。
任意のフォルダーを指定すれば、そこにソースコードがコピーされます。

Developer Toolkit Browser

 

FaceTrackingBasics-WPF.sln を Visual Studio で開き、Release モードでビルドします。
必要となるプラットフォーム (x86, x64) ごとにビルドして DLL を作成します。
(ビルド済みの DLL を Samples-2014/Kinect SDK/v1.8/bin に置きました。)

 

■ プロジェクトの作成と参照の追加

Visual Studio で、任意のプロジェクトを作成します。
既定では [プラットフォーム ターゲット] が Any CPU、[32 ビットの優先] がオンに設定されています。
この設定のままフェイス トラッキングを利用するのであれば、32 ビット用の DLL を参照に追加します。

64 ビットで動作させたい場合は、
[プラットフォーム ターゲット] を x64 に設定するか、[32 ビットの優先] をオフに設定して、
64 ビット用の DLL を参照に追加します。

 

.NET の DLL への参照は、[参照の追加] から 1 つずつ追加してもよいのですが、
なるべく環境変数を利用したいので、プロジェクト ファイル (.csproj) を直接編集します。

次のように、Kinect に関連する部分を ItemGroup に追加します。
ここでは Microsoft.Kinect.Toolkit.dll も含めています。


  <ItemGroup>
    <Reference Include="Microsoft.Kinect">
      <HintPath>$(KINECTSDK10_DIR)Assemblies\Microsoft.Kinect.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.Kinect.Toolkit">
      <HintPath>$(KINECT_TOOLKIT_DIR)Assemblies\Microsoft.Kinect.Toolkit.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.Kinect.Toolkit.FaceTracking">
      <HintPath>…(DLL のパスを指定してください)…\Microsoft.Kinect.Toolkit.FaceTracking.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Core" /> 
    (以下略)


 

次に、ネイティブの DLL をビルド時にコピーさせるための設定です。
プロジェクト ファイルの下のほうに、次の ItemGroup を追加します。


  <ItemGroup>
    <Content Include="$(FTSDK_DIR)Redist\x86\FaceTrackData.dll">
      <Link>FaceTrackData.dll</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="$(FTSDK_DIR)Redist\x86\FaceTrackLib.dll">
      <Link>FaceTrackLib.dll</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>


64 ビットの場合は、次のパスを使用します。


  <ItemGroup>
    <Content Include="$(FTSDK_DIR)Redist\amd64\FaceTrackData.dll">
      <Link>FaceTrackData.dll</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="$(FTSDK_DIR)Redist\amd64\FaceTrackLib.dll">
      <Link>FaceTrackLib.dll</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>


 

[プラットフォーム ターゲット] を Any CPU に設定していると、ビルド時に次の警告が出ますが、
実際の動作時のプラットフォームが一致していれば正常に動作します。
とはいえ、[プラットフォーム ターゲット] を x86 または x64 に設定しておくのがよいでしょう。

警告

 

■ 実装について

全体的な実装の方法や顔の各点の 3D 座標を取得する方法については、
上記の「Face Tracking Basics-WPF」のソースコードが参考になります。

表情認識については、次のように、
FaceTrackFrame オブジェクトに対して GetAnimationUnitCoefficients メソッドを呼び出します。


var faceTrackFrame = faceTracker.Track(sensor.ColorStream.Format, colorImage, sensor.DepthStream.Format, depthImage, skeleton);
if (faceTrackFrame.TrackSuccessful)
{
    var animationUnits = faceTrackFrame.GetAnimationUnitCoefficients();
    // 口の開閉状態
    var jawLower = animationUnits[AnimationUnit.JawLower];
}


取得できる表情の種類は、Face Tracking の「Animation Units」の項に書かれています。
ここでは、JawLower (口の開閉状態) の値のみ取得しています。
この値は -1 ~ 1 の間の数値で、1 は開いた状態、0 は閉じた状態を表し、-1 ~ 0 の間の数値が返ってくることもあります。

なお、FaceTrackFrame クラスは IDisposable ですが、
現在のフレームでの処理が終了したからといって Dispose メソッドを呼び出してしまうと、
なぜか以降のフレームでの処理が正常に続かなくなります。

 

作成したサンプル
Samples-2014/KinectSample/FaceTrackingConsole (GitHub)

バージョン情報
Kinect for Windows SDK 1.8

参照
Face Tracking
Microsoft.Kinect.Toolkit.FaceTracking Component
Kinect for Windows SDK のセットアップ

やってみよう!Kinectアプリ開発 – FaceTracking(前編)
やってみよう!Kinectアプリ開発 – FaceTracking(後編)
KinectとC#でFace Trackerを動かす

カテゴリー: 周辺機器. タグ: . Leave a Comment »

コメントを残す