3D生成手法の比較(フォトグラメトリー & NeRF & 3D Gaussian Splattig)

複数画像を入力して3Dを作成する手法について、フォトグラメトリーとNeRFそして3D Gaussian Splatting(以下, 3DGS)での3Dの生成の仕方と特徴を調べたため簡単にまとめました。
機械学習については多少知見はありますが、3Dに関しては初心者が解説記事などを読み自分なりに情報をまとめたものになるので、誤っている部分があればぜひコメントなどで知らせてください。


# フォトグラメトリー
おそらく一番利用されている3D生成技術で、複数視点の画像から多角形の3Dポリゴンを生成する手法です。複数の画像から類似点を見つけだし、点群データ(=ポイントクラウド)を生成します。その点群を重なり合わない3角形の集合に分割しメッシュを作ります。そして写真の色情報をもとにテクスチャーをメッシュ表面に張り付けて3Dを生成します。

出展: https://jouer.co.jp/comparison-of-photogra-and-laser-scanner/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647699/2625572c-683b-7998-48cc-aa52e93869f3.png)


フォトグラメトリーは多角形でポリゴンを生成しまた写真の色情報からテクスチャーを作成することから、表面に特徴がない平坦な物体や黒塗り、透明なガラスや水面、光の反射などを伴う3D生成をするのは苦手です。また類似点を見つけて3D化を行うため、写真の枚数は多く必要となります。
逆に他の2手法と比べて、多角形の3Dポリゴンで表現するため単一の物体を3D化するのには適しており、また既存の3Dソフトとの親和性が高いなどの利点があります。


# NeRF(Neural Radiance Fields)
NeRFは2020年に発表された機械学習モデルです。複数の視点画像からシーンを機械学習の重みに落とし込み、レイトレーシングのような方式で画像をレンダリングする自由画像生成モデルです。
カメラの視点位置と視点方向を入力にし、体積密度(≒透明感)と放射輝度(≒RGB)でその視点からの画像を出力します。この入力と出力の変換パラメータをニューラルネットワークで学習画像に近づけるように学習することで、3Dシーンを生成します。
なお体積密度と放射輝度から2次元画像を生成するには古典的なボリュームレンダリングを用います。これはニューラルネットワークにて最適化します。

出展: https://github.com/bmild/nerf
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647699/465335c9-7d85-5b4e-232c-6deeb795dd3b.png)

本手法は3Dモデルというよりは自由視点画像を生成するイメージになります。視点ごとの体積密度や放射輝度を学習するため、フォトグラメトリーが苦手とする光の反射や透明な物体も表現することができます。また背景なども含めてシーンとして3D化することができます。
逆にデメリットとしては学習及びレンダリング時にかなりの計算量(≒時間)がかかることとなります。

# 3DGS(3D Gaussian Splatting)
3DGSはさらにNeRFよりも新しく2023年に発表された機械学習モデルです。3DGSは複数の視点の画像からフォトグラメトリーと同じくポイントクラウドを生成します。そのポイントクラウドにパラメータを持った3次元ガウシアンを付与して3D表現する手法です。

3次元ガウシアンとは以下のような位置と伸縮性、色、透明度で表現できる楕円系みたいなイメージを持ってください。この楕円をいくつも重ね合わせることで3Dシーンを表現します。

出展: https://github.com/graphdeco-inria/gaussian-splatting
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647699/79c76bdc-7a35-2298-5fde-79e2a1d9bfea.png)

ポイントクラウドに3次元ガウシアンを付与し、パラメータ(位置、伸縮性、色、透明度)を変化させます。各視点での見え方が正解画像に近くなるようにパラメータをニューラルネットワークで学習し3Dを表現します。以下は透明度をゼロにしてレンダリングした3DGSの画像です。以下を見ると3次元ガウシアン(≒楕円)で表現されていることがわかりやすいです。

出展： https://huggingface.co/blog/gaussian-splatting
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647699/7ca3f4b9-d18b-1367-7a3c-0970dcb71567.png)

3DGSはNeRFと同じくシーンを生成しているため、フォトグラメトリーと比べて表現力が高いです。また学習時は機械学習が必要ですが、レンダリング時はパラメータを使用してレンダリングするだけのため、レンダリングは高速に行えます。
デメリットはNeRFと同じく学習には時間がかかります。またNeRFもそうですが、新しい技術手法のためより既存のレンダリングパイプラインと互換性がありません。3DGSを表現できるWebGLもいくつか出ていますが、数える程度です。

参考: 3DGSのWebGL
- https://github.com/cvlab-epfl/gaussian-splatting-web
- https://huggingface.co/spaces/cakewalk/splat
- https://github.com/aras-p/UnityGaussianSplatting
- https://gsplat.tech/

# まとめ
フォトグラメトリーとNeRF、3DGSの概要と得意・不得意をまとめてみました。最後に表形式でメリデメを比較したいと思います。

|  | フォトグラメトリー | NeRF | 3DGS |
|:-:|:-:|:-:|:-:|
| 得意な表現 | 単一の3Dモデル  | 3Dシーン | 3Dシーン |
| 必要枚数 | △ | 〇 | 〇 | 
| 表現力 | △ | 〇 | 〇 |
| 3D生成の計算量 | 〇 | ×  | ×  |
| レンダリングの計算量 | 〇  | ×  | △  |
| 既存表現との互換性 | 〇 | △ | × |

使い分けとしては用途とどこまでの表現力が欲しいかになるかと思います。

まず既存のレンダリングパイプラインとの互換性を考えるとフォトグラメトリーの圧勝となります。3DGSはそもそもレンダリングできる場所が少なく専用のビューワーが必要になります。NeRFもほぼ同様ですが、こちらは3Dのオブジェクト(OBJ, FBX)形式への変換方法などもいくつかあります。ただし既存の3D形式にすると自由視点画像生成の強みが失われるので表現力はかなり落ちます。ゲームやその他ソフトへ3Dモデルを取り込みたい場合にはフォトグラメトリーがいいと思います。

逆に表現力としてはNeRFや3DGSがかなり強いです。生成までに時間はかかりますが、クオリティを求めるのであればこれらがおすすめです。そして正直NeRFと3DGSを比べると互換性の面では少しだけ劣りますが正直3DGSの方がレンダリングの計算量を考えるとおすすめです。また表現力も(私が軽く使ってみた感じでは)3DGSが高いと感じています。ただやはりこれをレンダリングできる場所が限られているのが難しいところです。3DGSもレンダリングの計算量は少ないとはいえ、フォトグラメトリーに比べると多く、現状GPUがないとスムーズなレンダリングは厳しいです。ここを解消できると品質的には高いので今後の3Dの主流になるかもしれません。

# 参考URL
- https://github.com/bmild/nerf
- https://github.com/graphdeco-inria/gaussian-splatting
- https://jouer.co.jp/comparison-of-photogra-and-laser-scanner/
- https://huggingface.co/blog/gaussian-splatting
- https://medium.com/axinc/3d-gaussian-splatting-%E8%A4%87%E6%95%B0%E8%A6%96%E7%82%B9%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%8B%E3%82%893d%E7%A9%BA%E9%96%93%E3%82%92%E5%86%8D%E7%8F%BE%E3%81%99%E3%82%8B%E6%9C%80%E6%96%B0%E6%89%8B%E6%B3%95-273ce61200a8
- https://chizaizukan.com/property/215/
- https://ai-scholar.tech/articles/nerf/nerf
- https://qiita.com/RyeWiskey/items/9ccc862db91e38e8bbc9