PlayCanvasとSOGSによる3D Gaussian Splattingの圧縮を使ってみました!

はじめに

こんにちは。GMOグローバルサイン・ホールディングス CTO室 所属のはが(@mxcn3)です。

今回は、2025年5月にPlayCanvas Engine 2.7.5でサポートされた「SOGS(Self-Organizing Gaussians)」という3DGS圧縮技術を利用して手順やファイルサイズの比較を行いました。

3D Gaussian Splatting(3DGS)とは

3D Gaussian Splatting(3DGS) は、写実的な3Dシーンを生成できる革新的な技術です。従来の3Dポイントクラウドデータを「点」として扱うのではなく、各点をガウシアン(ぼかし) として表現することで、滑らかで高品質な3Dレンダリングを実現します。3DGSについては、テックブログに以前投稿されている記事「3DガウシアンスプラッティングをWebで実現する」もご覧ください。

SOGSについて

SOGS Self-Organizing Gaussians は、ドイツのFraunhofer HHIのWieland Morgenstern氏が開発し、ECCV 2024で発表された圧縮技術です。PlayCanvasがこの技術を採用してWebページでの利用が容易になりました。この技術は、3DGSのデータを画像に変換し、画像の圧縮技術を利用してファイルサイズを削減します。これにより、高い圧縮率を実現しているようです。

SOGSを使用した検証

検証は、以前私が撮影をした岩のスキャンデータでファイル圧縮を行います。
元のファイルは、SuperSplatで不要なスプラット(点群)を削除をしています。

検証をするファイル

  • 3D Gaussian Splatting (.ply)
  • 点群数 185,904
  • ファイル容量 46.1MB
岩のスキャンデータ
検証ファイル – 岩のスキャンデータ

検証環境

  • GPU: NVIDIA GeForce RTX 3070
  • OS: Windows 11

※お使いの環境でGPUやCUDAが利用できない場合は、こちらのGoogle Colabに実行環境を用意しましたので、お試しください。

実行環境のインストール

実行環境は、「playcanvas/sogs」のリポジトリに公開をされているので、手順に沿って実行環境の準備を行います。

  1. リポジトリのクローンと依存関係のインストール
    git clone https://github.com/playcanvas/sogs.git # SOGSのGitHubリポジトリをクローンします
    cd sogs
    
  2. クローンをした後のリポジトリの構成は以下のようになっています。
    sogs/
    ├── LICENSE
    ├── README.md
    ├── pyproject.toml
    └── src/
        └── sogs/
            ├── __init__.py
            ├── cli.py
            └── sogs_compression.py 
    
  3. 依存関係のインストール
    pip install torch --index-url https://download.pytorch.org/whl/cu124
    pip install cupy-cuda12x
    pip install torchpq
    pip install git+https://github.com/fraunhoferhhi/PLAS.git
    pip install -e
    

圧縮の実行

インストールが完了するとSOGSにはコマンドラインインターフェース(CLI)が用意されていますので、CLI上で圧縮を実行します。

  1. ファイルの圧縮の実行

    Gaussian Splattingのデータを、インストールをしたフォルダに、model.ply として配置をして、sogs-compressコマンドで圧縮を実行します。

    sogs-compress --ply model.ply --output-dir compressed_data
    

    sogs-compressコマンドの引数

    • –ply ファイル名を指定
    • –output-dir 出力先のフォルダを指定
sogs-compressの実行結果

sogs-compressの実行結果 – RTX 3070でも1分ほどで処理が完了

圧縮後に出力されるファイル

処理が完了をすると、出力先のフォルダにmeta.json画像データ(.webp)が出力されます。

出力されたファイル - メタデータと画像データが出力される

出力されたファイル – メタデータと画像データが出力される

圧縮によるファイルサイズの変化

今回のデータで出力をされた画像ファイルのサイズはこちらです。

ファイル名 サイズ
means_l.webp 557KB
means_u.webp 481KB
quats.webp 563KB
scales.webp 356KB
sh0.webp 512KB
shN_centroids.webp 1.7MB
shN_labels.webp 361KB
meta.json 1.5KB
合計 約4.2MB

元データとSOGSでの圧縮後の比較

こちらが元のデータと生成したデータを並べたものとなります。

比較用のWebページ ( 全画面 ) – 左 PLY 右 SOGS

元データと圧縮後の画像のファイルサイズの合計と比較はこちらです。

比較項目 サイズ
元データ (.ply形式) 46.1MB
圧縮後の合計ファイルサイズ 約4.2MB
圧縮率 約11分の1

データの利用方法について

SOGSで圧縮した3DGSデータは、「前回の記事」で紹介しているPlayCanvas Reactのライブラリでは既に対応をしているため、Reactベースのフロントエンドのコードからでも利用をすることができます。

import { Viewer } from "@playcanvas/blocks"

export function SplatViewerSogs() {
  return (
    <Viewer.Splat
      src={"https://example.com/meta.json"}
      className="h-screen w-full rounded-lg shadow-xl cursor-grab active:cursor-grabbing"
    >
      <Viewer.Controls className="bg-white/80 backdrop-blur-sm rounded-lg shadow-lg">
        <div className="flex gap-1 pointer-events-auto flex-grow ">
          <Viewer.FullScreenButton />
          <Viewer.DownloadButton />
        </div>
        <div className="flex gap-1 pointer-events-auto">
          <Viewer.CameraModeToggle />
          <Viewer.HelpButton />
          <Viewer.MenuButton />
        </div>
      </Viewer.Controls>
    </Viewer.Splat>
  )
}

埋め込まれているウェブサイトのソースコードも含めてこちらのリポジトリにデータを公開しておりますのでこちらをご覧ください。

まとめ

この圧縮技術は、個人的にかなり使いやすいと感じました。これまではデータ容量が大きいために扱いにくかったファイルサイズが劇的に小さくなることで、Webサイトなどでの共有が非常に手軽になったと思います。

また、PlayCanvasのSOGS対応には現時点がIssue立てられていて、PlayCanvasのGitHub Issue #7789によると、球面調和関数(Spherical Harmonics)を含む場合、GPUのメモリキャッシュ効率が低下しパフォーマンスが従来の圧縮PLY形式よりも低下することが あるようですが、今後改善も予定をされているようです。

参考リンク

質問や不明点がありましたら、X: はが @mxcn3までお気軽にお問い合わせください。