😸

Gaussian Splatting 改善のアイデアをまとめてみた

2024/12/16に公開

こんにちは、最近、3D, 音声関連の機械学習にはまっている、わっしーです。
Fusicアドベントカレンダー 16日目の記事です!

昔ながらのMulti View Stereoに比べるとNeRFの凄さに数年前に驚いたのですが、計算コストの大きさから手を出すのを躊躇していました。しかし、Gaussian Splatting (GS)が登場し、計算コストを抑えつつ、NeRFに匹敵する精度を出すことができるということで、最近はGSに注目しています。

特に、GSの精度の良さから、mesh化を行いBlenderなどで使用できるようにしたいと考えています。
しかし、GSで学習されたガウシアンの点群をメッシュ化した際に、メッシュがぼやけていたり、エッジが不明確であったり、最悪の場合、穴が空いてしまいます。

そこで、オリジナルのGSにどのような手法を加えることで、メッシュ化の精度を向上させることができるか考え、アイデア(論文)をまとめてみました。

主に、方針としては、以下の2つがあると思います。

  1. 基盤モデルを活用した事前情報の取得

  2. レンダリングされる画像、法線(Normal), 深度(Depth)の損失の改善

  3. ガウシアンのcloneやsplitなどdensificationの改善

本記事では、上記の課題に関して、それぞれ解説したいと思います。

※ 本記事で使用している図は、各論文から引用いたしました。

基盤モデルを活用した事前情報の取得

深度推定モデルを利用したDepth Regularization

3D GSの本家のリポジトリを見ると、Depth Regularizationという手法が追加されていました。

Depth Regularizationは、GSの学習時に、Depthの事前情報を利用して、シーン再構成の精度を向上させる手法です。しかし、深度推定による深度マップは、一般的に、正規化されており、そのまま使用することが困難です。そこで、DepthRegularized GSという手法では、GSの前処理で得られる疎な特徴点群を用いて深度マップのスケール等を調整し、GSの学習時に利用しています。

深度推定には、Depth Anything V2 など、強力な深度推定の基盤モデルが利用されます。下図は、Depth Anything V2の結果の一例です。どの画像でもロバストに深度推定ができており、微細な部分の深度も補助できるため、GSの深度マップのレンダリングの性能向上が期待できます。

depth_anything_v2

法線推定モデルの活用

GSのガウシアンから、メッシュを作成するためには、メッシュの表面の方向を示す法線が必要です。そのため、2D GSのように法線も同時に学習する手法が提案されており、メッシュ化の精度を向上させることができます。

しかし、2D GSの法線推定は、画像の情報しか利用していないため、エッジ部分や平坦な部分での性能が低いことがあります。そこで、StableNormalという基盤モデルによる事前情報を利用することで、GSの法線推定の精度を向上させることができます。

下図は、StableNormalの法線推定の一例です。エッジ部分や平坦な部分でも、正確な法線を推定できていることが確認できます。

Stable Normal Result

また、論文では、2D GSと法線推定の性能を比較しており、下図のように、2D GS + StableNormalの方がエッジが鮮明でメッシュ化の精度が向上していることが確認されています。

2D GS w SN Comp

損失の改善

レンダリングされる画像の損失の改善

GSの学習に使用される画像では、隣り合った画像同士で、色見や明るさが異なることが多々あり、そのまま学習した場合、性能の劣化につながります。
VastGaussianの論文に書かれている例では、下図のように、見え方が異なる画像を使用して学習した結果、GSによる3次元空間上にFloatersという、ぼやっとした部分が発生してしまっています。

VastGaussian_Fig2

そこで、VastGaussianでは、下図のようにAppeareance Modelingという、画像ごとの見た目のブレを考慮した損失のアーキテクチャーを提案しています。この手法は、レンダリングした画像を低解像度にダウンサンプリングし、訓練可能な埋め込みl_iとピクセルを連結しD_iを取得します。その後、D_iをCNNに通し、元の解像度になるようにアップサンプリングし、外観のずれを表現した画像M_iを取得します。そして、最後に、M_iとレンダリングした画像をかけ合わせて、画像ごとの外観のずれを考慮した画像を取得します。損失は、幾何的な構造を重視するSSIM損失をレンダリング画像に適用し、見た目のずれを重視するL1損失をM_iによる外観のずれを考慮した画像に適用します。論文のAblaition Studyによると、この手法を適用することで、SSIMが0.858から0.882に向上し、Floatersが減少していることが確認されています。

VastGaussian_Appearence model

法線/深度の損失の改善

3D GSでは、photometric lossというレンダリング画像と正解画像の誤差でのみ学習を行っていました。しかし、2D GSやRaDe-GSでは、Normal lossや、Depth distortion losを追加しており、メッシュ化した際の精度を向上させています。

Normal Lossは、以下の式で表されます。

L_n = \sum_{i=1} \omega_i (1 - \mathbf{n}_i^T \mathbf{N})

ここで、\mathbf{n}_iはカメラを向いたガウシアンの法線、\mathbf{N}は深度マップの勾配をによって推定された法線、\omega_iは、透明度から計算されるブレンド重みです。

また、Depth Lossは、近傍のDepthを用いて計算され、以下の式で表されます。

L_d = \sum_{i=1} \omega_i \omega_j |d_i - d_j|

ここで、d_iはピクセルiの深度、\omega_iは透明度から計算されるブレンド重みです。

下図のように、2D GSではNormal lossとDepth distortion lossを追加することで、メッシュ化の精度を向上していることがわかります。
特に法線の学習により、法線が正確になり、メッシュ化時に穴が空いたりする現象が減っています。

2d gs result

法線学習時のエッジの取り扱い

AtomGSでは、法線の学習時に、エッジの取り扱いを考慮することで、周波数の高い微細な領域において、複雑な構造の法線を推定できるように、工夫しています。

下図の(a)は、深度マップの勾配から法線を推定した例です。加えて、(b)は、法線マップの勾配の大きさを示す曲率の例です。この曲率マップにおいて、値が高いほど法線がばらついており、値が低いほど法線が滑らかになっています。この曲率マップを最適化することで、幾何構造の平滑性を高めることができると考えられます。しかし、この結果、エッジや微細な構造のような高周波成分を不注意に平滑化し、過平滑化になる場合があります。

そこで、RGBの勾配から得られる図(c)のようなエッジマップを活用します。曲率マップに対し、エッジマップの勾配が低い滑らかな部分は高い重みにして平滑化を行い、逆に、勾配が高い鋭いエッジ部分は低い重みにし細部を保持するように、重み\omega(x)=(x - 1)^qをNormal lossに適用しています。

以下、エッジ重みを適応したNormal lossの式です。

L_n = \frac{1}{N} \sum_{i}^{H} \sum_{j}^{W} |\nabla N| \otimes \omega(|\nabla I|)

この損失を適応した結果、下図(d)のように、エッジ部分がより考慮された法線が推定されていることがわかります。

densificationの改善

split and cloneの改善

GSの学習時に、ガウシアンが大きい場合は分割したり、足りない場合は、クローンしたりするdensificationの戦略が重要になります。例えば、ガウシアンが大きい場合、ぼやけた表現になってしまうover-reconstructionの状態になってしまうので、ガウシアンを分割し、複数のガウシアンでより細かい表現を行う必要があります。

AbsGSは、このover-reconstruction時の分割する基準に関して、改善点を提案しています。

下図は、(a)のような画像を、(b)のような1つの大きなガウシアンで表現した場合の例です。
この場合、もちろんのことですが、(b)のようにレンダリングした画像は、ぼやけた表現になってしまいます。
この結果と正解の誤差をL1損失で計算した結果(c)のような損失になり、x軸方向に勾配をとった例が(d)です。

極端な例ですが、一般的なGSでは、この勾配をガウシアンの範囲で平均した値が任意の閾値を超えた場合、そのガウシアンを分割するようにdensificationの戦略をとっています。しかし、(d)の通り、勾配の方向がバラバラなため、平均を取った際に、打ち消されあってしまい、大きなガウシアンを分割することが妨げられるという問題がありました。そこで、AdaGSでは、勾配の絶対値の平均を用いることで、この問題を解決しています。

また、colmapによるStructure from motionの結果である疎な特徴量を初期値とした場合、ガウシアンの初期化の時点で、大きな楕円のガウシアンが多く生成されてしまいます。その結果、多くの視点からの計算に、この大きなガウシアンが参加することになります。その時、ガウシアンの中心近傍が見える視点では、大きな勾配になる可能性が高いです。一方で、ガウシアンの端が見える視点では、小さな勾配になる可能性が高いです。そのため、平均化すると、勾配が小さくなり、densificationの閾値を超えることできないという問題が発生します。

そこで、Pixel-GSでは、勾配の平均化を行う際に、計算に参加するガウシアンの画素数を重みとして勾配に掛け合わせることで、この問題を解決しています。

しかし、上記の課題は解決できるものの、カメラ近傍の大きなガウシアンもいい感じにdensificationされてしまい、floattersの発生に繋がっていました。そこで、Pixel-GSでは、カメラ座標でスケーリングしたカメラからガウシアンまでの距離の二乗を用いた重みを追加し、近傍では重みが小さくなるような工夫を行いました。

pruningの改善

これまで、ガウシアンを増やす方法の戦略について解説しました。次に、ガウシアンを減らす方法について解説します。一般的に、3D GSのpruningでは、不透明度(opacity)が低いものを削除しています。しかし、実際には、重要なガウシアンを誤って除去する場合があり、加えて、floaterのように幾何構造が不正確なガウシアンの不透明度が高いことが多々あるため、正確な幾何構造を維持する戦略としては不十分と考えられています。

そこで、TrimGSでは、ガウシアンの寄与の評価指標としてブレンド重みを用いることを提案し、貢献度ベースのpruningとしてtrimmingを提案しています。

ブレンド重みは、レンダリング画像におけるガウシアンの寄与度と考えられます。しかし、正規化されていないためガウシアンが大きいほど、大きな寄与になってしまうという課題があるため、ブレンド重みをガウシアンのレンダリング領域のピクセル数で正規化した評価値を用いることを提案しています。
また、大きなガウシアンは、様々なビューから見え平均化すると小さくなってしまうというPixel-GSでもあげられていた問題があるため、寄与度が高い上位5つの視点における寄与度の平均値を用いています。

下図のように2D GSに対して、TrimGSを適応した結果、精度が向上していることが確認されています。

まとめ

以上、GSにおける、様々な改善手法をまとめました。正直なところ、どれを取り入れるべきか迷いますが、本記事で解説した手法の実装は、かなり簡単なので、全部試すのが吉かもしれません!論文が多すぎて多すぎて追いきれませんが、GSを用いて高精度なメッシュを自動で作成できると、多くの人がハッピーになりそうですね!

最後に宣伝になりますが、Fusicでは、GSなど3Dに関する研究開発を行っています。他にも、音声、画像、自然言語処理など、様々な研究開発を行っており、様々な分野での社会実装を目指しています。機械学習のPoCからアプリ化まで、幅広い部分をサポートできると思いますので、もし、困っている方がいましたら、お気軽にご相談ください!お問い合わせも、わっしーへのDMも、大歓迎です!

参考文献

GitHubで編集を提案
Fusic 技術ブログ

Discussion