Python Webカメラでeye tracking（アイトラッキング・視線計測）をする【Windows10】

https://github.com/sassa4771/eyetrack/tree/main/Eye_Tracking_Program_by_dlib
ここのファイルの中身説明↑

## このサイトでできること
・webカメラを利用した視線計測(以下の動画のイメージ)
![eye04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043128/755e811f-5fd7-3aa4-d05a-c38c791dec0e.gif)

## 目次
①eyetracking(アイトラッキング・視線計測)とは？
②必要なライブラリ・動作環境(※とりあえず動かしたい人はここから)
③dlibを使った顔ランドマーク検出
④瞳の区画切り出し
⑤機械学習で検出（失敗）
⑥画像処理で検出（成功）
⑦その他試したこと(Docker接続など)
⑧完成<br>

## ①eyetracking(アイトラッキング・視線計測)とは？
【eye trackingとは】
eye trackingとは、ユーザーの視線の動きを計測し分析するアイトラッキング（視線計測）技術のこと。
<br>

ヒトの眼球運動を分析し、視覚的注意などを明らかにする生体計測手法です。
ヒトの視線の場所（注視点）や動きを、アイトラッカーと呼ばれる専門の機械で計測。
取得したデータを分析し、よく見られていた場所や、見る順序、反対に全く見られていなかった場所などを明らかにします。<br>

心理学や認知科学などの学術領域のほか、マーケティング領域、観光分野、医療・教育・スポーツの研究など、さまざまな分野で利活用されているほか、近年ではVR空間内での計測やAIによる視線推定などの研究も盛んに行われており、今後も成長が期待されている技術です。
(参考：https://neu-brains.co.jp/information/case-study/2020/09/25/1489.html)
<br>

要するに<h3>視線がどこにあるかわかる！</h3><br>

【製品】
製品は、Tobiが有名
・https://www.tobiipro.com/ja/
・https://www.tobiipro.com/ja/service-support/learning-center/eye-tracking-essentials/what-is-dark-and-bright-pupil-tracking/<br><br>

【瞳孔検出方法】
赤外線を利用した検出方法が主流
・file:///C:/Users/sasat/Downloads/IPSJ-Z69-5P-08.pdf
・https://www.tobiipro.com/ja/service-support/learning-center/eye-tracking-essentials/what-is-dark-and-bright-pupil-tracking/<br><br>

## ②必要なライブラリ・動作環境
必要なものはGitHubからダウンロードしてください。
https://github.com/sassa4771/eyetrack<br>

【動作環境：(Let's Note)】
OS:windows10 Pro
CPU:Corei7
メモリ:12GB

【必要なライブラリ】
・dlib
・opencv
・numpy

【Anaconda環境インストールコマンド】
使用した環境は<a href='https://github.com/sassa4771/eyetrack/tree/main/Anaconda%20Environment'>eyetrack.yaml</a>にあります。<br>

```
cd 【eyetrack.yamlがあるとディレクトリ】
conda env create -n eyetrack -f eyetrack.yaml
```
環境をインストールしたらmainファイルの<a href='https://github.com/sassa4771/eyetrack/tree/main/Eye_Tracking_Program_by_dlib'>run.bat</a>を起動するとソフトが起動できる。<br>

## ③dlibを使った顔ランドマーク検出
【dlibのインストール】
![eye00.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043128/7f31260e-7e85-e9c3-57f1-c79913a7c458.gif)

※インストールが若干めんどくさい（windowsの場合）
windowsでdlibを利用するにはPowerShellからCMakeをインストールしないといけない。

参考にしたサイト：https://rikoubou.hatenablog.com/entry/2019/06/17/160248<br>
【CMakeダウンロードサイト】
参考サイト：https://cmake.org/download/

【opencvのダウンロード】
参考サイト：https://qiita.com/fiftystorm36/items/1a285b5fbf99f8ac82eb<br>
よくコマンドを忘れるので、注意。

## ④瞳の区画切り出し
【瞳の区画切り出し】
![eye01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043128/f095e47f-ba55-61f9-5b47-fa5d1ca7515b.gif)


【opencvで画像の切り出し方法】
参考サイト：https://qiita.com/mo256man/items/e36797f9f44a64caf81c

【opencvで画像サイズの拡大方法】
参考サイト：https://qiita.com/kenfukaya/items/dfa548309c301c7087c4

【opencvウィンドウの変更】
参考サイト：https://qiita.com/Kazuhito/items/b2ebd9f9010f1ffcac5b
ウィンドウが表示される場所を固定するため。

【int型をstring型に変更する方法】
参考サイト：https://www.javadrive.jp/python/string/index9.html

【opencv画像を指定して保存】
参考サイト：https://www.it-swarm-ja.tech/ja/python/opencv%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%9F%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%81%AB%E7%94%BB%E5%83%8F%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B/830422001/

【画像の二値化】
参考サイト：https://qiita.com/tokkuri/items/ad5e858cbff8159829e9

## ⑤機械学習で検出（失敗）
https://github.com/sassa4771/eyetrack/tree/main/tensorflow_pictures<br>
↑ここのファイルの中身においてある。

GoogleのTeachable Machineを利用としたが、dlibに使うnumpyと機械学習で使うTensorflowのnumpyが合わなかったため断念。
Teachable Machine:https://teachablemachine.withgoogle.com/

keras==2.2.4,tensorflow==1.15.0,pillow==7.0.0
をダウンロードしないと動かないらしい。

## ⑥画像処理で検出（成功）
【画像処理で検出】
![eye02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043128/040b0ae2-5043-ff87-2e2d-e4f462525a60.gif)
<br><br>

【平滑化、二値化、輪郭の抽出】
参考サイト：https://qiita.com/ankomotch/items/74884b0ca24b739159c0

【抽出した座標に長方形・円を表示】
参考サイト：https://note.nkmk.me/python-opencv-draw-function/
![eye03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043128/42010472-8fb9-2925-373e-5f08434336a5.gif)


## ⑦その他試したこと(Docker接続など)
【Docker】
opencvとnumpyのインストールで苦戦したので、環境のリセットが容易なDockerをしようと試みた。
Windows版のDockerでは、カメラデバイスを検出できないため断念。
(一応VirtualBoxを使えばできるらしいが、せっかくのコンテナなのにホスト型の仮想環境を使うのはナンセンスと思った。)

【opencvのインポートでエラー】
<h3>ImportError: numpy.core.multiarray failed to import</h3>
がでる。

opencvとnumpyのバージョンを合わせると解決する。

・pip uninstall opencv-python
・pip uninstall numpy

・conda uninstall opencv-python
・conda uninstall numpy

でアンインストールしてから、

・pip install opencv-python==3.4.2.17 numpy==1.14.5
をする。
※↑python=3.6じゃないとインストールできない

## ⑧完成
![eye04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043128/ac190af1-3212-e3e1-43a6-f9c827db3685.gif)


次は、web版でopencvとか使いたい。

## 追記
【瞬きの判定を入れた】
![eye05.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043128/281b9237-93cb-d72b-3449-acbed2b588bf.gif)

## GUIをつける
Qiita: https://qiita.com/sassa4771/items/865ce07eaa6cf8e073c8
にて解説しています。