新入社員が課外活動でMESHと画像認識を組み合わせてどこでも出勤記録システムを作った話

[NSSOL Advent Calendar 2018](https://qiita.com/advent-calendar/2018/nssol) の2日目の記事です。

遅い時期に参加を名乗り上げてしまった結果、新入社員なのに社員一人目で記事を書かなければいけなくなってしまったFujisanです。
今回は課外活動で同期３人（A氏、T氏、Hirano）と一緒に作製した二つのシステムのうちの一つ、MESHと画像認識を組み合わせたどこでも出勤簿自動作成アプリ、The WEAR(WhereEver Attendance Record)についての紹介をしたいと思います。

#目次

- MESHとは
- The WEARとは
- なんでこれ作ったの？
- 詳細なシステム構成
- まとめ

##MESHとは

MESHはソニー株式会社が販売しているブロック形状の無線電子ブロックです。下のような見た目をしていて、それぞれが明るさを測ったり人が来たことを検知できたりします。([公式サイト](http://meshprj.com/jp/))
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/315420/5a7a65f5-dbc7-6e3a-671d-3f49640a738b.png)
今回はその中の一つである人感センサー、人が来たことを検知してくれるセンサーを使用しました。

##The WEARとは

どこでも、人感センサー二つとスマートフォンが一つあれば自動で出勤を記録してくれるシステム。それがThe WEARです。
部屋の外側と内側に人感センサーを置いて、人の入室/退室を感知したらその人が誰かを顔認識して、自動で出退勤簿に記録をしてくれる、というものです。
下の画像のような状況で（画像では人はいませんが）、人が来たことを検知したらシステムが写真を撮って顔認識を行い、だれが来たかを特定して出退勤簿に記録を行います。
部屋の外側と内側にセンサーを置いて本システムのアプリが入ったスマートフォンを設置するだけでどこでも使うことができます。
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/315420/250cecc4-ae09-8a8a-c1b1-5b094e9a5b1d.png)

##なんでこれ作ったの？

出勤簿をいちいち記録するのがめんどくさかったからです……
IT企業ならもっと自動化するべきでしょ、と思い立った私は出勤簿をいちいち記録する必要がなく楽に設置できるシステムを作ろうと考えました。
出退勤を自動化するだけならわざわざMESHや画像認識などを使わなくても作れたんですが、ちょうどその時MESHを使用してIoTに触ろうという自由参加の課外活動に参加していました。せっかくだからこれらを使って作れないかなと考え、今回のシステムを考案するに至りました。

##詳細なシステム構成

詳細なシステム構成を説明します。
 
###入室時

入室時は以下のようなフローになっています。

![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/315420/0bfca62c-548a-2bdb-599c-5d95004452a2.png)

####①人が入室

まず部屋に人が入室します。すると室外に置いてある人感センサーが反応した後、室内に置いてあるセンサーが反応します。室外と室内両方にセンサーを置くことで人が外から入るのか、内から出るのか、を判定しました。
人が来たことを感知したらその情報をMESHのアプリに送信します。

####②入室か退室かを判断して、入室時は音を鳴らしてカメラのほうを向かせる。
MESHには下のような回路図を作ることで簡単に各センサーを連携させるという機能が存在しています。AND回路や音を鳴らす、センサー情報などをタグと呼ばれるアイコンで表し、それらを配置し線をつなぐことでシステムを作ることができます。
![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/315420/21029232-352b-1c47-6d4b-cff16effe0e5.png)
この回路図は実際にThe WEARで使用した回路図です。
室内と室外のセンサーをANDでつなぎ、室内→室外の時入室と判断しています。そして入室時は入室者に顔認識のためスマートフォンを見てほしいので音を鳴らして入室者の顔をカメラに向けさせるようにしています。
この時正確に入室と退室を判断させるための調整に非常に苦労しました。
歩く速度は人によって様々なので、できるだけいろんな速度の人に対応できるようにパラメーターの微調整が必要で、いろいろとみんなで試行錯誤しました。
何回も部屋を出たり入ったりして。通りかかった同期に何してるの？　とかもよく聞かれました笑

####③入室の情報を自作の顔認識アプリに送信する
MESHでは音を鳴らすなどの既存のタグのほかに、自分たちでオリジナルの機能を持ったタグを作ることができます。
その機能を使って自作した顔認識アプリに人感情報を送信するタグを作り、情報を送っています。
この時どうやって情報を送るかはだいぶ苦労しました。
MESHの仕様で通信処理はAjaxでしかできないというのがあります。ですが自作アプリはUnityで作っていて、Ajaxの通信をどうやって受け取ろうかというのをAjaxを使ったことがないこともあって手探りで進めていました。
最終的には自作アプリのほうにスマートフォンのモバイル通信のIPアドレスでサーバーを立てて、そこにPOSTすることで情報を受け取ることができました。モバイル通信のIPアドレスで通信を行っているため、携帯さえつながる場所ならどこでも情報を送信することができます。

####④人が来たタイミングで写真を撮って顔認識を行う

ここからは自作アプリの説明になります。
まず自作アプリは以下のような画面になっています。
アプリの基本的な部分は「Unityゲーム プログラミング・バイブル（著）吉谷 幹人　他」に記載してある「WebCamTexture Microsoft Azureでの顔認識」のサンプルを参考にしています。
![無題5.png](https://qiita-image-store.s3.amazonaws.com/0/315420/b2d4bb3e-e0f1-4908-4e13-6c37fa867277.png)

まず画面の下部にIPアドレスを記入してサーバーを起動することで人感情報を取得することができるようになります。
人感情報が来ると写真を撮影します。このとき顔認識を行い、右の緑の枠内に写真に写った人物の情報が表示されます。内部ではMicrosoft AzureのFace APIという顔認識サービスに画像を送信して、顔認識をしてもらっています。十分な認識用の画像群を用意すれば、人物推定も可能になります。
Azureはけっこう簡単に使えて、アカウント登録さえすれば年齢推定などならAPIに画像を投げるだけでその画像の情報を返してくれます。システムに組み込みやすい仕様でした。

####⑤推定した人物を出退勤簿に記録する。

推定した人物の出勤時間などを出退勤簿に記録します。
そして定時になると出退勤簿を事務に送信します。

###退室時

退室時は以下のようなフローになっています。
入室時に比べて非常に短いです笑
今回のシステムでは退勤時には何もしないようにしているためこのようにシンプルになっています。
もし退勤時も記録をしようとするなら入室時のフローとほぼ同じようになります。（回路図が変わるぐらい）

![無題6.png](https://qiita-image-store.s3.amazonaws.com/0/315420/78e5bd36-c323-1e7f-f6b2-01f250305c20.png)


##まとめ

今回作成したシステム、The WEARはどこでも簡単に、MESH二つとスマートフォンを用意するだけで出退勤簿の記録を自動化できるシステムです。
特徴は安価で手軽に導入が可能なこと（人物推定のための画像群はいりますが）
センサーとカメラを置けばどこでもだれでも使えるので、手軽に導入できます。
今回は人物推定だけですが、Face APIには感情推定などの機能もあるため、やろうとすれば社員の体調管理などもできると思います。
今回のシステムは色んな技術を組み合わせてはっきりしたコンセプトのものを作ったので良い勉強になりました。IoTって色んな技術を知らなきゃ作れないから難しい。
あとみんなでわいわい言いながら作るの楽しかったです。