頭部姿勢推定を簡易実装する
はじめに
頭部姿勢推定は、顔の向きや角度を計算する技術です。
この記事では、複雑なパラメーターを使用せず、簡易的な方法を用いて頭部姿勢を推定する方法を紹介します。具体的には、顔のランドマークを利用して三角形をつくり、その重心から顔の向きを2D平面上で推定します。
通常、頭部姿勢推定にはカメラの
- 内部パラメーター
- 外部パラメーター
が必要となります。内部パラメーターは、カメラの焦点距離や画像の中心点などを表すパラメーターで、カメラごとに異なります。外部パラメーターは、カメラ座標系とワールド座標系との間の変換を示すパラメーターで、カメラの位置や向きに応じて変化します。
これらのパラメーターを用いて、以下のような図が得られます。
あるいはこちらのリポジトリでは、深層学習を用いて頭部姿勢を推定する方法も紹介されています。
しかしながら実際は、これらのパラメーターを正確に求めようとすると大変です。また、深層学習を用いた方法は、計算量が多くなってしまいます。
この記事では、これらの複雑なパラメーターを使用せず、簡易的な方法を用いて頭部姿勢を推定する方法を紹介します。
顔のランドマークを利用して三角形をつくり、その重心から顔の向きを2D平面上で推定します。
アルゴリズム
-
両目を結ぶ直線の分析
- この直線が水平に近い場合、顔は正面を向いている可能性が高い。
- この直線が傾いている場合、顔が左右に傾いている可能性がある。この傾きの度合いは、顔の傾きの度合いを示す。
-
左目、右目、鼻の頂点を結ぶ三角形の分析
- 三角形の形状や大きさを分析することで、顔の向きを推定。
- 三角形の重心と鼻の頂点の位置関係を分析することで、顔の左右の向きを推定。
-
鼻筋の直線の分析
- この直線の長さや位置を分析することで、顔が上下に傾いているかを推定。
- 鼻筋の直線が三角形の底辺の中央を通る場合、顔は正面を向いていると推定。
- 鼻筋の直線が三角形の底辺の左側を通る場合、顔は左に向いていると推定。
- 鼻筋の直線が三角形の底辺の右側を通る場合、顔は右に向いていると推定。
実装
顔の向きがきつい時、一部のランドマークが検出できない可能性があります。そのため、コード中ではいくつかのランドマークを選びなおせるようにしています。
出力結果
見にくいですが、青の矢印が顔の向きを表しています。
顔の向きがきついほど、矢印の長さが長くなります。(上限100px)
実際に使用する時は、このような描画は必要ないので、極めて高速な動作が期待されます。
デメリットとして、完全に左右を向いてしまうと、顔の向きを推定できなくなってしまいます。あまり厳密に推定する必要がない場合は、この方法を用いることで、簡易的に頭部姿勢を推定できます。
以上です。ありがとうございました。
Discussion