back
Kinect for Windows v2 でFace trackingをします(その2-1)

こんにちは、エンジニアのKです!
 
 
前回から、かなり時間が経ってしまいましたが・・・続きを書いて行きますので、よろしくお願いします。
 
さて、前回はRGBカメラからの映像を画面に表示しましたが、今回は「Face tracking」をやるぞー!おー!
とその前に「Face tracking」のことがよく分かっていないので、MSDNを読んで概略を押さえたいと思います。
ですのでソースコードも実行結果も無い内容となってしまいました、すみません、次回は実行結果を必ずのせます。
 
(最近はweb上にどんな情報でも溢れかえっているのですが私は昔から公式のドキュメントをまず読んで概略を理解してからでないと嫌なのです!
web上のサンプルをコピペして動いたーというのがどうも気持悪いのです!)
 
 
MSDNを読んでみるとFace trackingといっても、そもそも二種類あるようです。
 
Face tracking  http://msdn.microsoft.com/en-us/library/dn782034.aspx
High definition face tracking  http://msdn.microsoft.com/en-us/library/dn785525.aspx
ふたつの違いは、基本的な情報かより詳細な情報かという違いのようであるが
そもそも使用するFrameReaderが異なるようで(FaceFrameReaderとHighDefinitionFaceFrameReader)
当然HighDefinitionFaceFrameReaderの方がより詳細な情報が取得可能なようです。
まずは、基本的な情報を取得できる「Face tracking」から進めます。
 
 
ここからはMSDNFace trackingのページ
  http://msdn.microsoft.com/en-us/library/dn782034.aspx
の内容を私なりに解釈して書いていきたいと思います。
(英語は全くわかりませんが技術系の文章は何となくわかるのですが解釈が違ってる点があるかもです)
 
 
The FaceFrame Object(原文はMSDNより)
The FaceFrame Class provides a basic set of information about a tracked body’s face. It can tell you where the face is, where it is looking, basic expressive information, and if the face has glasses. All of this information can be computed against each tracked body up to a distance of 3.5 meters.
 
–完全な英訳ではないですが恐らく以下のような感じかと–
FaceTrackingするにはFaceFrameクラスを使うことになる。
(これはFrameという名前から考えてRGBカメラの場合と同じでFrameArrivedイベントでフレームを取得できるものと思われます)
FaceFrameクラスでできることは
顔の位置、顔の情報、「face has glasses」とあるので眼鏡をかけているか等がわかる
「up to a distance of 3.5 meters」とあるので3.5mの距離までを追跡可能
 
 
FaceFrameResult object(原文はMSDNより)
FaceFrameResult Class is the object that provides the basic set of info on a tracked body’s face and has data computed in infrared and mapped in color.
 
FaceFrameResultクラスは顔の基本情報を提供するもののようであり、赤外線で算出されてカラーマッピング(?)されたデータ??
つまりこのクラスのオブジェクトにデータが格納されてカラーマッピングと言っているので、RGBカメラの座標に調整されたものが取れるということか?


FaceFrame data(原文はMSDNより)
All FaceFrame Class data is computed in infrared and then mapped to color for your convenience. This means that results like theFaceFrameResult.FaceBoundingBoxInColorSpace Property feature are limited to the IR field of view. It also means that all information can be returned in almost any lighting condition where the IR Stream is visible, such as indoors, at night, etc. The only exceptions to this are the RightEyeClosed and LeftEyeClosed FaceFrameResult.FaceProperties Property which rely on the color feed and negatively impacted by poor lighting conditions.

FaceFrameクラスのデータは、赤外線で算出されたあとに「mapped to color for your convenience」とあるので、私(使用者)の(便宜の)ためにカラーにマッピングされる??
ということは、恐らくRGBカメラの座標にマッピングしてくれるのではないかと思う、v1の時にはRGBカメラと深度カメラの場所が違うために座標がずれるので位置合わせが必要
(それ用の変換メソッドがあったような)だったが勝手にRGBカメラの座標に変換してくれると言っているのではないかな???(だとしたらありがたいね!)
FaceFrameResult.FaceBoundingBoxInColorSpaceプロパティがそうなのでは?
「RightEyeClosed」「LeftEyeClosed」などは例外でRGBカメラに頼る(つまり暗闇では検出できない)と言っているのではないか???これ以外は暗闇でも検出できる???
–ちょっと解釈が危ういが、後に検証してみようと思います–


Bounding box data(原文はMSDNより)
Face detection results include a bounding box, which is a rectangle that contains the user’s head, as determined by our face detection algorithms. The bounding box is retrieved with either FaceFrameResult.FaceBoundingBoxInColorSpace Property orFaceFrameResult.FaceBoundingBoxInInfraredSpace Property.

FaceFrameResult.FaceBoundingBoxInColorSpaceFaceFrameResult.FaceBoundingBoxInInfraredSpaceのどちらかで
頭を含んだ顔の境界(boundning box)が我々(マイクロソフト)の顔検出するアルゴリズムで得られるってことかな


Point data(原文はMSDNより)
Point data is retrieved with either FaceFrameResult.FacePointsInColorSpace Property or FaceFrameResult.FacePointsInInfraredSpace Property. Sometimes called alignment points, these locations represent five landmark locations on a user’s face. The five points are the left eye, right eye, nose and, right and left mouth corners.

「Point data」はFaceFrameResult.FacePointsInColorSpaceまたはFaceFrameResult.FacePointsInInfraredSpace
で取得できると言っていて
「左目」「右目」「鼻」「左口角」「右口角」の5つのランドマークとなる位置をとれるみたい
–v1はもっとたくさんの点をとれたので、とれるような・・・High definition face trackingの方で取れるのかな?これも後に検証してみようと思います–


FaceRotationQuaternion(原文はMSDNより)
The head pivot point, obtained through the FaceRotationQuaternion property, is the computed center of the head, which the face may be rotated around. This point is defined in the Kinect body coordinate system. The origin is located at the camera’s optical center (sensor), Z axis is pointing towards a user, and Y axis is pointing up. The unit of measurement is in meters. The head pivot point is comparable to the head joint of the body, but the head pivot point has a different vertical coordinate (suitable as a center of rotation).

FaceRotationQuaternionプロパティで顔の回転(傾き?)が取れるってことかな???
かなり怪しいですが
・Z軸はセンサーの(カメラの?)光学中心からユーザーの方を向いている(つまりカメラが0で人に検出した人に向かって+の座標?)
・Y軸は上を向いている(つまり上が+の座標?開始点はセンサーか?)
・単位はメートル
・頭のピボットポイントは本体(恐らく人検出した時の頭の点)と同じだが垂直方向の座標が異なる
と言っているが・・・
–ちょっと全然理解できないので、これも実際に値をとって後に検証してみようと思います–


Face properties(原文はMSDNより)
The FaceFrameResult.FaceProperties Property returns a read-only map of key/value pairs that provide information about the appearance or state of a user’s face. For each entry in this map, the key is a member of the FaceProperty Enumeration. The following table lists the properties that are available. Note that these classifiers were trained assuming that the Kinect is placed above or below a content source (TV, etc.), centered and oriented towards the user.

FaceFrameResult.FacePropertiesは色々な顔の情報をとれるようで、これらの情報はキー/値のペア(つまりmap)で読み取り専用のようです
下にある表から取れるものを列挙すると以下のものが取れるみたい
Happy(smilingつまり笑顔か)、Engaged(こちらを見ているか かな?)、WearingGlasses(眼鏡をかけているか)、LeftEyeClosed(左目を閉じているか)、RightEyeClosed(右目を閉じているか)、
MouthOpen(口を開いているか)、MouthMoved(口が動いているか)、LookingAway(目をそらしているか)
取得できる値は「DetectionResult」という列挙型があり、YES、NO、Maybe、Unknownの値をとるようです
–確かさ順で YES > Maybe(もしかして) > NO で Unknownは判断できません ってことかなこれも実際の値をとって後に検証してみようと思います–


Database files(原文はMSDNより)
Every application that uses Microsoft.Kinect.Face.dll must be packaged with the NuiDatabase folder that shipped with Microsoft.Kinect.Face.dll. The face dll is only guaranteed to work with the specific NuiDatabase folder that it shipped with. The face APIs are designed to load database files from the NuiDatabase folder upon initialization and will look for the folder in the same location as Microsoft.Kinect.Face.dll.

顔検出のDLL(Microsoft.Kinect.Face.dll)は、NuiDatabaseフォルダの中のデータベースファイルが必要で
faceAPIは、初期化時にNuiDatabaseフォルダーからデータベースファイルをロードするようになっているとのこと
Dllと同じ場所に置く必要があるようです
–これはOpenCVとかの検出器で使うファイルのようなものかなぁ–


Performance considerations(原文はMSDNより)
If a long running task (greater than the amount of time it takes for a frame to arrive) is to be performed inside an event handler all relevant frame references must be acquired prior to executing the task. If the references are not acquired beforehand, the frame data may be overwritten and calls to acquire references and / or data will return null.
In general, it is best to avoid putting long running tasks inside event handlers and instead use separate threads to perform this work.

実行時間の長いタスクがイベントハンドラで実行する前にフレームの参照を取得しないとフレームデータが上書きされてNULLを返す時があるよってことかな?
長いタスクがある場合は別のスレッドにしましょうとのこと。
–まぁ当然と言えば当然のことですね–



ふむ~~概略は大体理解できたので早速プログラムを書いて動かして行きたいところですが、相当長くなってしまいましたので
プログラムは「その2-2」でやっていきたいと思います。



続きは、また近いうちに〜

Please share it!

FacebookTwitterGoogle+Pinteresttumblr