errno-mmd / readfacevmd

read facial expression from photo / movie and generate VMD motion
Other
63 stars 5 forks source link

いい加減な視線推定 #5

Closed ikeno-ikeo closed 3 years ago

ikeno-ikeo commented 3 years ago

お目汚しです。 横を向いた時、さらに目が画面に対して奥側を向いた場合の視線方向が実際とズレることが多かったために、適当な補正を入れてみました。openCVなどを理解していないため、汚いコードになっているかと思います。

OpenFaceで使用しているGazeAnalysis::EstimateGaze()の推定する黒目の深度と LandmarkDetectorの推定する目の深度がズレていたため、Landmark側の深度で黒目の位置を補正してみました。 またオリジナルでは球と直線の交差判定を行っている部分を単なるベクトルの向きを得るだけにしています。

ikeno-ikeo commented 3 years ago

ブランチを切り分けてなかったので、余計なコードまでついてきてます。すいません。

errno-mmd commented 3 years ago

PRありがとうございます。手元で新しい視線推定を試していますが良くなっているように思います。

両目ボーンを使わなくする変更については採用するかどうか迷っています。 従来は、モーションを手で修正する際に多くのケースで両目ボーンだけ修正すればよくなるように、 両目ボーンを使う方針にしていたのですが、右目ボーンと左目ボーンだけのモーションにしたほうが便利でしょうか?

ikeno-ikeo commented 3 years ago

両目ボーンを使用した場合と使用しない場合で後者のほうが見た目がいい気がしたので手元ではずしていました。

両目ボーンに対しては補正を行っていないようですので、両目ボーンを使用しないほうが補正が強く掛かるせいだと思われます。従来、

  1. 左右の目のボーンの回転を決定、
  2. 両目ボーンの計算&左右への再分配、
  3. 補正を掛ける。

としていた順番を1->3->2とすることで両目ボーン使用時と不使用時で同じ結果となります。(つまりPRの視線推定は補正を前提にしていて計算がおかしいということです…。)

また、キーの間引き処理がどう行われるかにもよりますが、両目と左右の目が別々に間引かれると意図しない結果になるのではないかと思います。

errno-mmd commented 3 years ago

わかりました。そういうことなら補正係数だけ見直して両目ボーンを使うことにしようと思います。 なお間引きに関しては、実際に使っていると間引き後に残る右目・左目のキーフレームは角度が小さく、 個数も少ないので、別々に間引くことによる悪影響は殆どないだろうと考えています。

errno-mmd commented 3 years ago

ありがとうございました。 一応OpenFaceからコピーされたコードは残さない形にして再実装しました。