📸
YOLOを使った在室確認サービスを作った話
はじめに
AIを使ってWi-Fiカメラの動画データを分析し、人物をカウントして、DiscordとLINEWORKSで在室確認ができるサービスを作った。
経緯
大学で所属しているサークルで、部室を開けた後、後輩に来てもらいやすいように、LINEWORKSにて逐一「開いた」「閉まった」を報告していた。
......
めんどくさい!!!!
なんとかして自動化できないかと考えた結果、セキュリティ対策で設置していたWi-Fiカメラ(TP-LINK製)の映像を分析して通知すれば幸せになれるのでは???
こうしてサービスが誕生した。
リポジトリ
名前と内容が一致していないのは、最初は「Bluetooth」を用いて作ろうとしていたが断念して、同じリポジトリで作り始めちゃったから。
環境
- Python 3.10.12
- Docker 28.1.1, build 4eba377
- Docker Compose v2.35.1
仕様
以下2つのDockerコンテナが稼働。
- 人物判定処理コンテナ (YOLOを用いてカメラ映像に映る人物を判定)
- 通知処理コンテナ (上記コンテナからPostリクエストがあった際に各種連絡ツールに通知)
通知までのフロー
前提
ネットワーク負荷が大きくならないように、カメラ映像は1分おきに取得
在室時
- カメラ映像をYOLOにて分析
- 「person」と判定したブロックをカウント
-
http://localhost:8080/api/webhooks
を叩く -
./data/people_count.json
のRoomIn
InRoomAlreadyNotice
がFalseの場合通知
-
RoomIn
とInRoomAlreadyNotice
のフラグをTrue
にNoRoomAlreadyNotice
のフラグをFalse
に変更
通知が何回も行くのを防ぐために実装
空室時
- カメラ映像をYOLOにて分析
- 「person」と判定したブロックをカウント
-
./data/room_count.json
のRoomCount
の数値を +1 -
RoomCount
の数値が5 (すなわち約5分経過)になった際にhttp://localhost:8080/api/webhooks
を叩く -
./data/people_count.json
のRoomIn
が True、NoRoomAlreadyNotice
がFalseの場合通知
-
InRoomAlreadyNotice
,RoomIn
のフラグをFalse
、NoRoomAlreadyNotice
のフラグをTrue
に変更
通知が何回も行くのを防ぐために実装
通知の工夫
- 最初の検討
LINEWORKS側でBOTを作成し、そのBOTを介して「OPEN」「CLOSE」の通知を流す- 「OPEN」「CLOSE」が切り替わるたびに通知が起こってしまう。
- 普段サークルの部屋を使わない人、すなわちサービスの必要度が低い人には迷惑
以上の理由から没に
- 結果
LINEWORKSの掲示板 (BoardAPI)を使用。
投稿の編集で、「OPEN」「CLOSE」を切り替え、必要な人はその投稿を見てもらうという形に変更
掲示板の様子
作ってみて
まだ実装が甘いとこ個所はあるけど、いちいち送らなくて済むようになったのは良くなった。
jwtトークンの発行などの知見が少し深まった。
課題
- 夜になると立てかけている椅子を自分と判定してしまうので、オリジナルの学習データを食わせてより精度の良いものにしたい。(今は時間帯で制限をかけている)
- docker の知識をもっと深めたい
最後に
こんな記事を最後まで見て頂きありがとうございました。
まだまだ無知の開発者でありますので、もしコメントされる際はお手柔らかにお願いいたします。
AIは楽しい。
Discussion