なんか3Dの性能がいい謎の技術みたいなので、みてみます。
3D Gaussian Splatting for Real-Time Radiance Field Rendering
Bernhard Kerbl, Georgios Kopanas, Thomas Leimkühler, George Drettakis
https://arxiv.org/abs/2308.04079
解説記事もいくつかありました。
3D Gaussian Splatting : 複数視点の画像から3D空間を再現する最新手法
https://medium.com/axinc/3d-gaussian-splatting-複数視点の画像から3d空間を再現する最新手法-273ce61200a8
3D Gaussian Splatting の概要
https://note.com/npaka/n/ncd4b84c1e2eb
Introduction to 3D Gaussian Splatting
https://huggingface.co/blog/gaussian-splatting
多くの解説記事があるのでもう解説する必要なさそうだなと感じながら、多くの解説を見ると、
1、最初に二次元の画像から三次元の点群データを推定する。
2、点群データをガウシアン(関数)に変換する。
3、ガウシアンのパラメータを最適化する。
ということみたいです。3Dポリゴンではなく、点を使いますが、最初に点を決めて次に点を関数に変換して各点に対応する関数のパラメータを最適化します。ガウシアンのパラメータ最適化にはSGDを使うようですがどうやらニューラルネットワークのようにネットワークがあるような感じではなさそうです。
最初の点群データはCOLMAPというものを使うようですが、COLMAPがわからないので調べてみました。
COLMAPの出力フォーマットを理解する
https://qiita.com/astaka/items/71271b19d90154239aab
「複数の2D画像から3D点群を再構成するソフトウェア。
疎点群の生成とカメラポーズの推定を行う SfM (Structure from Motion) と密点群の生成を行う MVS(Multi-View Stereo) の機能を併せ持つ。」
上記解説より引用
ということで、SfMというのを使うらしいので、2D画像から3D点群を疎点群で取り出すみたいですね。カメラポーズの推定も行うようなので便利です。今回はここは深掘りはしません。なんかあんまり時間はかからない操作みたいで、機械学習というよりも数理最適ソルバー経由みたい(詳しくは調べてない)なので。とりあえず点群データ(ポイントクラウド)を取得できたとして、ガウシアンへの変換ですね。
パラメーターは下記のようです。
- Position: where it's located (XYZ)
- Covariance: how it's stretched/scaled (3x3 matrix)
- Color: what color it is (RGB)
- Alpha: how transparent it is (α)
とりあえずまだ論文は読んでないので、概略を解説サイトからとってきた感じがこんな感じです。ガウシアンパラメータの最適化についてはいろんな工夫があるみたいでそこがキモみたいですが、それは論文を見てみたいと思います。解説記事にはあまり数式がありませんでした。
まずモチベーションは、疎な点群データから法線を使わずに高速レンダリングしたいということで、3Dガウシアンを採用すれば、2Dに投影すれば簡単にレンダリングできるということらしいです。ということで、COLMAPなどを用いて配置された3D点群データの点を3Dガウシアンに置き換えます。3Dガウス関数は三次元の共分散行列Σを用いてこのように書けるようです。
正直この分野に詳しくないので、これがどうなのかわかりませんでした。点の位置がμに対応しています。これにパラメータαをかけて使用するそうです。ただ、三次元のデータを持った関数を利用するというのはわかりました。
また、この三次元の関数を二次元に射影する際の手法についてもきちんと解説されていました。自分は全く興味がないので飛ばしてしまいましたが式(5)あたりです。
また、これらのパラメータを微分で今後最適化していくのですが、その際の方針についてもきちんと言及されていました。パラメータを独立して最適化できるように分離・再構築できるように考えられているようです。
全体フローが途中で出てきましたが、SfMの点群データを初期化して3Dガウシアンに変換。射影をして2Dイメージにしてそれを撮影したデータとの誤差最小化というフローのようです。Differentiable Tile RasterizerとAdaptive Density Controlは今の段階ではまだ出てないので、このあと見てみたいと思います。
最適化
最適化フローは3Dガウシアンの各パラメータの最適化の他に、そもそものガウシアンの密度の調整も入るようで、これを交互に行うようです。
基本的には3Dガウシアンを使って2Dにレンダリングして、それを元の画像と比較します。最適化ステップにはSGDが利用されるようで、αや共分散の値にはシグモイド関数が利用され、連続的なスムーズな値に直して微分を適用するようです。
ガウシアンの制御
ガウシアンはフロー的には初期のSfM点群データから作成されますが、色々制御されて最適化されるようです。まずは100イテレーションごとに計算をして、αが一定閾値以下のものは透明として除外するようです。
また、ガウシアンを組み合わせてシーンを構築したいが、うまくきちんと構築されない場合にクローンもしくは分割を使ってガウシアンの配置を最適化するようです。シーンに対してガウシアンが過剰に少ない場合には、ガウシアンをコピーして移動させ、シーンに対してガウシアンの分散が大きすぎる際にはガウシアンを分割して配置することで適応させるようです。
クローンをする場合には、ガウシアンの数を増やしながら表現する体積を増やし、分割する際にはガウシアンの数は増えるが、表現する体積はあまり増えないようです。ただ、あまりにもガウシアンが増えすぎて不具合を起こすことがあるということなので、これは3000回のイテレーションごとにαの値を0にすることによって解決できるようです。詳しい仕組みはやってみないとピンときませんが、前述のαの閾値を使って閾値以下のガウシアンを除去する手法と組み合わせて極端なガウシアンの増加を経験則的に制限できるとのことです。
ガウシアン用の高速微分可能ラスタライザ
ここまでくると専門用語が多くて大変です。ラスタライザはレンダラーみたいなものでしょうか?これまで、Adaptive Density Controlは見ましたので、残るDifferentiable Tile Rasterizerの部分かと思います。
そもそもスプラットという言葉をあまり聞いたことがありません。これは、どうやらある図形を複数用意して、それを重ねることで点群データ間の隙間を埋め、フィルタを通じて画像を仕上げる手法のようです。
参考:GPU による直接的ポイントレンダリング
https://graphics.c.u-tokyo.ac.jp/archives/vc2005ibpr-gpu.pdf
あとは、アルファブレンディングというのも聞き慣れないですが、今回の3Dガウシアンのパラメータになっている透明度αが関係すると思いますが、
参考:
https://wgld.org/d/webgl/w029.html
つまり半透明を重ね合わせてブレンディングして色などを出すということでしょうか。レンダリングに関してはかなり技術的に細かい指摘があったのですが、読むと疲れるので飛ばしました。。。好きなひとにはかなり詳細まで踏み込んでわかりやすいアルゴリズムなのではないでしょうか。
ということで、一旦理論面は上記のフローを網羅した形でわかりやすかったです。3Dガウシアンスプラッティングのことが全くわからないところからスタートし、かなり読みやすい論文でわかりやすかったかと思います。
・点群データを推定
・それをパラメータを持つ3Dガウス関数に置き換える
・ガウス関数の配置とパラメータをそれぞれ最適化する
・ライスタライザも最適化されてる
という感じでした!個人的にはNeRFの仕組みをまだ知らないので、合わせて学習してみようかと思います。以上です。