こちらはクソアプリ - Qiita Advent Calendar 2024 23日目の記事です。
はじめに
このように顔を隠した写真をSNSで見ることがあると思います。
しかし、スタンプで隠すとあまりに 誰が誰かわからない
とはいえ、「顔は出したくないんだよな……」 という気持ちもわかる。
なら、こうすればいいじゃないか。
アプリについて
ということで、「Face Swapper」 というアプリを作りました。
以下はアプリの使い方です。
事前に顔とアイコンを保存しておく
残念ながらここは完全手オペです。そして、現在この画面は私側で管理しています。
つまり、アプリをリリースしているものの、顔ハメが適用されるのはここに登録している一部の方のみです。本当はユーザーが個別で登録できるようにしたい。
集合写真をアップロードする
ユーザーが見れるのは、画像アップロード用のトップページと画像生成後画面のみです。
非同期処理とかにしているわけではないので、処理がわりと遅いです。途中で離脱したくなるかもしれませんが勘弁してください。
完成!
合成後写真がダウンロードできます。ぜひSNSで使ってください。
技術スタック
今回、機能が限定的なこともあってとてもシンプルです。
Amazon Rekognition
コアの部分です。CompareFacesを使いました。かなり精度が高かったので「もうこれだけでいいじゃん」となりました。
難点としては1対多の比較しかできないので、1つの画像に対してユーザー分N+1リクエストで判定しています。そのため、保存しているユーザー数が多ければ多いほど処理が重く長くなります。
Rekognitionは従量課金ですが、よっぽど使い倒さない限り数百円で収まりそうです。
MiniMagick
画像加工はMiniMagickを使いました。
- アイコン画像をアップロードしたら丸く切り抜くようにする処理
- アイコンを顔の上に重ねる処理
Rekognitionの返り値で、顔の位置情報も取得できるので、それを使ってアイコン画像を重ねるようにしています。素直に重ねるとアイコンが縦長になる(基本的に顔面は縦長なので)ので、アスペクト比が壊れないように調整しています。
Rails 8
Rekognitionを使って、ローカルで検証して動くことを確認したので、アプリ自体は手慣れたRailsで2日くらいで作りました。
あと、S3との連携に頭を使わなくてもいいので、ActiveStorageは楽です。
Render.com
最近はバックエンドがあるアプリをあまり作っていなかったので、いろいろな情報からデプロイが楽らしいというRender.comに登録しました。
無料なのでサクサクというわけではないですが、まあ許容範囲といったところです。放置するとスリープするため、UptimeRobotで定期的に起こすようにしています。
おわりに
アイデア自体は「わりといいのでは?」と思ったものの、いろいろと粗がある出来です。さすがに個人でも登録して使えるようにしたいので、それができ次第きちんとリリースをしたいです。
とはいえ、クソアプリハッカソン 2024をきっかけにアイデアを形にすることができたので、とても楽しかったです!