TriggEyeの仕組み
また、どのように、カメラ目線を検知した時だけコマンドを実行しているかを説明する。
カメラ目線の検知方法
1. OpenFaceを使って、視線の方向ベクトルと、目の位置ベクトルを取得する。 https://gyazo.com/32dba21675006db38998a5cdec11fac9
2. 視線の方向ベクトルを、「目とカメラの距離」と同じ長さまで引き伸ばした先を視点とみなす。
3. 視点とカメラの距離が0であれば、カメラ目線として検知する。
https://gyazo.com/00cc4544fb613322968bb599c13c296a
視点とカメラの距離がぴったり0になることはまずないので、許容誤差を 引数 で調整できるようにした。 出力 を見れば、視点とカメラの距離が分かるので、許容誤差を調整する際の参考になるだろう。 また、(まばたき等に起因する)短時間での連続検知を防ぐため、目線検知の最小間隔も 引数 で調整できるようにした。 実装
カメラ目線を検知した時だけコマンドを実行できるようにするため、以下のようなシェルスクリプトを用意した。
code:擬似コード.sh
FeatureExtraction | # 1フレームを解析するたびに、抽出した特徴量を1行出力
python3 detect.py | # 特徴量を解析し、カメラ目線を検知した時だけ、検知内容を1行出力
while read line; do
$cmd # 検知内容を受け取った時だけ、コマンドを実行
done
1行目のFeatureExtractionは、OpenFaceの特徴量抽出プログラムであり、カメラの映像を1フレーム解析するたびに、抽出した特徴量を1行出力する。 2行目のdetect.pyは、冒頭で説明した「カメラ目線の検知方法」を、そのままコードに落とし込んだPythonスクリプトである。特徴量を1行ずつ解析して、カメラ目線を検知した時だけ、検知内容を1行出力する。
4行目の$cmdは、シェルスクリプトの利用者から与えられたコマンドであり、検知内容を受け取った時だけ実行される。
この擬似コードを、実行可能な形に整えたシェルスクリプトが triggeye である。
なお、detect.pyは標準ライブラリしか使っていないので、依存ライブラリ等を気にすることなく実行できる。
2019/8/21