このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
アルバイトの星井です。
本記事は、インターンシップの課題として取り組んだ、「3D Gaussian Splatting の高速化」の成果報告です。
本記事では、今非常にホットな、3D Gaussian Splatting という手法のレンダリングについて約 15 % 高速化した方法とその結果を紹介します。 「マハラノビス距離」に着目したレンダリングの最適化により、画質を落とさずに処理速度を向上させることに成功しました。
3D Gaussian Splatting for Real-Time Radiance Field Rendering とは、2023 年に提案された手法です。Novel-view Synthesis(新規ビュー合成)のための訓練およびレンダリング(描画)を高速、高精細に行うことができます。
新規ビュー合成には、2020 年に発表された Neural Radiance Fields (NeRF) という手法が注目を集めていましたが、3D Gaussian Splatting は訓練およびレンダリングの速度において、NeRF を上回る性能を発揮します。
既存の複数枚の画像から 3D 形状を推定し、3D モデルを作成します。推定した 3D モデルを利用して、新たな画角から撮影された画像をレンダリングします。
3D Gaussian Splatting では、3D モデルを、3D Gaussian の組み合わせで表現します。
3D Gaussian は、3D 共分散行列 \(\Sigma\) と中心となる点 \(\mathbf\mu\) を用いて、その形状が \(G(\mathbf x) = e^{-\frac{1}{2}(\mathbf x – \mathbf \mu)^\top\Sigma^{-1}(\mathbf x – \mathbf \mu)}\) で表されます。
感覚的な説明をすると、それぞれの 3D Gaussian は、下の図に示すような、ぼやけた楕円球のような形状をしています。
3D Gaussian は分布の情報に加えて、不透明度と色の情報を持ちます。 現実の物体は、光の反射などの影響により、異なる方向から見ると色合いが変化することがあります。 色の情報は、球面調和関数を用いて、見る方向による色合いの変化も表現されます。
3D Gaussian Splatting により作ったモデルについて、遠くから見るときれいに見えますが、近づいて見ると下の図のように 3D Gaussian の集合体であることがわかります。
コンピュータグラフィックスにおいて、3D モデルから画像をレンダリングする手法として、レイトレーシングという手法とラスタライズという手法があります。
レイトレーシングとは、その名の通り光線(レイ)を辿る(トレーシング)手法です。 光は、光源からカメラあるいは目に届くまで、複数の物体で反射したり、屈折したりします。 この光の道筋を逆向きにたどることにより、画像上のそれぞれのピクセルに対応する色を計算する手法です。 レイトレーシングは高精度な描画を行うことができますが、計算時間を要するためリアルタイム処理には不向きです。
3D Gaussian Splatting ではラスタライズという手法を用いています。 ラスタライズでは、光線の追跡は行わず、3D モデル上の物体を画像上に投影して画像上のピクセルの色を決定します。 高速に処理を行うことができるため、リアルタイム処理が必須である 3D ゲームなどにおいては基本的にラスタライズが用いられます。 3D Gaussian Splatting においては、それぞれの 3D Gaussian を画像上に投影することでレンダリングを行います。 光線について計算を行うわけではありませんが、3D Gaussian Splatting においては上で触れたように、見る方向による色合いの変化を表現するため、反射についてもそれなりに対応することができます。
出力として、3D モデルが得られます。 3D モデルを用いて、任意の視点からの画像をレンダリングすることができます。
緑色の列車を主に撮影しているデータセットであり、緑色の列車については高精度に 3D 形状が復元されますが、画像にあまり含まれていない周囲の列車や、画像に含まれていない列車の天井部分についてはあまり上手く再現されていません。
3D Gaussian Splatting について高速化を行いました。 具体的には、レンダリング時の処理に着目して高速化を行いました。
それぞれの 3D Gaussian は画像上に投影されるとぼやけた楕円のように描画されます。 3D Gaussian の特徴として、中心付近は濃く、中心から離れるにつれて薄くなります。 中心からある程度以上離れている場合、その 3D Gaussian の影響が十分小さくなります。 そのため、ある程度以上離れているピクセルに対しては、計算を打ち切ることが有効です。
元論文の実装においても、計算を打ち切ること自体は行われています。 しかし、計算を行う範囲がかなり広いです。 楕円の長軸方向の標準偏差 \(\sigma\) を基準として、中心から \(3\sigma\) 離れたところまでについて計算の範囲としています。 具体的には、下の図のように、中心を等しくする 1 辺 \(6\sigma\) である正方形の内側に含まれている領域について計算の範囲としています。
\(3\sigma\) より離れた領域に与える影響は、最大でも \(e^{-\frac{1}{2}\cdot 3^2}\approx 0.01\) 程度なので無視して良いと考えたのでしょう。 しかし、この立場に立つのであれば、より計算する範囲を狭めることが可能です。
「マハラノビス距離」というものがあります。 マハラノビス距離 \(d=\sqrt{(\mathbf x – \mathbf \mu)^\top\Sigma^{-1}(\mathbf x – \mathbf \mu)}\) で定義されます(ここでの \(\mathbf{x}\)、\(\mathbf{\mu}\)、\(\Sigma\) は画像に投影したピクセル座標上について考えています)。 マハラノビス距離が等しいピクセルについて、3D Gaussian は同じだけ影響します。 長軸方向に \(3\sigma\) 離れた場所のマハラノビス距離は \(3\) です。 下の図のように、マハラノビス距離が \(3\) 以下である範囲についてのみ計算するようにすることで、計算する範囲をより少なくすることができます。
3D Gaussian Splatting のオープンソース実装である、OpenSplat について手法を実装し、検証を行いました。 OpenSplat では CPU を用いる実装と、GPU を用いる実装(CUDA)が存在しますが、今回は GPU を用いる場合について手法を実装しました。 当該箇所については元論文の実装でも同様に実装されています。
データセットとして、Deep Blending for Free-Viewpoint Image-Based-Rendering の Playroom を用いました。 225 枚の画像のうち、205 枚を学習用に、20 枚を評価用に用いました。
CPU は Intel Core i7-14700、GPU は NVIDIA GeForce RTX 4060 を用いました。
10000 ステップ実行時の時間を計測しました。
今回提案した手法は主にレンダリングを行う部分について高速化します。 レンダリングを行うパートのみに限ると、実行時間は以下のようになりました。
手法 | 1 ステップ当たりの実行時間(ミリ秒) |
---|---|
元の実装 | 5.88 |
提案手法 | 4.91 |
元の実装と比較し、約 15% の高速化に成功しました。 ビューアに今回の提案手法を搭載すると、約 15% 高速に動作させることができます。
全体での実行時間は以下のようになりました。
手法 | 1 ステップ当たりの実行時間(ミリ秒) |
---|---|
元の実装 | 33.4 |
提案手法 | 32.1 |
レンダリングを行うパートはボトルネックではないため、全体では約 4% の高速化に留まりました。
画像の品質について、評価用の 20 枚の画像について SSIM Loss を用いて劣化していないか検証しました。
手法 | SSIM Loss |
---|---|
元の実装 | 0.0312 ± 0.0095 |
提案手法 | 0.0318 ± 0.0093 |
上の表に見られるように、画質の悪化が見られないことが確認できました。 作成した画像の例を下に示します。 画質について元の実装と提案手法の間に変化がないことが見受けられます。
3D Gaussian Splatting の紹介と、インターンシップの課題として行った高速化について述べました。 3D Gaussian Splatting は 2023 年に発表された比較的新しい論文ですが、2025 年 4 月現在、既に 3400 回を超える引用がされており、今非常にホットな研究分野です。
Fixstars では、通年でインターンシップを募集しています。高専生、大学生、大学院生の皆さん、Fixstars で、新しい技術に触れませんか?インターンシップの詳細はこちらをご覧ください。
高速化のアイディアが被っていました。 Speedy-Splat: Fast 3D Gaussian Splatting with Sparse Pixels and Sparse Primitives
keisuke.kimura in Livox Mid-360をROS1/ROS2で動かしてみた
Sorry for the delay in replying. I have done SLAM (FAST_LIO) with Livox MID360, but for various reasons I have not be...
Miya in ウエハースケールエンジン向けSimulated Annealingを複数タイルによる並列化で実装しました
作成されたプロファイラがとても良さそうです :) ぜひ詳細を書いていただきたいです!...
Deivaprakash in Livox Mid-360をROS1/ROS2で動かしてみた
Hey guys myself deiva from India currently i am working in this Livox MID360 and eager to knwo whether you have done the...
岩崎システム設計 岩崎 満 in Alveo U50で10G Ethernetを試してみる
仕事の都合で、検索を行い、御社サイトにたどりつきました。 内容は大変参考になりま...
Prabuddhi Wariyapperuma in Livox Mid-360をROS1/ROS2で動かしてみた
This issue was sorted....