開発合宿第二弾!! 顔認証を使用した入退室管理を作った話

投稿者
ヒヨシヨウスケ

今年はなかなか梅雨明けしませんね・・・。
夏が待ち遠しい開発部のヒヨシです。

前回の 開発合宿第一弾!! オンライン合コンアプリを作った話 に続いて第二弾!
今回は顔認証を使用した入退室管理システムについて、技術的なところを中心にご紹介します。

イベントレポートは下記に掲載していますので、こちらも併せてご覧ください。
オンライン開発合宿の成果発表会を行いました! | 株式会社スタートアップテクノロジー

作ったアプリ

顔認証を使用した入退室管理システム

背景

スタテクではISMS準拠のため入退室の記録を取っています。
この記録には、Slackの専用チャンネルで報告するような手作業の運用がおこなわれていました。
この運用、自動化させたい・・・!という想いから、今回のアプリを開発しました。

顔認証のデバイスはAWS DeepLensを使用すると楽に進められます。
が、選定にあたってメンバーから「Raspberry Piを触ってみたい!」という声が上がりました。
それならRaspberry PiでコンパクトなAWS DeepLensを作ってみよう!ということになりました。

アプリデモ

figure_01

最初に撮影された顔画像は「不明な組織の不明な入退室」として保存され、あとから管理画面より組織・入室者情報の設定が可能です。

figure_02

随時入退室時刻が記録され、管理画面より一覧で確認ができます。

構成・技術スタック

figure_03

  • Raspberry Pi 4B + カメラモジュール
    • 入室側、退室側と2セット必要になります。
  • Python + OpenCV
  • Rails + AWS(管理画面、API)
  • AWS Rekognition
  • Terraform + Ansible
  • Docker(Rails開発環境)

Raspberry Pi 4B + カメラモジュール

こちらはプラモデル感覚でスムーズに進められました!
OSはカメラやWiFi設定のしやすさからRaspberry Pi OSを使用しています。

Python + OpenCV

カメラコントロールと、データのAPI送信をおこなっています。

OpenCVがカメラ映像から顔らしきものを認識したことをトリガーに撮影。
撮影した画像をRailsのAPIに送信します。

OpenCVは顔以外にも全身、目、笑顔、猫の顔など様々なパターン定義があるので、夢が広がりますね!

詰まったところ

カメラ、OpenCV関連の依存Pythonモジュールが多く、追っかけ的なインストールに時間がかかりました。

また自宅で試したところ、テディベアの顔も認識してしまったため、精密な判定は後述のRekognitionに任せるようにしました。

AWS Rekognition

Raspberry Piで撮影した画像を元に人物を特定。顔IDを返します。
また、前述の通りOpenCVで認識しきれない部分の補完として、人の顔以外の場合は弾くようにしています。

Railsと連携する箇所はModelに記述するとfat Modelになりがちなので、Service層に切り出しています。

Terraform + Ansible

AWSのRails環境構築にTerraform、EC2のセットアップにAnsibleを使用しました。
VPC + EC2 + RDS + ElasticCache(Redis)といった、一般的な構成です。

今回は初めてTerraformに触れるメンバーがチャレンジしました!

感想

体制としては火・水・金の午前中に時間をとり、Discordで随時画面共有しながら作業を進めていきました。
普段業務で関われないメンバーとモブプロ的な感じで進められ、とても楽しかったです!

また、各々が初めて触れる技術・設計思想に取り組むことができました。
こうしたイベントならではの醍醐味ですね!
これにより、多くの知見を得ることができました。

一方でハードウェアの組み立て工程などの楽しさみたいなところを、フルリモート条件下で共有していくのは難しいなと感じました。

今後の展望

スタテクの入口ドアは、Akerunでロックしています。
将来的にはAkerunと連携し、社内メンバーの顔認証と組み合わせてロック解除する機能を追加していきたいです!

一緒にスタートアップを盛り上げませんか?
開発合宿第一弾!! オンライン合コンアプリを作った話
2020/07/17