LichtFeld Studioで360度画像のまま3DGS生成

LichtFeld Studioなら360度カメラで撮影した全天球画像のまま3DGS (3D Gaussian Splatting ガウシアンスプラッティング) が出来てしまいます!

前後上下左右のキューブマップ化や8方向等に切り出して処理する必要なしです。
以下のようなシンプルなフローで3DGS生成出来てしまいました。

  1. Metashapeで360度画像 (全天球画像 Equirectangular) のまま写真位置推定
  2. アライメント結果をtransforms.jsonへ変換
  3. transforms.jsonと全天球画像一式をLichtFeld Studioで読み込み3DGS処理

以下に具体的な手順をまとめました。

Metashape編

Metashapeへ360°カメラの動画もしくは事前に連番画像化した360°画像を読み込む。

カメラキャリブレーションを開く。

読み込んだ360度画像を「スフェリカル/球」に設定する。

「写真のアライメント」を選択。

アライメントを実行する。

アライメントが完了したらずれがない事を確認する。

transforms.json作成編

transforms.jsonの作成方法はいくつかのアプローチがあります。

A) MetashapeからCOLMAPへ書き出し colmap2nerf.py でtransforms.jsonへ変換
B) Metashapeからxmlを書き出し agi2nerf でtransforms.jsonへ変換
C) Metashapeからxmlを書き出しnerfstudioの ns-process-data でtransforms.jsonへ変換
D) Metashaperaから直接transforms.jsonへ書き出すスクリプトを自作する (スクリプト実行にはMetashape Proが必要)

今回は私はDの手法を取ったので、A~Cの手法については未確認です。
全天球画像に対応したtransforms.jsonを作成するには上記ツールを変換してそのままではなくcamera_modelをEQUIRECTANGULARに設定しておく等の調整も必要になります。

"camera_model": "EQUIRECTANGULAR",

transforms.jsonのフォーマット詳細はこちら

Dのフローについては、自作したスクリプトを↓公開しました。

『Metashape Spherical to Transforms.json Converter』

https://github.com/lileaLab/metashape-spherical-to-transforms-json
※Claude Codeを用いて作成したものです

詳しい使い方はGitHubのREADMEに書きましたが、Metashapeでこのスクリプトを実行するのみです。
(Metashape上でスクリプトを実行するにはPro版が必要です)

上記GitHubから「metashape_spherical_to_transforms_json.py」をDL。

メニュー > ツール > スクリプト実行 を選択。

ダウンロードしたPythonスクリプトを選択し「OK」をクリック。

書き出し先を指定するとtransforms.jsonが書き出されます。

images:ここへ全天球画像を一式コピーして入れる

初期点群を使用する場合

同じフォルダに「pointcloud.ply」を入れておくとLichtFeld Studioが自動で初期点群として読み込んでくれます。

Metashapeで「ポイントクラウド構築」しておきこれを初期点群として使うのも便利。

マスクを使用する場合

同じフォルダに「masks」フォルダを作成し、images内の画像と対応した同じ名前同じサイズのマスク画像を入れておけばLichtFeld Studioがマスク画像として読み込んでくれます。

上記は全天球画像直下とスティッチング部分をマスクした画像の例。

LichtFeld Studio処理編

用意したデータ一式をLichtFeld Studioへ読み込みます。

全天球画像が読み込まれました。
全天球画像の中央に写る景色が正面の向く方向で空間に並びます。

GUTを有効にします。

全天球画像を処理するにはこの設定が必須です。

あとはいつも通りお好みでパラメーターを調整してトレーニングを実行です。