質問: ### 質問 Kinect(v2含む)ではなぜ、顔のパーツや骨格、間接の認識が行えるのでしょうか。 調べてみると、赤外線技術を用いて3Dデータを取得できるところまではわかったのですが、なぜその点が「目」や「鼻」だとわかるのかという部分がわかりませんでした。 SDKのHDfacetrackingのコードを初心者なりに読んでみたのですが、該当の部分はコード外での処理のようで見つけることができませんでした。これはOpenCVなどを読み込んで様々な処理を行っているのでしょうか?元をたどるとディープラーニングを行って作られた何かなのでしょうか。 (初心者のため的外れでしたら申し訳ありません。) 簡単にで構いませんので教えていただけると幸いです。よろしくお願いいたします。
回答: Kinectに関する検出アルゴリズムを探しましたが、日本語で詳しい資料が見つかりませんでした。 Stackoverflowによれば、Microsoftの元の論文かウィスコンシン州立大学しかなさそうでした。 私も気になったので少しまとめます。 検出アルゴリズム **1. 赤外線による深度測定** * Kinectから楕円の斑点上の赤外線ビームを投影します(構造化照明:structured lightと呼ばれる方法だそうです)。 この際に、斑点の大きさや変形具合を調べることで、どれだけ距離が離れているか測定できます。 * また、この際にXY軸で異なる焦点距離(focal length)を持つレンズを使うことで、距離による点のぼやけ方の違いができるそうで、それも併せてハードウェア側で処理しているそうです。※特許US 2010/0290698参照 **2. 機械学習に基づくパーツの位置推定** * こうして抽出された距離情報を100万回以上調整したランダムフォレスト法(「この画像のうち、この条件を満たして、この条件を満たして(略)は頭です」のような方法)でパーツを選別します。 詳細は上記ウィスコンシン州立大学のPDFを参照ください。図だけ流し見てもわかりやすいかと思います。