推しアイデア
「動画をアップロードするだけで完璧な集合写真が自動で撮れる」 誰かが目をつむってしまうことを心配せずに、誰でも簡単にストレスフリーで完璧な集合写真を手に入れることができる。
「動画をアップロードするだけで完璧な集合写真が自動で撮れる」 誰かが目をつむってしまうことを心配せずに、誰でも簡単にストレスフリーで完璧な集合写真を手に入れることができる。
集合写真はシャッターのタイミングが難しく、誰かが目をつむったり動いたりして撮り直すことも。HappyShotは、そんな悩みを解決するために開発されました。
AIをふんだんに活用した笑顔判定と顔方向検出で、動画をアップロードするだけで楽々ベストショットをゲット&シェアできます!
動画を送るだけで、最高のベストショットが手に入る!
デモURL: https://happy-shot.vercel.app/01jm64jeqy1aa45ej53hvr1rjf
※注意
AIの部分を同期処理でやっているので複数のリクエストがあるとパンクします😵 発表中は送らないようにお願いします(._.)
集合写真を撮るときに、誰かが目をつむっていたり、動いてしまって何回も撮り直した経験はありませんか?また、タイマー撮影ではシャッターのタイミングが難しく、全員が自然な表情を作るのは難しくありませんか?この課題を解決するため、HappyShotを開発しました。
目的 誰がカメラを見ているかを判別し、最適な撮影タイミングを見つける。
詳細 動画からフレームを抽出し、dlibで顔の向きを検出。顔の向きスコアを算出し、グラフ化して2回微分で頂点を検出。スコアが低いフレームや瞬きの可能性があるものを除外し、最終的に笑顔判定を行って最適なフレームを返す。
⬇️フレーム処理前
⬇️顔の向き検出結果
目的 笑顔やリラックスした自然な表情を自動で識別し、最も魅力的な瞬間を選定する。
詳細 顔検出や表情認識を行うライブラリとして、py-featを採用した。
# Detectorの初期化(GPU使用) detector = Detector( face_model="retinaface", landmark_model="mobilefacenet", au_model='svm', emotion_model="resmasknet", device="cuda" )
使用したモデル 顔検出: RetinaFace 特徴点検出: MobileFaceNet 表情認識: SVM 感情認識: ResMaskNet
流れ
目的 タイミングが完璧なシーンを選び出し、撮り直しの手間を省く。
詳細 顔の向きや表情を元に動画内の各フレームを詳細に分析し、最適なシーンを選択。全員がカメラを見ており、笑顔と想定される表情をしている瞬間を特定し、そのシーンを自動的に保存。これにより何度も撮影し直すことなく、ベストな瞬間を簡単に手に入れることができる。
目的 ユーザーが手軽にHappyShotを利用できるようにするため、LINE Botを活用して動画のアップロードや処理完了の通知を行う。
詳細
LINE Botを活用することで、ユーザーは専用アプリを開かずにLINE上でHappyShotを利用できるようになる。ユーザーがLINEのトーク画面で動画を送信すると、Botが動画を受け取り、自動的にHappyShotのサーバーへアップロードを行う。HappyShotが動画から最適なシーンを抽出すると、LINE Botが処理完了の通知をLINEにて行う。
今回はGoogle CloudにGPUサーバーを構築して、そのうえでAIの運用とサーバーの運用を行った。
画像保存のためのオブジェクトストレージもセルフホストしたS3互換のMinioを採用している。
またこれらのクラウド基盤をCoolifyというVercel AlternativeなOSSで構築することでセルフホストの楽しさとDXを両立した技術スタックになっている。
また、画像配信のためのサーバーも当初はGoogle Cloudでやるつもりだったが、HTTPとHTTPSの混合になりエラーになったため、急遽別の手段が求められた。
最初は愚直にCloud Runでやろうと思ったが、さくらインターネットが現在ベータ版を公開しているAppRunが無料で使えることを思い出し良い機会だと思いトライしてみた。
結果としてCloud Runを触ったことがある人なら迷うことなくスムーズにデプロイまでできてDXが良かった。
ハッカソンいえども汚いコードは自分の首を絞めることになるので、GitHub Actionsを活用したCIとVercelでのCDを行った。
CIはフロントエンド、バックエンド両方でlintとformatを行い不一致があれば落とすようになっている。
このCIもフロントエンドではBiomeを、バックエンドではruffを採用することでよくあるCI待ちを減らした運用を心掛けた。
また、フロントのCDではVercelを活用したデプロイを行うことで迅速な開発が行えた。
ランタイム:Bun フレームワーク:Next.js UIライブラリ:Shadcn/ui デプロイ先:Vercel ライブラリ: react-image-grid-gallery
CoolifyでMinioを自前デプロイ
クラウドサービスを使う手もあったが、セルフホストの経験も持っていたほうがよいだろうということで、せっかくのハッカソンなので構築した。 サクラのクラウド AppRunを用いて画像提出&配信サーバーを構築
誰もLINE BOTの経験はなかったが、せっかくのハッカソンなのでやろうということで0時を超えたところから挑戦してみた。
途中から方針転換を行い動画をアップロードする形にしたが、単にWebアプリケーションだけだと処理が長いためいつ終わったのかがわからないため通知ができるようなプラットフォームにも展開することを決めた。
LINEにて機能を提供することにより老若男女幅広く使われるアプリケーションにすることができると思われる。