見るだけで押せる「視線スイッチ」

カメラを見つめるだけでスイッチを押せる「視線スイッチ」の作り方を紹介します。
「使うときにしか見ないモノ」 が 「見るだけで使える」 ようになります。
カメラ付きのパソコンがあれば今すぐ簡単に作れます。（Windows、Mac、Linuxに対応）

</br>
[トレたま](https://txbiz.tv-tokyo.co.jp/wbs/trend_tamago/post_185571/) で取り上げて頂きました！（テレビ東京、WBS ワールドビジネスサテライト）
![トレたま（テレ東WBS）視線スイッチ](https://www.tv-tokyo.co.jp/mv/images/thumbnail/wbs/20190910_wb_tt01_ca12549f093d9a83_9.jpg)
（視線スイッチは [私](https://qiita.com/takjg) の個人開発であり、株式会社バッファローとは一切関係ありません。）
</br>

視線スイッチは、汎用的なスイッチなので、繋げるモノ次第で色々な使い方ができます。
例えば、物理ボタンを押してくれる小型の指ロボット[SwitchBot](https://scrapbox.io/smart-home/TriggEye%E3%81%AE%E6%9D%90%E6%96%99%E8%B2%BB#5d5ef4e7ae2d7f00002a7ed3)を繋げば、見るだけで物理ボタンを押せます。
![見るだけで押せる](https://gyazo.com/17bfc942970ef736e68843a457d93b3e.raw)

赤外線家電を操作してくれる[スマートリモコン](https://qiita.com/takjg/items/e6b8af53421be54b62c9)を繋げば、見るだけでリモコン操作できます。
このように設置すれば、見るだけでエアコンをON/OFFできます。
![見るだけでリモコン操作](https://gyazo.com/7844372ca1add471afdeeee92c6af646.raw)

また、「OK Google」と喋ってくれるスピーカーを繋げば、見るだけで[Google Home](https://scrapbox.io/smart-home/Google_Home)を起動できます。（もちろん[Amazon Echo](https://scrapbox.io/smart-home/Amazon_Echo)も。）
![みるだけで起動](https://gyazo.com/d9c620f08fa35bd64ac9af15ef88cafe.raw)

このように、「使う時にしか見ないモノ」 や「使う時すら見ないモノ」を、 「見るだけで使える」 ようにするのが視線スイッチです。
モノを使う時には、モノを見てから、モノを扱うという、人間の生活習慣における自然な視線の動きを利用しているので、使い方を覚えなくても、直感的に扱えます。また、普段は見ない場所を見つめるという、特殊な状況を検知するだけで済むので、安価なカメラやパソコンでも、誤検知の少ない高性能な視線スイッチを実現できます。

「壁のスイッチ」のように、普段はわざわざ見ることのない、「使う時にしか見ないモノ」は、私たちの生活のなかに沢山あるので、様々な場面で役に立ちます。例えば、ドアの鍵や、水道の蛇口、換気扇なども、普段はわざわざ見ないモノです。

さらに、「視線スイッチ」には、「速く」て「安心」という特徴もあります。ネット接続が不要で、完全にローカルな環境で動作するため、視線を検知したら、即座に操作が反映されます。ネットによる遅延やネットの障害で使えないということがありません。また、ネットに接続していないので、カメラの映像が流出する心配や、他人に操作される心配もなく、安心して使えます。

視線スイッチは、赤外線リモコンやスマートスピーカーとは異なる、新しい家電操作の手段を提供します。

# 特徴
- 高性能
  - 部屋のどこにいても、見るだけで、スイッチを入れられます
  - 普通のカメラでも、かなり薄暗い部屋でも使えます
      - さらに暗視カメラを使えば、暗闇でも使えます
  - ネットを経由しないので、視線を検知した瞬間に、即座に操作が反映されます
  - 詳しくは　→　[TriggEyeの性能評価](https://scrapbox.io/smart-home/TriggEye%E3%81%AE%E6%80%A7%E8%83%BD%E8%A9%95%E4%BE%A1)
- お手軽
  - 特殊な装置が不要
      - 安価な [Webカメラ（2千円）](https://scrapbox.io/smart-home/TriggEye%E3%81%AE%E6%9D%90%E6%96%99%E8%B2%BB#5d5ef4e7ae2d7f00002a7e91)と[パソコン（3～4万円台）](https://scrapbox.io/smart-home/TriggEye%E3%81%AE%E6%9D%90%E6%96%99%E8%B2%BB#5d5ef4e7ae2d7f00002a7ea3)で動くので、誰でも今すぐ作れます
      - 特殊な装置で視線スイッチを作れば、さらに便利になります（さらに安価、小型化、省エネ, etc.）
  - 詳しくは　→　[TriggEyeの材料費](https://scrapbox.io/smart-home/TriggEye%E3%81%AE%E6%9D%90%E6%96%99%E8%B2%BB)
- 安心
  - ネット接続が不要
     - Webカメラの映像が流出する心配がありません
     - 他人に操作される心配もありません

# 作り方
視線スイッチは、2つのオープンソースソフトウェアを導入するだけで、誰でも今すぐ簡単に作れます。

- [視線トリガー（TriggEye）](https://scrapbox.io/smart-home/視線トリガー_（TriggEye）)
![目線→カメラ→コマンド](https://user-images.githubusercontent.com/34579033/63515725-755d7900-c526-11e9-9a2e-9c0453d8899d.png)
    - Webカメラを見つめるだけでコマンドを実行できるようにするソフトウェアです（私が作りました）
    - [インストール手順](https://scrapbox.io/smart-home/%E8%A6%96%E7%B7%9A%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC_%EF%BC%88TriggEye%EF%BC%89#5d5ef46dae2d7f00002a7d51)
        - 所要時間：OSによって1分～30分

- [OpenFace](https://scrapbox.io/smart-home/OpenFace)
[![OpenFaceによる、顔のランドマークの検出、および、頭のポーズの推定](https://img.youtube.com/vi/vYOa8Pif5lY/0.jpg)](https://www.youtube.com/watch?v=vYOa8Pif5lY)

    - 顔の行動分析ツールキットです
        - このOpenFaceが抽出した特徴量（視線の方向ベクトル、目の位置ベクトル）を基に、視線トリガー（TriggEye）はカメラ目線を検知します
    - [インストール手順](https://scrapbox.io/smart-home/OpenFace%E3%81%AE%E5%B0%8E%E5%85%A5%E6%89%8B%E9%A0%86)
        - 所要時間：OSによって10分～1時間
    - 注意：OpenFaceの商用利用は有料であり、非営利の研究目的に限り無料 → [OpenFace License](https://github.com/TadasBaltrusaitis/OpenFace/blob/master/OpenFace-license.txt)

# クレジット
視線スイッチはどんな視線推定手法でも作れますが、私が短期間に[視線トリガー（TriggEye）](https://scrapbox.io/smart-home/%E8%A6%96%E7%B7%9A%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC_%EF%BC%88TriggEye%EF%BC%89)を実装できたのは、高性能なのに使いやすい[OpenFace](https://scrapbox.io/smart-home/OpenFace)あってこそです。研究者の皆様に感謝。

- OpenFaceの論文
    - Tadas Baltrušaitis, Amir Zadeh, Yao Chong Lim, and Louis-Philippe Morency, ["OpenFace 2.0: Facial Behavior Analysis Toolkit"](https://ieeexplore.ieee.org/document/8373812), IEEE International Conference on Automatic Face and Gesture Recognition, 2018
- OpenFaceが採用した視線推定手法の論文
    - Erroll Wood, Tadas Baltrušaitis, Xucong Zhang, Yusuke Sugano, Peter Robinson, and Andreas Bulling, ["Rendering of Eyes for Eye-Shape Registration and Gaze Estimation"](https://arxiv.org/pdf/1505.05916.pdf), IEEE International Conference on Computer Vision (ICCV), 2015

# 使い方
[視線トリガー（TriggEye）](https://scrapbox.io/smart-home/%E8%A6%96%E7%B7%9A%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC_%EF%BC%88TriggEye%EF%BC%89)のコマンド `triggeye` に、`カメラ目線を検知するたびに実行するコマンド`を渡すだけで、使えます。

- 見るだけで物理ボタンを押せる視線スイッチ
  - `% triggeye  SwitchBotを押すコマンド`
  - `SwitchBotを押すコマンド`の詳細は後日公開予定

- 見るだけでエアコンをON/OFFできる視線スイッチ
  - `% triggeye  エアコンをON/OFFするコマンド`
  - 詳しくは　→　[格安スマートリモコンの作り方](https://qiita.com/takjg/items/e6b8af53421be54b62c9)
  - ローカルで即座に操作する手法は後日公開予定

- 見るだけでスマートスピーカーを起こせる視線スイッチ
  - `% triggeye 「OK Google」を喋るコマンド`
  - OSごとのコマンドは、以下の通り：
     - Mac	... `% triggeye say OK Google`
     - Windows	... `% triggeye ./say_win ok_google.wav`
     - Linux	... [音声の再生コマンド](https://scrapbox.io/smart-home/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%86%8D%E7%94%9F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)

# カメラ目線の検知の仕組み
カメラを見つめた瞬間を検知する「カメラ目線の検知」の仕組みを説明します。

1. [OpenFace](https://scrapbox.io/smart-home/OpenFace)を使って、視線の方向ベクトルと、目の位置ベクトルを取得します。
![視線の方向と目の位置のベクトル](https://gyazo.com/32dba21675006db38998a5cdec11fac9.raw)

2. 視線の方向ベクトルを、「目とカメラの距離」と同じ長さまで引き伸ばした先を視点とみなします。
![視点](https://gyazo.com/00cc4544fb613322968bb599c13c296a.raw)

3. 視点とカメラの差が「ほぼ0」であれば、カメラ目線として検知します。

視点とカメラの差がぴったり0になることはまずないので、許容誤差を [引数](https://scrapbox.io/smart-home/%E8%A6%96%E7%B7%9A%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC_%EF%BC%88TriggEye%EF%BC%89#5d5ef46dae2d7f00002a7d6c) で調整できるようにしました。[出力](https://scrapbox.io/smart-home/%E8%A6%96%E7%B7%9A%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC_%EF%BC%88TriggEye%EF%BC%89#5d5ef46dae2d7f00002a7d79) を見れば、推定した視点とカメラの差が分かるので、許容誤差を調整する際の参考になるでしょう。

また、（まばたき等に起因する）短時間での連続検知を防ぐため、目線検知の最小間隔も [引数](https://scrapbox.io/smart-home/%E8%A6%96%E7%B7%9A%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC_%EF%BC%88TriggEye%EF%BC%89#5d5ef46dae2d7f00002a7d6c) で調整できるようにしました。

（なお、検知する顔の人数を、「一人」または「複数人」に切り替えるための 引数 も後日追加する予定です。）

# 実装
カメラ目線を検知した時だけコマンドを実行できるようにするため、以下のようなシェルスクリプトを用意しました。

```bash:擬似コード
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` です　→　[triggeye - GitHub](https://github.com/takjg/TriggEye/blob/master/triggeye)