📸

YOLOを使った在室確認サービスを作った話

に公開

はじめに

AIを使ってWi-Fiカメラの動画データを分析し、人物をカウントして、DiscordとLINEWORKSで在室確認ができるサービスを作った。

経緯

大学で所属しているサークルで、部室を開けた後、後輩に来てもらいやすいように、LINEWORKSにて逐一「開いた」「閉まった」を報告していた。

......

めんどくさい!!!!

なんとかして自動化できないかと考えた結果、セキュリティ対策で設置していたWi-Fiカメラ(TP-LINK製)の映像を分析して通知すれば幸せになれるのでは???

こうしてサービスが誕生した。

リポジトリ

https://github.com/yutarou12/bluetooth-in-room-notice

名前と内容が一致していないのは、最初は「Bluetooth」を用いて作ろうとしていたが断念して、同じリポジトリで作り始めちゃったから。

環境

  • Python 3.10.12
  • Docker 28.1.1, build 4eba377
  • Docker Compose v2.35.1

仕様

以下2つのDockerコンテナが稼働。

  • 人物判定処理コンテナ (YOLOを用いてカメラ映像に映る人物を判定)
  • 通知処理コンテナ (上記コンテナからPostリクエストがあった際に各種連絡ツールに通知)

通知までのフロー

前提

ネットワーク負荷が大きくならないように、カメラ映像は1分おきに取得

在室時

  1. カメラ映像をYOLOにて分析
  2. 「person」と判定したブロックをカウント
  3. http://localhost:8080/api/webhooks を叩く
  4. ./data/people_count.jsonRoomIn InRoomAlreadyNotice がFalseの場合通知

https://github.com/yutarou12/bluetooth-in-room-notice/blob/main/main_api.py#L141-L149

  1. RoomInInRoomAlreadyNoticeのフラグをTrueNoRoomAlreadyNotice のフラグを False に変更
    通知が何回も行くのを防ぐために実装

https://github.com/yutarou12/bluetooth-in-room-notice/blob/main/main_api.py#L153-L155

空室時

  1. カメラ映像をYOLOにて分析
  2. 「person」と判定したブロックをカウント
  3. ./data/room_count.jsonRoomCount の数値を +1
  4. RoomCount の数値が5 (すなわち約5分経過)になった際に http://localhost:8080/api/webhooks を叩く
  5. ./data/people_count.jsonRoomIn が True、 NoRoomAlreadyNotice がFalseの場合通知

https://github.com/yutarou12/bluetooth-in-room-notice/blob/main/main_api.py#L169-L177

  1. InRoomAlreadyNotice,RoomIn のフラグを FalseNoRoomAlreadyNoticeのフラグをTrueに変更
     通知が何回も行くのを防ぐために実装

通知の工夫

  • 最初の検討
    LINEWORKS側でBOTを作成し、そのBOTを介して「OPEN」「CLOSE」の通知を流す
    • 「OPEN」「CLOSE」が切り替わるたびに通知が起こってしまう。
    • 普段サークルの部屋を使わない人、すなわちサービスの必要度が低い人には迷惑
      以上の理由から没に
  • 結果
    LINEWORKSの掲示板 (BoardAPI)を使用。
    投稿の編集で、「OPEN」「CLOSE」を切り替え、必要な人はその投稿を見てもらうという形に変更

https://developers.worksmobile.com/jp/docs/board

掲示板の様子

作ってみて

まだ実装が甘いとこ個所はあるけど、いちいち送らなくて済むようになったのは良くなった。
jwtトークンの発行などの知見が少し深まった。

課題

  • 夜になると立てかけている椅子を自分と判定してしまうので、オリジナルの学習データを食わせてより精度の良いものにしたい。(今は時間帯で制限をかけている)
  • docker の知識をもっと深めたい

最後に

こんな記事を最後まで見て頂きありがとうございました。
まだまだ無知の開発者でありますので、もしコメントされる際はお手柔らかにお願いいたします。

AIは楽しい。

Discussion