推しアイデア
カメラでの認識結果から、リアルタイムで現在の整いスペースの空き状況を把握し、予約できるサウナー待望の機能を開発。"暑すぎる"サウナで使用するサウナーにとって"アツすぎる"サービスである。
―
Next.js
Flask
TypeScript
Python
TailwindCSS
カメラでの認識結果から、リアルタイムで現在の整いスペースの空き状況を把握し、予約できるサウナー待望の機能を開発。"暑すぎる"サウナで使用するサウナーにとって"アツすぎる"サービスである。
「せっかくサウナでいい汗をかいたのに整いスペースが空いてない」サウナーなら一度は経験したことがあるだろう。このシステムを使うことで日々のサ活がより快適になること間違いなし!!
人の認識と椅子の認識を組み合わせることで、より高精度な空き状況の把握を可能とした。事前にキャリブレーションを行うことで、椅子の位置の変更にも対応することができる。
サウナとはサウナ→水風呂→外気浴
の一連の流れを指す。俗に言う"整う"とは外気浴の際の心地よさのことである。サウナーは整うためにサウナに行っているといっても過言ではない。しかし、外気浴のスペースが満員で整うことができないという問題が発生することがしばしばある。
この問題を解決するために、サウナに出た後に事前に整いスペースを予約するシステムを開発した。整いスペースの空き状況は定点カメラから得た画像から人・椅子を認識することで反映する。"整う"場所を"知る"、すなわち「整know」
(https://youtu.be/RHyfw83Sdmo)
・Next.js(ルーティングが容易・慣れているため) ・Typescript(型宣言により可読性が向上し、フロントとバックの連携が簡単になるため) ・Tailwind CSS(開発効率向上のため)
・Flask(ルーティングが容易・画像処理との親和性が高い) ・YOLOX(人間と椅子のモデルがあったため)
1.椅子のバウンディングボックスを記録 画像内に表示されている各座席の位置を、バウンディングボックスで特定する。このバウンディングボックスは、各座席の範囲を矩形で囲むもので、座席の位置と大きさを記録するために使用する。
2.5秒ごとに人物の認識を実施 頻繁に状態が変わることを考慮し、定期的に、画像内で人物の検出を行う。
3.椅子と人物のバウンディングボックスの重なり具合を計算 椅子のバウンディングボックスと、検出された人物のバウンディングボックスの重なり率(カバレッジ率)を計算する。
4.重なり率が閾値を超えた場合の判定 重なり率が閾値を超える場合、その椅子には人がいると仮定する。ただし、誤検出を防ぐため、定期間隔での検出を3回連続で行い、その間にすべての判定が一致した場合のみ、その椅子が占有されていると最終的に判断する。この仕組みは、偶然の重なりや通り過ぎるだけの人物を椅子に座っていると誤認しないためである。
・本システムはFlaskのみでも実装ができたが、最近のNext.jsに挑戦したかったため、バックエンドとフロントエンドを切り離してAPIでデータのやり取りを行った。
・グローバル変数でバックエンドの状態を監視するシステムになったが、DBが用いればより簡単にできたと思う。
・湯気のアニメーションを手書きで作成した。
本システムはカメラの検出結果と予約情報を同時に処理する必要があるため、データの処理がやや複雑になっている。
以下の条件をクリアする必要があった。
① Backendが2でDetectが0のとき→2
② Backendが2でDetectが1のとき→1
③ Backendが1でDetectが0のとき→0
・サウナに入る前に整いスペースを予約することを想定しているため、整いスペースの占有時間が長くなってしまう。 →整いスペースの滞在時間を制限することで、整っているときから次の人が予約できるようにする。
・カメラの設置はプライバシーの面でよく思わない人が大半。 →カメラでの検出ではなく、感圧センサや赤外線による検出に切り替える。
・キャリブレーション時のYOLOのID付けに規則性がなく、椅子の場所とIDが結びついてない →修正完了!!(バウンディングボックスの座標を基に,左上から右下にかけてソートすることでIDが1,2,・・・となるようにした)