Gaussian Splattingの基本的な概念は、まぁ3D空間にたくさんガウス分布を配置するのねという程度にはわかるが、細かいところとして以下の2点が疑問になっていた。
- 色はどのようにつけるのか? 論文では球面調和関数(Spherical Harmonics)の係数を保持するとか書いてあったけど、それについての理解不足もあってどういうことかわからない
- 結局高速なラスタライズというところのCUDA実装的な肝がわからない。今までこういう手法が強くなっていなかったのはなぜか? この論文で導入された工夫の重要なところとはなにか?
論文を読み直したり、実装を見たり。
色について
なぜかCUDAではなくPythonの方でコードがあるが、おそらく
が本質なのだと思う。つまり、方向とSHの決まった定数をかけるところに、さらに定数をかけるという感じに見える。ここでは次数3まで考えて、shのshapeは、1つのガウス分布に対して(3, (次数+1)2) = (3, 16)になっているようだ。48個の実数を追加で学習できるように保持することになる。
以下の部分を参考にして1つのガウス分布が持つ要素を列挙すると
項目 | shape | 内容 |
---|---|---|
xyz | (3) | 位置 |
features_dc | (3, 1) | Spherical Harmonicsの係数の0次元目 |
features_rest | (3, 15) | Spherical Harmonicsの係数の1次元目以降。なぜ0次元目と別に保持しているかは不明 |
scaling | (3) | 共分散をscalingと回転で表現しているので、そのscalingの方 |
rotation | (4) | 共分散をscalingと回転で表現しているので、その回転の方(Quaternion形式と言われていたはず) |
opacity | (1) | 不透明度 |
これだけの情報を保持したガウス分布がたくさんあり、それらを上手くラスタライズするとNovel View Synthesisができると。まぁ理屈はわかるが、速度を出すための実装の工夫がとても大事そうだ。
rotationのQuaternion形式は、最適化のたびに正規化をいれなきゃいけないとしたら若干大変では? 最適化ステップでnormが1から若干変化して、そこから1になるように正規化した場合って、回転としての本質を壊さないのだろうか。リー代数でどうのこうのという方が良かったりはしない?
ラスタライズについて
画像を16x16くらいのタイルに分割し、そこの各ピクセルでのスレッド並列では同じメモリに置いたデータを利用することで高速化しているらしい。
こっちはコードが別のリポジトリに分かれていて
になっている。引数が多いし、結果の保存とかもあって複雑ではあるが、なんとか読んでいけば理解できるかもしれない。理念自体はやっぱりそこそこ単純ではありそう。あとは微分最適化のためにどれだけの情報が必要かといったところや、高速化のためのテクをちゃんと理解するというところ。まぁボチボチやっていきますか。