会議室を自動解錠するshusaku.murakami2018年6月、弊社にて「OpenSesameプロジェクト」が立ち上がりました。目的はその名の通り、「開けゴマ」です。DeepLensを使用して会議室のドアを自動で解錠します。GPIO制御をメインにお話します。DeepLensの基本事項や設定方法については過去記事で紹介しておりますのでそちらをご覧ください。DeepLensを購入しました〜コミュニティプロジェクトデプロイ編〜構成まず、大まかなシステム構成は以下の通りです。Groupによって通信するでは、具体的な実装について紹介していきます。事前準備Rekognitionに顔コレクションを作成しておきます。顔コレクションとは、顔のデータを集めて保存しておくコンテナのことです。今回は、作成したコレクションに社員の顔データをあらかじめ保存しておきましょう。Piをデバイスとして登録しておきます。GreenGrassについては知らない方も多いかとは思いますが、ここでは「IoTデバイス間でのローカル通信を実現するサービス」ぐらいの認識で大丈夫です。人の顔を検知するフェーズです。映像の中から人の顔をキャプチャします。顔を検知するサンプルプロジェクトがAWS側で用意されているので、こちらを利用しました。「誰の顔なのかを識別する」機能は含まれていません。そこで、「顔を識別する」役割はRekognitionに任せることにします。検知した顔が誰なのか識別するフェーズです。Rekognitionの顔コレクションから検索することで実現します。APIを使用するために、deeplens-face-detection関数に手を加えます。オペレーションを使用することで、コレクション内の顔データと一致するものがあるかどうか検索することができます。しきい値以上で一致する顔データがコレクション内に見つかった場合は、json形式のレスポンスが変数responseに格納されます。Piに解錠を依頼するフェーズです。PiにMQTTメッセージを送信します。14行目では、10秒以内に同一人物がキャプチャされた場合は判定しないように設定しています。last_recognized_faceとlast_recognized_timeは、映像をキャプチャするループの前に定義しておきましょう。「時刻(time)、一致した顔データ名(name)、一致度(similarity)」だけを抽出して送っています。Piが解錠処理を行うフェーズです。Pi上でbasicDiscovery.pyが稼働しています。basicDiscovery.pyは、デバイスから送られてきたメッセージを処理するスクリプトです。このスクリプトはデフォルトでは受け取ったメッセージを表示するだけなので、ドアを解錠するための電気信号を送るように修正します。PiのGPIOを操作するのに使います。IO.setupで40番ピンを出力に設定し、メッセージを受け取った時に0.01秒だけ出力します。ドア解錠!会議室ドアの電気錠に信号を送って解錠するフェーズです。Piと電気錠はリレーモジュールで接続します。・6番ピンがGround・40番ピンが出力という形で使用しています。リレーの反対側は会議室の電気錠に接続します。業者さんに工事してもらって接続用の配線を一本出していただきました。長めのUSBケーブルで接続し直すことでカメラと本体を分離しました。Piは天井裏に設置しています。Piにメッセージが送られ、ドアが解錠されるようになります。接続にはけっこう時間がかかりました。一箇所ずつ接続確認しながら進めることをお勧めします。工夫した点1プロジェクトストリームの削除DeepLensには2つの出力ストリームがあります。今回はプロジェクトストリームを出力しないことで、処理の負荷を軽減しています。APIに直接画像を送信しています。この方が処理速度が向上します。東京リージョンに設定した方がレスポンスが早くなりました。間のローカル通信が不安定0.1秒かからないこともあれば、20秒近く要することもありました。原因はまだ特定できておらず。設定が悪かったのか?DeepLensの性能限界なのか?こちらもまだ調査中。3熱い常時稼働させておくとDeepLensが熱くなります。本体と一緒に冷却用のファンなどを置いておく必要がありそうです。おわりにリンクバルでは、一緒に働くエンジニアを募集しています。・技術によって日本をよくしていきたい・人と人との出会いを生み出していきたいそんな方はまずこちらをご覧ください。人気ブログリンクバルが採用したい人、リンクバルで活躍している人。元PHPエンジニアがPHPとRubyを比較してみた【社長インタビュー】どんどんチャレンジし、経験を自分の成長の糧にできる。それがリンクバルです。