GaussianSplatting論文のAblationについての解説・考察

# GaussianSplattingの高精度化のヒント

　今回、GaussianSplattingの論文「3D Gaussian Splatting for Real-Time Radiance Field Rendering」の「Ablation」という節の内容を解説しようと思います。なぜ、この「Ablation」という節を、解説するかというと、 **「GaussianSplattingの高精度化」のヒントがある** と思ったからで、そのような視点で論文の中身を紐解いていきます。
　そして、この解説を通じて、論文内にあった、以下の表が理解できることを目標にしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/97a3f4e5-d0b7-96b1-f83c-9a66fdc9de11.png)

記事の都合上、英語の内容を訳している部分がありますが、これは私による翻訳です。

# GaussianSplattingの最適化フロー

この章では予備知識として、GaussianSplattingがどのように最適化されていくか解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/9726aa46-c54d-5b31-20ea-6af4abc16792.png)

まず、初めに初期化(initialization)のためにSfM Pointsが使われます。SfM Pointsについては後で説明しますが、現段階では、GaussianSplattingを行うための初期値として、なんらかの点群を入力する。という認識だけで大丈夫です。そして、それから3次元ガウス関数(3D Gaussians)を構成します。そして、それをカメラ位置(Camera)を入力として、Differentialble Tile Rasterizerを用いて、画像を生成します。Differentiable Tile Rasterizerは何者かはあまり知らなくて良くて、とりあえず3次元ガウス関数をレンダリングする(画像にする)レンダラーだと思っていただければよいです。その生成された画像と、入力された画像の差を比較し、勾配を用いて学習を進めていきます。その後、Adaptive Density Control(適応的な密度の制御)を行うことで、3次元ガウス関数の分割を行います。これについても後で解説します。したがって、

1. 初期値として点群を用意する(SfM Points)
2. 3次元ガウス関数を作る
3. カメラ位置を入力し、画像を生成する
4. 生成された画像と、入力画像を比較し、誤差を計算し、勾配から学習する(パラメーターを最適化する)
5. 場合によっては、ガウス関数の分割を行う(Adaptive Density Control)

というのが大まかなGaussianSplattingの最適化フローです。

# Ablationとはなにか

私自身、機械学習回りの論文には詳しくなかったので、この「Ablation」という単語について調べてみました。Ablationとは、

> ablation study とは，手法の中からある条件だけを抜くことで，その要素の重要さについて考察するような実験です．
(引用：[【ネットワークの統計解析】第6回　論文紹介1「GCNを用いたフェイクニュースの検知」](https://buildersbox.corp-sansan.com/entry/2021/03/31/111000))

ということだそうです。今回の、GaussianSplattingでは、高画質化の工夫が複数あります。

1. Initialization from SfM(SfMによる初期化)
2. Densification(高密度化)
 2.1 Split(スプラット分割)
 2.2 Clone(スプラット複製)
3. Unlimited depth complexity of splats with gradients(無制限のスプラット勾配計算)
4. Anistropic Covariance(異方性共分散)
5. Spherical Harmonics(球面調和関数)

このように6つの工夫があります。これらの工夫を全て取り込んだ内容が、表の上での表記のFullの欄の値になっています。この表の他の行は、それぞれの工夫を1つだけ無くした場合、値がどう変化するかを検証しています。これらの値を比較検証することで、どの工夫が重要か？工夫を加えたことで値が劣化していないか？を確認しています。そのため、工夫の数が6つとFullの値が1つで7行の表になっています。ここでは、これをAblation(study)と呼んでいます。

# 画像評価指標

では、表の値は何を示しているのでしょうか。これはPSNRという値になっています。[PSNRとは](https://ja.wikipedia.org/wiki/%E3%83%94%E3%83%BC%E3%82%AF%E4%BF%A1%E5%8F%B7%E5%AF%BE%E9%9B%91%E9%9F%B3%E6%AF%94)、

> ピーク信号対雑音比 は画質の再現性に影響を与える、信号が取りうる最大のパワー[注釈 1]と劣化をもたらすノイズ[注釈 2]の比率を表す工学用語で、しばしばPSNR(Peak signal-to-noise ratio) と略される。多くの信号はダイナミックレンジが非常に広いため、PSNR比は通常10を底にした常用対数で表される。

どのように計算されるかというと、

> PSNRの最も簡単な定義はモノクロの2つの m×n の画像 I と K において、一方の画像が他方の画像よりもノイズにより劣化したものと見なされる時に、平均二乗誤差(MSE)を以下とした場合:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/b393b6e3-bc72-9a90-6251-ab5e0af2b1b6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/44efd721-ec41-1d7f-71a7-10fc41cf1d61.png)

となっています。正解画像と生成された画像の二乗誤差が小さいと、PSNRは高くなります。**端的に説明すると、PSNRの値が大きくなる画像が綺麗である。** と言える指標となっています。
　この表では、概ね昇順に並んでおり、赤色のセルの値が一番大きい＝画質が綺麗、その次がオレンジ、黄色となっています。そのため、**前節では、GaussianSplattingは画質を向上させるための工夫が6つある。と言いましたが、その6つ全てを採用したFullが一番画質が良い(Truck-30kを除く)** と言えます。

# Limited-BW
　ここからは1つ1つの工夫について解説していきます。これは私も読んでいて、若干の混乱がありましたが、Limited-BWは「Unlimited depth complexity of splats with gradients(無制限のスプラット勾配計算)」に関する説明です。
 　これは、アイデアとしては割と単純です。GaussianSplattingは非常に多くの3次元ガウス関数の重ね合わせになります。実際、1シーンあたり20万～50万個に上るそうです。そうすると、本当に全部のガウス関数を考慮して、学習する必要があるのか？手前の数個のガウス関数だけを考慮して計算すればよいのではないか？という発想になります。論文中では手前10個のみのガウス関数を考慮し、機械学習のための勾配の計算を試みたそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/99d414f4-487f-d3ee-59b7-bdb143bc0868.png)

左がN=10に制限した場合、右が制限をかけなかった場合の結果になっています。中央に映っているテーブルの黒い部分と、木の部分に注目すると、制限をかけた方は、その境界があやふやでぼやけているのに対し、制限をかけなかった方は、くっきりとしていると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/8b952010-d824-3804-b8ab-8aecef9c95c7.png)

また、表を見ると、Average-30Kであれば、全ての工夫を採用したFullのPSNRが26.05に対し、Limited-BWは19.19となっています。そのため、ガウス関数をN=10に制限したときは、極端に画質が下がっていることがわかります。そして、その傾向は他のサンプルシーンでも似たような傾向になっています。そのため、**高画質なGaussianSplattingのモデルを得るためには勾配計算で深さ方向の制限はしてはいけない。** と分かりました。

# Random Init
これは「Initialization from SfM(SfMによる初期化)」の工夫について解説している節です。前の章で、Gaussian Splattingの最適化フローの最初で、SfM Pointsを利用している。と書かれていた部分と関係しています。[SfM](https://hdtopography.github.io/learning/SfM-MVS/GIS_uchiyama_2018/1.about_sfm/1.about_sfm.html)とは、

> ・Structure from Motion (SfM)
> 撮影位置と姿勢：外部標定要素 の推定
> レンズ歪み：内部標定要素 の推定
> 画像特徴点の三次元分布を推定（図1）：写真測量
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/fd582295-802a-a2b1-6402-104b89cb9b32.png)

ということです。[以前の記事](https://qiita.com/kotauchisunsun/items/b592c3ea252e2ff6a065)でこんな画像を作りましたが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/63334c35-120c-8e27-5b35-d58682fd35b6.png)

　この1～3が概ねSfMと呼ばれる内容です。上記の引用の説明には、「画像特徴点の３次元分布を推定」と書かれています。このSfMを行うと、この画像の特徴点の3次元位置が特定できます。これがSfM Pointsの指しているものです。
　「Random Init」では、このSfMを行わず、ランダムな点群から行う。という実験を行っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/fed25510-8898-0060-02f2-1bb196e9ece8.png)

上段は、ランダムな点群で始めた場合、下段が初期としてSfMを用いた場合の出力画像になっています。筆者は、概ねランダムな点群からでも完全に失敗することは無いが、背景が劣化する。と表現しています。数値上の比較をすると、Average-30KのFullが26.05に対し、Random Initは20.42という値になっています。そのため、初期の点群としてSfMを選ぶことは画質の向上に貢献するようです。

# No-Split,No-Clone
この節では、「Split」と「Clone」という2つの工夫の効果について議論しています。「Split」と「Clone」とは何か。ということなのですが、GaussianSplattingにおいて、ガウス関数を「高密度化」する方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/2c3f5831-e23e-4e52-175c-c42d823dcfa5.png)

 画像の上段、Under-Reconstructionについて説明します。黒い線の領域が、GaussianSplattingにおいて表現したい領域だとします。この領域に対し、３次元ガウス関数の表現する領域が小さかった(Under-Reconstruction)場合、この3次元ガウス関数を複製(Clone)することで、領域を適切に表現するよう最適化します。これをここでは「Clone」と呼んでいます。また、逆に領域に対して、3次元ガウス関数の表現する領域が大きかった(Over-Reconstruction)場合、この3次元ガウス関数を分割(Split)することで、領域を適切に表現するよう最適化します。これを「Split」と呼んでいます。これが論文中でAdaptive Density Control(適応的な密度の制御)と呼んでいる方法です。この節では、「Clone」と「Split」を無くした場合、どう画質に影響があるかを調べています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/609fd352-f3f3-21d1-c60a-69a58aa80233.png)

No-Splitの場合、筆者は、背景の表現が悪くなる。と評しています。確かに、画像上でも背景に大きなボケた領域があります。また、No-Cloneの場合、矢印部の様に、自転車のスポークがとぎれとぎれになっている部位が見受けられます。ここから筆者は、Cloneはthin-structure(薄い？小さい？構造)を構成する場合に有用である。と言っています。数値的な評価をすると、Average-30Kにおいて、Fullは26.05に対し、No-Cloneは25.91、No-Splitは23.90となっています。ここから、CloneとSplitは画質向上に寄与していると言えます。ただ、個人的にはNo-Splitの方が値の悪化の具合が大きいので、画質向上への寄与が大きいのは、Splitの方かと思いました。


# No-SH

　この節は「Spherical Harmonics(球面調和関数)」という工夫について解説しています。これは、あまり馴染みのない数学を利用するので、理解が難しかったです。
まず、少し真面目な説明を「[球面調和関数の概要とグラフ描画](https://www.fukui-nct.ac.jp/wp/wp-content/uploads/2021/11/0e33f045e7bc9a89df11fb4bf1efc444.pdf)」から引用すると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/60f0b530-c484-987a-30d3-1db6d4cd23af.png)

となります。また、球面調和関数の実数化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/731c0d68-248a-67c1-d655-49fe8ff79462.png)

ということをすると、実球面調和関数のグラフを得られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/b14171c4-9aba-e14f-3653-30c9b7bae80f.png)

この絵を見たときに、物理化学をやっていた人はピンと来るかもしれませんが、量子力学で出てくるs軌道p軌道などの電子軌道のやつです。と、ここまで書いていますが、実際のところ、私も分かっていません。しかし、とどのつまり何がしたいか。というと、**ある点を見たとき、視点(見る角度)によって、色を変えたい。** ということだそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/8757da0d-7f2e-6bba-328a-e875a9c6890e.png)

 上の図や解説は厳密ではなく、あくまでイメージです。ある点をx軸,y軸,z軸から見ることを考えます。これが、l=0の1次の球面調和関数で表すと、どの方向から見ても赤色に見えます。しかし、ある点をl=0,l=1の2次の球面調和で表すと、x,z軸方面から見ると赤色だが、y軸方向からみると青色の点を表すことが出来ます。また、l=0,l=1,l=2の3次の球面調和関数で表すと、x軸から見ると赤色、y軸から見ると青色、z軸から見ると緑色に見える点を表すことが出来ます。このように **ある点を複数の視点から見たときの色を変えるための手段として、球面調和関数を使っています。そして、この次数を増やすことで、より多くの視点で色が変わるような点を表すことが出来ます。**
 
　GaussianSplattingの論文中で、Plenoxelという手法が引用されており、その[解説](https://www.ibis.ne.jp/blog/20221117-nerf/)を見てみると、以下のような絵があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/aedf89ad-05c3-c427-839a-d81e94655a64.png)

　ここで球面調和関数が使われているのがTrilinear Interpolationの上の図です。このように他の手法でも、ある点を複数から見られたときの色を表すために球面調和関数を利用し、表現の幅を広げているようです。
　No-SHは、この球面調和関数を使わない。ということです。したがって、視点が変わっても色が変わらないようにした場合の画質への影響を図っています。Average-30Kでは、Fullが26.05に対し、No-SHは25.35となっており、微力ながら、画質の向上を担っているようです。

# Isotropic

この節は「Anistropic Covariance(異方性共分散)」という工夫について解説しています。これは言っている内容はシンプルですが、重要な内容です。題名になっているIsotoropicとは等方性という意味です。これは、どういう意味かというと、[私の前の記事](https://qiita.com/kotauchisunsun/items/b592c3ea252e2ff6a065)に３次元ガウス関数に関する説明を書きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/3925ffa9-abb3-f3c3-7f96-5b35e4813323.png)

　GaussianSplattingでは、このガウス関数を「伸ばす」「回転する」「色を変える」という調整を繰り返すことで、最適化していく旨を書いていました。この「伸ばす」という行為は、「x軸方向に拡大する」「y軸方向に拡大する」「z軸方向に拡大する」ということを表しています。そのため、GausianSplattingで出力されたデータは概ねガウス関数が、どちらかの軸方向に拡大され楕円の形をしています。ここでは、その拡大を行わず、完全な球体としてだけ扱う。ということを実験しています。これは、x,y,z方向の拡大するパラメーター、あと回転のパラメーター(内部的にはクオータニオンなので4つ)もあまり意味がなくなり(私見)、1つのガウス関数につき7つの変数が減るので、学習にかかる計算コストが下がると考えられます。
　Average-30Kの値を確認すると、Fullの場合は26.05、Isotoropicは25.23とFullの方が少し値に改善がみられます。そのため、ガウス関数は等方的(Isotropic)ではなく、各軸方向に拡大を許容する(Anistropic)方が良い。としています。これは画像からもある程度分かって、Ground Truthが元画像、Fullが素のGaussianSplatting、Isotropicは等方性にしたGaussianSplattingです。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/761d38b2-90e2-fb47-f03d-77c40382f28e.png)

一番左の観葉植物の画像が分かりやすいですが、Istropicは一部の木の幹や、葉っぱが丸い点として表現されており、元画像の再現が甘くなっています。また、真ん中の車の画像はFullでも少しボケたような画像になっていますが、Isotropicの場合は、さらにボケたような画像になっています。このように、したがって、GaussianSplattingにおいては異方性を許容するのが大事だ。ということが分かります。

# Ablation実験の考察

割と個人的に思ったことです。明らかには論文上で語っていないのですが、自分で思ったことについてつらつら。

**Fullの結果は良い。**

　当たり前なのですが、個人的には忘れがちな事実だと思います。工夫したら何かしら画質が上がっていて欲しい。と思うのは気持ちとしてあると思いますが、実際は悪化している場合もありえます。そのため、当たり前に工夫の全部入りが良い結果である。というのを示しているのは重要だと思います。・・・まぁ悪化した結果は論文にはしないと思いますが。しかし、一方で、GaussianSplattingは6つも工夫が入っている。というのは、なかなか凝った手法だなと思うこともありました。
　今回、表を理解する。という切り口で論文の中身を解説しては行きましたが、 **表の中で赤、橙、黄色と色がついている項目があるが、むしろ大事なのは低評価な手法なのではないか。** と感じました。ここは、あまり論文中では書かれていないように思いますが、例えば、Limited-BWを見ると、PNSRの値がFullに比べて明らかに悪いです。ということは、Limited-BWで制限された工夫の効果が高いことの反証になっているように読み取れます。そのため、この表で注目すべき項目はRandom InitとLimited-BWなのではないか。したがって、**GaussianSplattingの画質向上のために重要な工夫は、Initialization from SfM(SfMによる初期化)、Unlimited depth complexity of splats with gradients(無制限のスプラット勾配計算)の2つである** ように思いました。

# Ablation実験の数値解析

ここでは、私のオリジナルな内容として、先ほどのAblationの実験結果を解析してみようと思います。そこで、最初の表を以下の様に変形しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/82f30837-a3fc-6d42-1b9a-52be6d961928.png)

このように、データセット、学習回数、それぞれの工夫の有無、PNSRの値という形のcsvに全データを落とし込みました。これを[orange](https://orangedatamining.com/)というデータマイニング用ソフトで解析をかけました。いわゆる線形回帰モデルに当てはめ、以上の素性によりScoreを予測できるか？を試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/711d0fd9-9fa6-bf43-0458-222a7094ca13.png)

そうすると、Scoreの値と、予測したScoreの値がR=0.94でほぼ予測できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/5dadf070-b7fa-c3cf-6eb0-97916642d36a.png)

ここから、ある程度、線形回帰したモデル式が解釈に役に立つことが分かります。したがって、係数を見ていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/9442c652-87e7-ff17-2730-9abbc37ba536.png)

interceptは切片で、DataSetは固有のデータセット名を表すので、これらを無視するとすると、UnlimitedGradients=TRUEやInitializationFromSfm=TRUEが上位の係数にきます。これは、Initialization from SfM(SfMによる初期化)、Unlimited depth complexity of splats with gradients(無制限のスプラット勾配計算)を表しているので、先ほどの予測と一致します。仮にこの結果が信用に値すると考えると、6つの工夫は、

　**Unlimited depth complexity of splats with gradients(無制限のスプラット勾配計算)
　> Initialization from SfM(SfMによる初期化)
　>> Split(スプラット分割) 
　>>>> Anistropic Covariance(異方性共分散) ≒ Spherical Harmonics(球面調和関数)
　> Clone(スプラット複製)**

の順で重要だと考えられます。また、工夫=TRUEの時、係数が正なので、それぞれの工夫がPSNRに対して、改善の方向に寄与していることが分かります。
　データが少ない中で荒っぽい議論をしますが、この解析結果から、学習の回数と画質の関係も考察できます。係数が6.80762e-05のため、大体10k回最適化を行うと、PNSRが0.68改善します。PNSRのWikipediaによると高画質なビデオ圧縮はPSNRが50[dB]ぐらいあるそうです。Average-30KのFullのPSNRが26.05[dB]なので、高画質にするには24[dB]程度足りません。これを回数で稼ごうとすると、追加で35k回ぐらい学習する必要があって、全体で65k回の学習が必要そうです。論文では[A6000のGPU](https://amzn.to/3vYZZ85)で30kの学習時間が40分だと書かれていました。ということは、50[dB]への改善は、80～100分ぐらいで達成できると考えると、思ったよりリーズナブルなのかもしれません。ただ、まぁ値が大きくなるにつれ画質の改善は鈍化すると思うので、そこまで画質は良くならないとは思いますが・・・(そもそも切片が16.4128あるので、回数0回でも16[dB]ぐらいの画質になってるのは論理的にはおかしい)

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/ea6fcc0a-635f-1a7a-b7de-271c91235859.png)](https://amzn.to/3vYZZ85)

# 感想

前の記事はほぼ前座の内容で、大体こっちが本番です。結構、論文を読み込んで、ちゃんと書いてみました。「論文は3度読め」という話を大学時代の先輩に言われたことがありました。1度目はただ読め。2度目は筆者が書いたつもりで読め。3度目は批判的に読め。というようなことでした。今回紹介した表を見て、論文を読んだ後、おや？という気持ちになったポイントがあって、それが「Ablation実験の考察」「Ablation実験の数値解析」の内容につながります。表が色分けされているということは、それらは何かしら重要な意味がある。と思って、私は読み込んだわけですが、IsotropicやNo-Clone、No-SHの画質への影響は少ない。という、表現と画質への影響度合いが乖離していました(これは私の先入観が悪いのかもしれませんが・・・)。というわけで、実は、表の色分けという表現だけにとらわれて斜め読みしていると、実は本質を見逃していることがある。と思って、少し数値解析的なことをやって整理しました。この記事、めちゃめちゃ長くなったし、調べるのにめちゃめちゃ時間かかってて、球面調和関数の部分とか、ちゃんと説明しろって言われても分かんねぇ・・・記事書けるかな・・・って思って、ある程度、自分で勉強したつもりではあったんですが、最終的には、あんまり球面調和関数は画質に影響ないよ。ってなってしまって、俺のどりょくぅ～という気持ちになりました。