祖父の安全のための玄関監視システムを作る

## 概要
認知症の祖父が同居する家族の知らない内に玄関ドアを開けて外に出ることがありました。
そこで、家にあった物を用いて祖父が玄関ドアを開けたことを家族にすぐに通知するシステムを作りました。


## 用意
- HP ProLiant DL360 G7（サーバー）
- Xperia Z3 Compact SO-02G（スマホA）　※カメラ用
- ARROWS NX F-05F（スマホB）　※スピーカー用

スマホAを玄関ドアを監視するカメラ、スマホBを家族に音声通知するスピーカーとする。


## 設定
1. 【サーバー】
    [Proxmox](https://www.proxmox.com/en/downloads)をインストールしてその上にWindows11のVMを作成する。
    以降、サーバーとしてこのVMに設定を行う。
1. 【スマホA】
    サーバーと同じネットワークに接続する。
    Google Play ストアから[iVCam](https://play.google.com/store/apps/details?id=com.e2esoft.ivcam&hl=ja&gl=US)をインストールして起動する。
1. 【スマホB】
    サーバーと同じネットワークに接続する。
    Google Play ストアから[wireless speaker for android](https://play.google.com/store/apps/details?id=com.e2esoft.ivcam&hl=ja&gl=US)をインストールして起動する。
1. 【サーバー】
    [iVCam](https://www.e2esoft.com/ivcam)をインストールしてスマホAと接続する。
1. 【サーバー】
    仮想オーディオデバイスである[VB-CABLE](https://vb-audio.com/Cable/)をインストールする。
1. 【サーバー】
    [WiFiAudio](https://wifiaudio.boards.net/thread/2/wifiaudio-support-links-download-application)をインストールしVB-CABLEをキャプチャして、スマホBと接続する。
    インストーラーをダウンロードするにはアカウントを作成する必要がある。
1. 【サーバー】
    gitとpython3.10をインストールする。
1. 【サーバー】
    [cmake](https://cmake.org/download)をインストールする。この時、以下の画像のように選択してパスを通す。
    ![cmake_install_wizard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638009/73f80308-fb29-a7e8-31ed-57ead0042863.png)
1. 【サーバー】
    [Visual Studio](https://visualstudio.microsoft.com/ja/vs/community)をインストールする。
    この時、「C++によるデスクトップ開発」を選択してインストールする。
    ![vs_install_wizard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638009/7c08331f-e1cc-48df-5ba1-ecb1c1ef0b2e.png)
1. 【サーバー】
    必要なモジュールをインストールする。
    ```cmd
    pip install opencv-python
    pip install imutils
    pip install cmake
    pip install dlib
    pip install face_recognition
    ```
1. 【サーバー】
    [kotamorishiさん](https://github.com/kotamorishi)が公開されている顔認識プログラムをgit cloneで取得してホームディレクトリに配置する。
    ```cmd
    git clone https://github.com/kotamorishi/facial_recognition
    ```
1. 【サーバー】
    既に用意されている以下のプログラムを用いて、祖父の顔を撮影し学習させる。
    ラベルはgrandfatherとする。
    | プログラム名 | 機能 |
    | --- | --- |
    | headshots.py | カメラ撮影を行い教師データを作成する |
    | train_model.py | 顔認識モデルに教師データを学習させる |
1. 【サーバー】
    [VoiceVox](https://voicevox.hiroshiba.jp/)で通知用の音声ファイル（notification_grandfather.wav）を作成してプログラムと同じフォルダに配置する。
    今回は「(祖父の名前)さんが外に出ます」という音声にする。
1. 【サーバー】
    既に用意されているfacial_req.pyをコピーしfacial_req_notify.pyとして以下の通り追記する。
    ~~~diff_python:facial_req_notify.py
    + import os
    
    ... 中略 ...
    print(currentname)
    + # check if the recognized person is "grandfather"
    + if currentname == "grandfather":
    +     # play the notification sound
    +     os.system("start C:\\Users\\(ユーザー名)\\facial_recognition\\notification_grandfather.wav")
    + currentname = ""
    
    # update the list of names
    ~~~
1. 【サーバー】
    facial_req_notify.pyを実行する。
    ```cmd
    python facial_req_notify.py
    ```


## 感想
ときどき祖父以外を誤認識・通知しますが、祖父が玄関ドアを開けようとした時の音声通知は実現できました。
また、VPNを設定して遠隔からリアルタイムのカメラ映像を確認できるようにしました。他にも出入りを記録するなど機能を追加する余地はあると考えているので、その内に取り組めたら良いと思います。


## 参考情報
- [Proxmoxで仮想環境をお手軽構築する話 Windows 11VM作成](https://blog.hitsujin.jp/entry/2023/05/15/proxmox-createvmwin)
- [How to Train your Raspberry Pi for Facial Recognition](https://www.tomshardware.com/how-to/raspberry-pi-facial-recognition)