3Dで！思い出を残したい！(LumaAIお試し編)

# ああ、二度とこの景色は見られないかも
と、思ったことはありませんか？
私は旅行先だったり、ふとした平和な時間によく思っています。
そんな思い出をどうにかして残したいですよね！誰かと感動を分かち合いたい！

写真や動画を撮るのももちろんいいのですが、その空間の雰囲気を伝えたい欲求が私にはありました！

### 良さそうな3D生成技術/サービスに触れて温度感を知りたい！！
360度カメラによる撮影やLiDARセンサーの活用などでも遊んでおりますが、今回は動画像から3Dモデルを生成する**Gaussian Splatting**という技術に注目します。

というのも、普段↑のような遊びをしていた私のGoogleアカウントに、「Gaussian Splattingがアツい！」というニュースが9~10月ごろにかなり届いておりました。

どんなイケイケの技術かを実践したいとずっと思っており、今回はサービスとして手軽にGaussian Splattingを試せるLuma AIを活用することにしました。（詳細後述）

例えば、私は以下のようなXのポストを見て興味を抱きました！
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="en" dir="ltr">🔥Luma magic reveal🔥<br>Make it yourselves 👉🏽 <a href="https://t.co/tE2WKKn7bR">https://t.co/tE2WKKn7bR</a><a href="https://t.co/xS1BuxkFl9">https://t.co/xS1BuxkFl9</a> <a href="https://t.co/wcWHt8gpFy">pic.twitter.com/wcWHt8gpFy</a></p>&mdash; Luma AI (@LumaLabsAI) <a href="https://twitter.com/LumaLabsAI/status/1721267504168018353?ref_src=twsrc%5Etfw">November 5, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Gaussian Splattingで生成されるのは動画ではなく3Dモデルでして、専用のビューワーやエクスポートしたファイルでなら**自分で好きな角度に視点を変えながら楽しめる**んです！！
未来の自分に感動した景色をそのまま残したり、遠方の家族に自分の旅行先の感動を臨場感のある形で共有できる可能性があります。

ここまでで私が感じたわくわくは多少伝わったと思っており、モチベーションの話は以上とします！！

そのうえで、**どうやったらこのクオリティのモノが作れるのか**を調査します。

### 本記事でできたもの
結論から言うと、例のような超ハイクオリティのものを作るには**それなりの労力が必要そう**です..。
が、ある程度の3Dシーンはそれなりの枚数の画像を撮るだけで作れました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/e013237b-b141-4d6a-b026-aa376e98d5f5.png)


↑のような3Dモデルが出来ました。


# はじめに
~~ここまで長々と書いておいて何が「はじめに」だよというところはありますが~~今回はQiitaアドベントカレンダーの1枠としてこのような触ってみた系の記事を記載させていただきます！
普段はAWSのようなパブリッククラウドやk8sといった基盤系技術に業務で携わっております。
今回は完全に私の興味からネタを持ってきています！

今回は、LumaAIがどんな感じで使えるのか、お試し編に位置付けています。

# Gaussian Splattingとはすごい技術だがカジュアルに使うにはハードルが高い..
今年8月に開催されたSIGGRAPH 2023(コンピュータ・グラフィクスやインタラクティブ技術に関するカンファレンス)で発表されたプロジェクトです。

論文は以下URLの通りでして、abstractから更に抜粋します。

https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/

> First, starting from sparse points produced during camera calibration, we represent the scene with 3D Gaussians that preserve desirable properties of continuous volumetric radiance fields for scene optimization while avoiding unnecessary computation in empty space; Second, we perform interleaved optimization/density control of the 3D Gaussians, notably optimizing anisotropic covariance to achieve an accurate representation of the scene; Third, we develop a fast visibility-aware rendering algorithm that supports anisotropic splatting and both accelerates training and allows realtime rendering. We demonstrate state-of-the-art visual quality and real-time rendering on several established datasets.

どうやら、高速に高品質な3Dモデルを動画像から生成する技術のようです（ｶﾝｾﾞﾝﾆﾘｶｲｼﾀ）

もう少し読むと、画像から点群を推定し、ニューラルネットワークのような確率的勾配降下法を用いて3Dモデルを作るようです（ﾌｰﾝ?）

GitHubで用意されたツール群を導入することで、個人PCにも導入してローカルで試すことが可能です。

https://github.com/graphdeco-inria/gaussian-splatting

ただ、Hardware Requirementsを見てみると、
> CUDA-ready GPU with Compute Capability 7.0+
24 GB VRAM (to train to paper evaluation quality)
Please see FAQ for smaller VRAM configurations

との記載があり、それなりのマシンパワーが必要です...(この記事を言い訳にデスクトップPCを新調しましたが、メモリの増設が間に合いませんでした..)

# そこでLuma AIですよ！

LumaAIは、カリフォルニア州サンフランシスコ発のLumaLabsというソフトウェア開発会社によって開発されたWeb/スマートフォン向けアプリケーションで、NeRFと呼ばれるフォトグラメトリとは違う技術で3Dモデル作成にアプローチできるアプリです。
NeRFという技術をアプリ経由でサクッと使える(画像をアップロードするだけでモデルを作れる)だけですごいのですが、なんと今年10月頃にGaussian Splattingにも対応しました。

:::note info
..と、NeRFやフォトグラメトリとかいろいろ単語を出しましたが、**Luma AIというアプリを使うことで簡単にGaussian Splattingが試せる**とご理解いただければこのブロックで言いたいことは100％伝わっております！
:::


アカウント登録して、動画像をアップロードすればOKです！
今回の私がやりたいこと(Gaussian Splattingを触ってみたい！)はこれでばっちり試せました。

https://lumalabs.ai/

サインアップし、さっそく作っていきます。
似たアプリにPolycamというものもありますが、Gaussian Splattingを非公開にしつつ無料で試せるという観点からLumaAIを選択しました。

色々書いていますが、今回の主眼はGaussian Splattingで遊んでみたい！というところにあり、あまりサービスの選定や使い方に重きをおいていません。

# 素材集めの前に、準備を確認
闇雲に写真撮影をしてうまく行かないとちょっと悲しいので、必要そうな情報を集めます。
以下にLumaAI使用時のベストプラクティスが公開されていますので、確認してみました。

https://docs.lumalabs.ai/MCrGAEukR4orR9

抜粋すると、以下のことを注意すればよさそうです。
- ゆっくり撮る(ブレた写真・動画は避ける)
- できるだけ多くの視点で撮る
- オブジェクト全体をフレーム内に捉える
- 動き回るものは苦手(まあそうですよね)
- 動画を使う場合は、動画安定化をオフにすることが望ましい
- 動画よりも画像が望ましい

画像/動画から学習して3Dモデルを作る技術ですよ、ということを考えれば納得のベストプラクティスですね！

# 素材撮影
~~人が居ない深夜に写真を撮る時間が一番つらかったです~~

大量の写真・動画を撮りに行きました！
撮影しているのはGooglePixel 8 Proです。
画像：解像度12MP・RAW撮影は無し・ISO2500固定
動画：4K・フレームレート60fps・手ぶれ補正標準(オフが選べず..)

▼ 撮影した画像データイメージ
![PXL_20231128_162712980.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/14fa2558-bfa2-273f-076f-7c5331374cd6.jpeg)

▼ 撮影会場イメージ(左側に木、右側にお洒落な縁石？がある小道となっております)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/44bb6ce9-7250-7630-aa56-3bbced50621d.png)

# 結果

:::note info
ここから、LumaAIに撮影した画像を登録してみて、
どんな素材を入れるとどんな結果になったか、ご紹介していきます！
「なるべく手軽にモデル化したい」が根底にありますので最大限省エネのケースから実施します！
パターン①～⑧まで、どうぞお付き合いください。
:::



---
と、その前に少しだけ脱線..

### ご参考：LumaAIでの試し方は超カンタンです！ちょっと悩んだあなたは今すぐ試してください！
手順は超シンプルで、LumaAIにサインアップしたら
「Interactive Scenes」⇒「Start Now on Web for Free」と登録画面に遷移し、
Createから自分の作成した画像たちをアップするだけです。
画像をアップする際は、zip形式での圧縮をして1ファイルにすることをお忘れなく！
URL再掲しておきますね..

https://lumalabs.ai/

▼ Create画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/264149bd-7465-520d-e1a8-6053e3e2c136.png)

以下のような形で名前を付けて、画像形式を選択すればOKです！
360度カメラで撮った画像の場合はCamera Typeを変える必要がありますが、
普通にスマホやデジカメ等で撮った画像の場合はNormalでOKです！

▼ 画像の登録画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/e126cbee-0fab-373a-33d7-5b6cf64768f8.png)

ここまで終われば自動的にキューイングされてモデル化してくれますので、
わくわくしながら待つだけです！本当に、写真撮ってzip化してぶち込むだけの非常に簡単なステップです。

脱線ここまで！以降は私がモデルを作ってみた結果のご紹介に戻ります！
---

## パターン①：動画から読み込ませる
やったー！異世界が作れました！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/d44d5740-e84b-1a55-c765-e68c365cb890.png)

「の」の字を描くようなイメージで約1分30秒の4K動画を撮ってアップしたところ、なんとなく分からなくもない~~分からん~~モデルが作れました！

▼ 撮影イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/41f58113-250d-0292-781c-45c4b9f8a1c0.png)


旅先でさっと動画を撮って思い出を3Dデータ化するユースケースを思うと動画から生成できるとやはり楽な気がしますので、もう少し撮影時間を延ばし、角度や高さを変えながら試してみます。

## パターン②：長めの動画から読み込ませる
結果から書くと、そもそも学習に失敗してしまいました..。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/ae31d85e-c4b1-fd95-3270-c66c1928f054.png)

パターン①と同じコースで高さを変えて2周した約3分の動画で、パターン①よりも情報量は増えたはずですがダメになってしまいました..

もっと明るいところで全体を撮ってね！と言われてしまっており、少なくとも今回の私の環境(深夜且つオブジェクトというよりも歩道全体を撮りたい)では相性が悪そうでした

仕方ないので、画像で実施します。

## パターン③：画像3枚のみ
ミニマムを試したく、流石に厳しい予想はできますが、以下3枚の画像だけで作成しました。（~~流石に26時くらいともなると人がいません~~）
![PXL_20231128_162704379.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/db884e44-7392-a6cd-7814-0ceed40dfc40.jpeg)
![PXL_20231128_162706103.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/0d13f55c-cd63-a51e-60f9-d2e22529f6db.jpeg)
![PXL_20231128_162708264.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/65a34317-868e-d8de-035f-88cb139e9fe2.jpeg)

▼ 撮影イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/5ea44e17-f312-6496-74fa-ccf0b94eb222.png)

結果、画像枚数少なすぎ！最低10枚は撮ってね！と怒られちゃいました..
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/9a52cce1-53af-51e1-f1c5-ae91eda4f98c.png)

## パターン④：12枚で撮影！
パターン③の画像はスタート地点から見て「正面」「左より」「右寄り」の3枚でした。
この画像をもとに、3歩ほど歩いて同じように3枚撮っていきます。
計12歩歩いて、3×4=12枚で挑戦です！

▼ 撮影イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/09308c63-9bbb-71f6-81bb-f87b015b81c0.png)

今回は処理が進み始めました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/3aaa437e-c55e-0ea9-55ef-4ea47c479afa.png)

と思いきや失敗です...動画と同じく、情報が足りないみたいでした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/46a9a66b-8e33-cf92-a89c-270cfc488e6a.png)

## パターン⑤：撮ったあと折り返して全体感を撮影
仕方ないので、画像枚数を一気に増やします。
「正面」「左より」「右寄り」の3枚セット×5のあと、
折り返して後ろを向いて(スタート地点あたりを見ながら)同じように撮影しました。
パターン④との差分としては、「画像枚数増加 + 反転して撮影を実施」 となります。
計73枚の画像で再挑戦です。

▼ 撮影イメージ(矢印数・位置は正確ではないです..)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/7b5d47e7-73d1-65e6-2c14-088665214450.png)


▼ 結果
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">Luma AIでガウシアンスプラットを試してみました！ <a href="https://t.co/PYCGcIobxj">pic.twitter.com/PYCGcIobxj</a></p>&mdash; わっせ (@kawassssssse) <a href="https://twitter.com/kawassssssse/status/1731732597649383915?ref_src=twsrc%5Etfw">December 4, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

急にそれっぽいモデルが出来ました！
やはりベストプラクティスにあった
- できるだけ多くの視点で撮る
- オブジェクト全体をフレーム内に捉える

あたりを守ることはとても大切そうです。

## パターン⑥：味を占めてもっと大規模に撮る

パターン⑤のデータに合わせて、更に50枚くらい左側の木の陰のデータも加えて作成してみました。

▼ 撮影イメージ(矢印数・位置は正確ではないです..)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/223f80bc-d73c-1bb2-ac94-d1bdc89238af.png)

▼ 結果
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">木の裏も撮ってみました <a href="https://t.co/gyrl4sX1Zz">pic.twitter.com/gyrl4sX1Zz</a></p>&mdash; わっせ (@kawassssssse) <a href="https://twitter.com/kawassssssse/status/1731733629611745347?ref_src=twsrc%5Etfw">December 4, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

レンダリングされた動画には粗さも目立ちますが、それらしさが増しています。

## パターン⑦：もう少し明るいところで撮影
そもそも失敗していたパターンは明るさが原因と書かれていたりもしていましたので、ここまで頑張っていた撮影ポイントを一旦諦めて光源がある箇所にずれて、もう少し光を取り込みながら撮影しました。

「正面」「左より」「右より」の3パターンの画角に加えて、「上向き」「下向き」を加えています。
5パターン×14で、計70枚の画像で挑戦します。

▼ 結果、一番それっぽくモデルができました！
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">かっこよく見える、、 <a href="https://t.co/FjJKO2NY7C">pic.twitter.com/FjJKO2NY7C</a></p>&mdash; わっせ (@kawassssssse) <a href="https://twitter.com/kawassssssse/status/1731735263788081513?ref_src=twsrc%5Etfw">December 4, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## パターン⑧(本記事のラストパターン)：撮った素材全てをぶち込む！！！
ここまででご紹介していない角度でも画像を撮っておりまして、計500枚くらいの素材画像がありました。
画像同士ある程度同じ場所を撮っているので、
「もしかしてとりあえず全部突っ込めば大きな範囲の大きな綺麗なモデルができるのでは、、？」
と期待して全てをぶち込んでみました。

▼ 撮影イメージ(全然正確ではないですが、このくらいやけくそで全部入れています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/134e85d7-0b5c-2eb2-3d27-331d0a096f75.png)


▼ 結果
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">素材は多ければ良いってものでもないらしい、、 <a href="https://t.co/v7zL6iIvIK">pic.twitter.com/v7zL6iIvIK</a></p>&mdash; わっせ (@kawassssssse) <a href="https://twitter.com/kawassssssse/status/1731736540517441801?ref_src=twsrc%5Etfw">December 4, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

全体感が分からない画像が多くなってしまうためか、モデルも穴があったりモヤがかかっていたり、全てぶち込めば良いというわけではなさそうです...

# 実践してみて分かったこと
ここまでの実践によって、以下のことが分かってきました！(~~ほぼベストプラクティスの情報を体感しただけ...？~~)
- 少なくとも暗い箇所では動画は向いていない
- 複数の角度から撮影が必要
- 明るいところで撮ったほうがクオリティが高い
- 「とりあえずあるだけの画像を入れれば一番良いものが出来る」訳では無さそう

とりあえずGaussian Splattingってなんだ？どんな感じかな？という気持ちで触ってみましたが、
かなり楽しめそうで奥が深いコンテンツであることが理解できました。

XやLumaAIのFeaturesを見ると非常にハイクオリティな作品ばかり目にしますが、きっとそれらの成果を得るには撮影者の努力があるんだろうな..と推察しております。

これから綺麗なGaussian Splattingの結果を見る際、撮影者への敬意を忘れずにいられそうです！

# おまけ(と言いながら大切なのはここな気がします)
LumaAIの嬉しいところとして、様々なフォーマットで作成したモデルを取り出せる点が挙げられます。
例えば、glb形式でダウンロードできるのでUnity等にインポートしたり、AWS IoT TwinMakerのシーンにインポートしたりできます！
今回一番きれいにできたパターン⑦の結果を取り出すと以下のようになっています。

粗さはありますが、それなりに場所やクオリティが理解できるモデルが作れています！


▼ LumaAIからダウンロードしたモデル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/3a90b803-9578-8a77-7fab-036325622cd3.png)

▼ 視点を変えた版
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629247/e013237b-b141-4d6a-b026-aa376e98d5f5.png)



# さいごに
地面の歪み等こそありますが、たかだか70枚の画像だけでこのような3Dモデルやレンダリングされたお洒落な動画が作成できるのには驚きです！
今後、**もっと明るい箇所で画角を意識しながら数百~数千枚の画像を使って試せばより良いモデルができるのでは**と期待しています。

多数の画像撮影には苦戦しそうですが、旅先の雰囲気を画像とも動画とも違う形で誰かに共有する選択肢の一つになりそうだと思いませんか？

次回以降の記事では、
- 本気で画像から3Dモデルを作るならNeRFやフォトグラメトリ・Gaussian Splattingの何を使えばいいのか
- Gaussian SplattingをLumaAIではなく自前のデスクトップPCで試すと結果は変わるのか
- 明るいところで撮影角度や枚数を本気で設定すれば高品質な3Dモデルが作れるのか
- (あきらめきれないので)動画から上手くモデル化する方法

だったりを記事にしたいと思っております！

またお願いいたします。ご拝読ありがとうございました！！